package elinps

import (
	"errors"
	"regexp"
	"strings"

	"e-li.nps/internal/contratos"
)

var emailRe = regexp.MustCompile(`^[^\s@]+@[^\s@]+\.[^\s@]+$`)

func normalizeEmail(s string) string {
	return strings.ToLower(strings.TrimSpace(s))
}

func ValidatePedidoInput(in *contratos.PedidoInput) error {
	in.ProdutoNome = strings.TrimSpace(in.ProdutoNome)
	in.InquilinoCodigo = strings.TrimSpace(in.InquilinoCodigo)
	in.InquilinoNome = strings.TrimSpace(in.InquilinoNome)
	in.UsuarioCodigo = strings.TrimSpace(in.UsuarioCodigo)
	in.UsuarioNome = strings.TrimSpace(in.UsuarioNome)
	in.UsuarioTelefone = strings.TrimSpace(in.UsuarioTelefone)
	in.UsuarioEmail = normalizeEmail(in.UsuarioEmail)

	if in.ProdutoNome == "" || len(in.ProdutoNome) > 64 {
		return errors.New("produto_nome invalido")
	}
	if in.InquilinoCodigo == "" || len(in.InquilinoCodigo) > 64 {
		return errors.New("inquilino_codigo invalido")
	}
	if in.InquilinoNome == "" || len(in.InquilinoNome) > 128 {
		return errors.New("inquilino_nome invalido")
	}
	if in.UsuarioCodigo == "" || len(in.UsuarioCodigo) > 64 {
		return errors.New("usuario_codigo invalido")
	}
	if in.UsuarioNome == "" || len(in.UsuarioNome) > 128 {
		return errors.New("usuario_nome invalido")
	}
	// E-mail passa a ser opcional: o controle de exibição é por
	// (produto + inquilino_codigo + usuario_codigo).
	if in.UsuarioEmail != "" {
		if len(in.UsuarioEmail) > 254 || !emailRe.MatchString(in.UsuarioEmail) {
			return errors.New("usuario_email invalido")
		}
	}
	if len(in.UsuarioTelefone) > 64 {
		return errors.New("usuario_telefone invalido")
	}
	return nil
}

func ValidatePatchInput(in *contratos.PatchInput) error {
	if in.Nota != nil {
		if *in.Nota < 1 || *in.Nota > 10 {
			return errors.New("nota invalida")
		}
	}
	if in.Justificativa != nil {
		j := strings.TrimSpace(*in.Justificativa)
		if len(j) > 2000 {
			return errors.New("justificativa muito longa")
		}
		*in.Justificativa = j
	}
	return nil
}
