package order

import (
	"context"
	"math"

	commonLogic "github.com/perfect-panel/server/internal/logic/common"
	"github.com/perfect-panel/server/internal/svc"
	"github.com/perfect-panel/server/internal/types"
)

type orderPriceResult struct {
	OriginalPrice  int64
	PayableBase    int64
	DiscountAmount int64
	PromoRuleId    int64
	PromoDiscount  int64
	PromoPrice     int64
}

func calculatePurchasePrice(
	ctx context.Context,
	svcCtx *svc.ServiceContext,
	userID int64,
	subscribeID int64,
	unitPrice int64,
	quantity int64,
	discounts []types.SubscribeDiscount,
	eligibleForDiscount bool,
	isFirstPurchase bool,
) (*orderPriceResult, error) {
	originalPrice := unitPrice * quantity
	result := &orderPriceResult{
		OriginalPrice: originalPrice,
		PayableBase:   originalPrice,
	}

	promoResult, err := commonLogic.EvaluatePromo(ctx, svcCtx, userID, subscribeID, quantity, isFirstPurchase)
	if err != nil {
		return nil, err
	}
	if promoResult != nil && promoResult.Eligible && promoResult.PromoPrice < originalPrice {
		result.PayableBase = promoResult.PromoPrice
		result.PromoRuleId = promoResult.RuleID
		result.PromoDiscount = originalPrice - result.PayableBase
		result.PromoPrice = promoResult.PromoPrice
		if result.PromoDiscount < 0 {
			result.PromoDiscount = 0
		}
		return result, nil
	}

	discount := float64(1)
	if len(discounts) > 0 {
		discount = getDiscount(discounts, quantity, eligibleForDiscount)
	}
	result.PayableBase = int64(math.Round(float64(originalPrice) * discount))
	result.DiscountAmount = originalPrice - result.PayableBase
	return result, nil
}
