package promotion

import (
	"github.com/pingcap/dbaas/billing2/config"
	"github.com/pingcap/dbaas/billing2/forms"
	"github.com/pingcap/dbaas/billing2/utils/log"
	"github.com/shopspring/decimal"
	"go.uber.org/zap"
)

// RewardCommunityPayment is triggered by an invoice-paid event.
// It grants the paying tenant a reward equal to communityRewardRate (default 3%) of the paid amount,
// but only if the tenant was referred (has a signup referral event).
func RewardCommunityPayment(data *forms.InvoicePaidEvent) {
	log.Info("promotion: RewardCommunityPayment called",
		zap.Uint("tenantID", data.TenantID),
		zap.String("paidAmount", data.PaidAmount.String()))

	// Only reward referred users (those who have a signup referral event)
	_, err := referralModel.FindReferralCodeBySignupEvent(data.TenantID)
	if err != nil {
		log.Info("promotion: RewardCommunityPayment skipped, not a referred user",
			zap.Uint("tenantID", data.TenantID))
		return
	}

	rate := decimal.NewFromFloat(config.Get().GetFloat64(config.CommunityRewardRate))
	rewardAmount := data.PaidAmount.Mul(rate).Round(2)

	if rewardAmount.LessThanOrEqual(decimal.Zero) {
		log.Info("promotion: RewardCommunityPayment skipped, reward amount <= 0",
			zap.Uint("tenantID", data.TenantID),
			zap.String("rate", rate.String()),
			zap.String("paidAmount", data.PaidAmount.String()))
		return
	}

	log.Info("promotion: RewardCommunityPayment triggering reward",
		zap.Uint("tenantID", data.TenantID),
		zap.String("paidAmount", data.PaidAmount.String()),
		zap.String("rate", rate.String()),
		zap.String("rewardAmount", rewardAmount.String()))

	err = referralModel.TriggerCommunityReward(data.TenantID, rewardAmount)
	if err != nil {
		log.Error("promotion: RewardCommunityPayment failed",
			zap.Uint("tenantID", data.TenantID),
			zap.Error(err))
	}
}
