package validation

import (
	"GoMembership/internal/models"
	"GoMembership/internal/repositories"

	"github.com/go-playground/validator/v10"
)

// ValidateNewSubscription validates a new subscription model being created
func ValidateSubscription(sl validator.StructLevel) {
	subscription := sl.Current().Interface().(models.SubscriptionModel)

	if subscription.Name == "" {
		sl.ReportError(subscription.Name, "Name", "name", "required", "")
	}

	if sl.Parent().Type().Name() == "MembershipData" {
		// This is modifying a subscription directly
		if subscription.Details == "" {
			sl.ReportError(subscription.Details, "Details", "details", "required", "")
		}

		if subscription.MonthlyFee < 0 {
			sl.ReportError(subscription.MonthlyFee, "MonthlyFee", "monthly_fee", "gte", "0")
		}

		if subscription.HourlyRate < 0 {
			sl.ReportError(subscription.HourlyRate, "HourlyRate", "hourly_rate", "gte", "0")
		}

		if subscription.IncludedPerYear < 0 {
			sl.ReportError(subscription.IncludedPerYear, "IncludedPerYear", "included_hours_per_year", "gte", "0")
		}

		if subscription.IncludedPerMonth < 0 {
			sl.ReportError(subscription.IncludedPerMonth, "IncludedPerMonth", "included_hours_per_month", "gte", "0")
		}
	} else {
		// This is a nested probably user struct. We are only checking if the model exists
		existingSubscription, err := repositories.GetSubscriptionByName(&subscription.Name)
		if err != nil || existingSubscription == nil {
			sl.ReportError(subscription.Name, "Subscription_Name", "name", "exists", "")
		}
	}
}
