package order

import "github.com/perfect-panel/server/internal/types"

// getDiscount returns the discount factor for the given quantity.
//
//   - New user: pick the tier with the lowest discount value (biggest saving).
//   - Non-new user: pick the tier with the highest discount value (least saving / closest to full price).
func getDiscount(discounts []types.SubscribeDiscount, inputMonths int64, isNewUser bool) float64 {
	best := float64(-1)
	for _, d := range discounts {
		if d.Quantity != inputMonths || d.Discount <= 0 || d.Discount >= 100 {
			continue
		}
		if d.NewUserOnly && !isNewUser {
			continue
		}
		if isNewUser {
			// lowest discount value = biggest saving
			if best < 0 || d.Discount < best {
				best = d.Discount
			}
		} else {
			// highest discount value = least saving (closest to original price)
			if best < 0 || d.Discount > best {
				best = d.Discount
			}
		}
	}
	if best < 0 {
		return 1
	}
	return best / float64(100)
}

// isNewUserOnlyForQuantity checks whether the matched discount tier has new_user_only enabled.
// Returns true only when all matching tiers for the given quantity require new-user status
// (i.e. no fallback tier with new_user_only=false exists). When both a new-user-only tier
// and a general tier exist for the same quantity, non-new-users can still purchase via the
// general tier, so this returns false.
func isNewUserOnlyForQuantity(discounts []types.SubscribeDiscount, inputQuantity int64) bool {
	hasNewUserOnly := false
	hasFallback := false
	for _, d := range discounts {
		if d.Quantity != inputQuantity {
			continue
		}
		if d.NewUserOnly {
			hasNewUserOnly = true
		} else {
			hasFallback = true
		}
	}
	return hasNewUserOnly && !hasFallback
}
