package graphql

import (
	"errors"
	"fmt"
	"strings"
	"tercul/internal/domain"

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

// The 'validate' variable is declared in binding.go and is used here.

// Validate performs validation on a struct using the validator library.
func Validate(s interface{}) error {
	err := validate.Struct(s)
	if err == nil {
		return nil
	}

	var validationErrors validator.ValidationErrors
	if errors.As(err, &validationErrors) {
		var errorMessages []string
		for _, err := range validationErrors {
			// Customize error messages here if needed.
			errorMessages = append(errorMessages, fmt.Sprintf("field '%s' failed on the '%s' tag", err.Field(), err.Tag()))
		}
		return fmt.Errorf("%w: %s", domain.ErrValidation, strings.Join(errorMessages, "; "))
	}

	// For other unexpected errors, like invalid validation input.
	return fmt.Errorf("unexpected error during validation: %w", err)
}