package validator

import (
	"errors"
	"strings"

	"apskel-pos-be/internal/constants"
	"apskel-pos-be/internal/contract"

	"github.com/google/uuid"
)

type ProductVariantValidator interface {
	ValidateCreateProductVariantRequest(req *contract.CreateProductVariantRequest) (error, string)
	ValidateUpdateProductVariantRequest(req *contract.UpdateProductVariantRequest) (error, string)
}

type ProductVariantValidatorImpl struct{}

func NewProductVariantValidator() *ProductVariantValidatorImpl {
	return &ProductVariantValidatorImpl{}
}

func (v *ProductVariantValidatorImpl) ValidateCreateProductVariantRequest(req *contract.CreateProductVariantRequest) (error, string) {
	if req == nil {
		return errors.New("request body is required"), constants.MissingFieldErrorCode
	}

	if req.ProductID == uuid.Nil {
		return errors.New("product_id is required"), constants.MissingFieldErrorCode
	}

	if strings.TrimSpace(req.Name) == "" {
		return errors.New("name is required"), constants.MissingFieldErrorCode
	}

	if len(req.Name) < 1 || len(req.Name) > 255 {
		return errors.New("name must be between 1 and 255 characters"), constants.MalformedFieldErrorCode
	}

	return nil, ""
}

func (v *ProductVariantValidatorImpl) ValidateUpdateProductVariantRequest(req *contract.UpdateProductVariantRequest) (error, string) {
	if req == nil {
		return errors.New("request body is required"), constants.MissingFieldErrorCode
	}

	// At least one field should be provided for update
	if req.Name == nil && req.PriceModifier == nil && req.Metadata == nil {
		return errors.New("at least one field must be provided for update"), constants.MissingFieldErrorCode
	}

	if req.Name != nil {
		if strings.TrimSpace(*req.Name) == "" {
			return errors.New("name cannot be empty"), constants.MalformedFieldErrorCode
		}
		if len(*req.Name) < 1 || len(*req.Name) > 255 {
			return errors.New("name must be between 1 and 255 characters"), constants.MalformedFieldErrorCode
		}
	}

	return nil, ""
}
