import type { CheckoutFormData } from "@/types/commerce";
import {
  isValidCep,
  isValidCnpj,
  isValidCpf,
  isValidEmail,
  isValidPhone,
} from "@/utils/brDocuments";

export type StepValidationResult = { ok: true } | { ok: false; message: string };

export function validateAccountStep(form: CheckoutFormData): StepValidationResult {
  const { account } = form;
  if (!account.name.trim() || account.name.trim().length < 3) {
    return { ok: false, message: "Informe seu nome completo." };
  }
  if (!isValidEmail(account.email)) {
    return { ok: false, message: "Informe um e-mail válido." };
  }
  if (!isValidPhone(account.phone)) {
    return { ok: false, message: "Informe um telefone com DDD (10 ou 11 dígitos)." };
  }
  if (account.password.length < 8) {
    return { ok: false, message: "A senha deve ter no mínimo 8 caracteres." };
  }
  if (account.password !== account.confirmPassword) {
    return { ok: false, message: "As senhas não coincidem." };
  }
  return { ok: true };
}

function validateAddress(address: CheckoutFormData["address"]): StepValidationResult {
  if (!isValidCep(address.cep)) {
    return { ok: false, message: "Informe um CEP válido." };
  }
  if (!address.street.trim()) {
    return { ok: false, message: "Informe o logradouro." };
  }
  if (!address.number.trim()) {
    return { ok: false, message: "Informe o número." };
  }
  if (!address.district.trim()) {
    return { ok: false, message: "Informe o bairro." };
  }
  if (!address.city.trim()) {
    return { ok: false, message: "Informe a cidade." };
  }
  if (!address.state) {
    return { ok: false, message: "Selecione o estado (UF)." };
  }
  return { ok: true };
}

export function validatePersonStep(form: CheckoutFormData): StepValidationResult {
  if (form.personType === "pf") {
    if (!isValidCpf(form.pf.cpf)) {
      return { ok: false, message: "Informe um CPF válido." };
    }
    if (!form.pf.birthDate) {
      return { ok: false, message: "Informe a data de nascimento." };
    }
  } else {
    if (!isValidCnpj(form.pj.cnpj)) {
      return { ok: false, message: "Informe um CNPJ válido." };
    }
    if (!form.pj.legalName.trim()) {
      return { ok: false, message: "Informe a razão social." };
    }
    if (!form.pj.tradeName.trim()) {
      return { ok: false, message: "Informe o nome fantasia." };
    }
    if (!form.pj.stateRegistration.trim()) {
      return { ok: false, message: "Informe a inscrição estadual ou ISENTO." };
    }
  }

  return validateAddress(form.address);
}
