/**
 * Utilitários para validação e formatação de documentos brasileiros
 */

// Validação de CPF
export function validateCPF(cpf: string): boolean {
  const cleanCPF = cpf.replace(/\D/g, '');
  
  if (cleanCPF.length !== 11 || /^(\d)\1{10}$/.test(cleanCPF)) {
    return false;
  }

  let sum = 0;
  let remainder;

  for (let i = 1; i <= 9; i++) {
    sum += parseInt(cleanCPF.substring(i - 1, i)) * (11 - i);
  }

  remainder = (sum * 10) % 11;
  if (remainder === 10 || remainder === 11) remainder = 0;
  if (remainder !== parseInt(cleanCPF.substring(9, 10))) return false;

  sum = 0;
  for (let i = 1; i <= 10; i++) {
    sum += parseInt(cleanCPF.substring(i - 1, i)) * (12 - i);
  }

  remainder = (sum * 10) % 11;
  if (remainder === 10 || remainder === 11) remainder = 0;
  if (remainder !== parseInt(cleanCPF.substring(10, 11))) return false;

  return true;
}

// Validação de CNPJ
export function validateCNPJ(cnpj: string): boolean {
  const cleanCNPJ = cnpj.replace(/\D/g, '');
  
  if (cleanCNPJ.length !== 14 || /^(\d)\1{13}$/.test(cleanCNPJ)) {
    return false;
  }

  let size = cleanCNPJ.length - 2;
  let numbers = cleanCNPJ.substring(0, size);
  const digits = cleanCNPJ.substring(size);
  let sum = 0;
  let pos = size - 7;

  for (let i = size; i >= 1; i--) {
    sum += parseInt(numbers.charAt(size - i)) * pos--;
    if (pos < 2) pos = 9;
  }

  let result = sum % 11 < 2 ? 0 : 11 - (sum % 11);
  if (result !== parseInt(digits.charAt(0))) return false;

  size = size + 1;
  numbers = cleanCNPJ.substring(0, size);
  sum = 0;
  pos = size - 7;

  for (let i = size; i >= 1; i--) {
    sum += parseInt(numbers.charAt(size - i)) * pos--;
    if (pos < 2) pos = 9;
  }

  result = sum % 11 < 2 ? 0 : 11 - (sum % 11);
  if (result !== parseInt(digits.charAt(1))) return false;

  return true;
}

// Máscara para CPF
export function maskCPF(cpf: string): string {
  const cleanCPF = cpf.replace(/\D/g, '');
  
  if (cleanCPF.length <= 3) {
    return cleanCPF;
  } else if (cleanCPF.length <= 6) {
    return cleanCPF.replace(/(\d{3})(\d+)/, '$1.$2');
  } else if (cleanCPF.length <= 9) {
    return cleanCPF.replace(/(\d{3})(\d{3})(\d+)/, '$1.$2.$3');
  } else {
    return cleanCPF.replace(/(\d{3})(\d{3})(\d{3})(\d+)/, '$1.$2.$3-$4');
  }
}

// Máscara para CNPJ
export function maskCNPJ(cnpj: string): string {
  const cleanCNPJ = cnpj.replace(/\D/g, '');
  
  if (cleanCNPJ.length <= 2) {
    return cleanCNPJ;
  } else if (cleanCNPJ.length <= 5) {
    return cleanCNPJ.replace(/(\d{2})(\d+)/, '$1.$2');
  } else if (cleanCNPJ.length <= 8) {
    return cleanCNPJ.replace(/(\d{2})(\d{3})(\d+)/, '$1.$2.$3');
  } else if (cleanCNPJ.length <= 12) {
    return cleanCNPJ.replace(/(\d{2})(\d{3})(\d{3})(\d+)/, '$1.$2.$3/$4');
  } else {
    return cleanCNPJ.replace(/(\d{2})(\d{3})(\d{3})(\d{4})(\d+)/, '$1.$2.$3/$4-$5');
  }
}

// Máscara para telefone/WhatsApp brasileiro
export function maskPhone(phone: string): string {
  const cleanPhone = phone.replace(/\D/g, '');
  
  if (cleanPhone.length <= 2) {
    return cleanPhone;
  } else if (cleanPhone.length <= 6) {
    return cleanPhone.replace(/(\d{2})(\d+)/, '($1) $2');
  } else if (cleanPhone.length <= 10) {
    return cleanPhone.replace(/(\d{2})(\d{4})(\d+)/, '($1) $2-$3');
  } else {
    return cleanPhone.replace(/(\d{2})(\d{5})(\d+)/, '($1) $2-$3');
  }
}

// Máscara para CEP
export function maskCEP(cep: string): string {
  const cleanCEP = cep.replace(/\D/g, '');
  
  if (cleanCEP.length <= 5) {
    return cleanCEP;
  } else {
    return cleanCEP.replace(/(\d{5})(\d+)/, '$1-$2');
  }
}

// Função para detectar e aplicar máscara automática
export function applyDocumentMask(value: string, type: 'cpf' | 'cnpj' | 'auto' = 'auto'): string {
  const cleanValue = value.replace(/\D/g, '');
  
  if (type === 'cpf' || (type === 'auto' && cleanValue.length <= 11)) {
    return maskCPF(cleanValue);
  } else {
    return maskCNPJ(cleanValue);
  }
}

// Função para validar documento baseado no tipo
export function validateDocument(document: string, type: 'pf' | 'pj'): boolean {
  const cleanDocument = document.replace(/\D/g, '');
  
  if (type === 'pf') {
    return validateCPF(cleanDocument);
  } else {
    return validateCNPJ(cleanDocument);
  }
}