/**
 * 🎯 PhoneFormatter - Utilitário para Formatação de Telefones Brasileiros
 * 
 * Formata números de telefone brasileiro com máscara apropriada
 * Pode ser usado em qualquer componente, service ou pipe do sistema
 * 
 * ## 🚀 Como usar:
 * 
 * ```typescript
 * import { PhoneFormatter } from '../../shared/utils/phone-formatter.util';
 * 
 * // Em um component
 * const formatted = PhoneFormatter.format('11999887766');
 * // Resultado: "(11) 99988-7766"
 * 
 * // Em uma coluna de tabela
 * {
 *   field: "phone",
 *   header: "Telefone",
 *   label: (phone: any) => PhoneFormatter.format(phone)
 * }
 * ```
 */

export class PhoneFormatter {
  
  /**
   * Formata número de telefone brasileiro com máscara
   * 
   * @param phone - Número de telefone (string ou number)
   * @returns Telefone formatado ou '-' se inválido
   * 
   * ## Exemplos:
   * - `11999887766` → `(11) 99988-7766` (celular)
   * - `1133334444` → `(11) 3333-4444` (fixo)
   * - `11987654321` → `(11) 98765-4321` (celular 9 dígitos)
   * - `null` → `-`
   * - `''` → `-`
   */
  static format(phone: any): string {
    // ✅ Verificação de segurança para valores null/undefined/vazios
    if (!phone || phone === null || phone === undefined) {
      return '-';
    }
    
    // Remove todos os caracteres não numéricos
    const digits = phone.toString().replace(/\D/g, '');
    
    // Se não tem dígitos suficientes, retorna como está ou traço
    if (digits.length < 8) {
      return digits || '-';
    }
    
    // Formatação baseada na quantidade de dígitos
    if (digits.length === 10) {
      // Telefone fixo: (11) 3333-4444
      return `(${digits.slice(0, 2)}) ${digits.slice(2, 6)}-${digits.slice(6)}`;
    } else if (digits.length === 11) {
      // Celular: (11) 99988-7766
      return `(${digits.slice(0, 2)}) ${digits.slice(2, 7)}-${digits.slice(7)}`;
    } else if (digits.length === 8) {
      // Telefone sem DDD: 3333-4444
      return `${digits.slice(0, 4)}-${digits.slice(4)}`;
    } else if (digits.length === 9) {
      // Celular sem DDD: 99988-7766
      return `${digits.slice(0, 5)}-${digits.slice(5)}`;
    }
    
    // Se não se encaixa em nenhum padrão, retorna os dígitos
    return digits;
  }

  /**
   * Remove formatação do telefone, deixando apenas números
   * 
   * @param phone - Telefone formatado
   * @returns Apenas os dígitos
   * 
   * ## Exemplo:
   * - `(11) 99988-7766` → `11999887766`
   */
  static unformat(phone: string): string {
    if (!phone) return '';
    return phone.replace(/\D/g, '');
  }

  /**
   * Valida se o telefone tem formato brasileiro válido
   * 
   * @param phone - Telefone para validar
   * @returns true se válido, false caso contrário
   * 
   * ## Exemplos válidos:
   * - `11999887766` (celular com DDD)
   * - `1133334444` (fixo com DDD)
   * - `99988-7766` (celular sem DDD)
   * - `3333-4444` (fixo sem DDD)
   */
  static isValid(phone: any): boolean {
    if (!phone) return false;
    
    const digits = phone.toString().replace(/\D/g, '');
    
    // Aceita telefones com 8, 9, 10 ou 11 dígitos
    return [8, 9, 10, 11].includes(digits.length);
  }

  /**
   * Detecta o tipo do telefone
   * 
   * @param phone - Telefone para analisar
   * @returns Tipo do telefone
   */
  static getType(phone: any): 'mobile' | 'landline' | 'unknown' {
    if (!phone) return 'unknown';
    
    const digits = phone.toString().replace(/\D/g, '');
    
    if (digits.length === 11) {
      // Com DDD, verifica se o primeiro dígito após DDD é 9 (celular)
      return digits[2] === '9' ? 'mobile' : 'landline';
    } else if (digits.length === 10) {
      // Com DDD, sem 9 inicial = fixo
      return 'landline';
    } else if (digits.length === 9) {
      // Sem DDD, 9 dígitos = celular
      return 'mobile';
    } else if (digits.length === 8) {
      // Sem DDD, 8 dígitos = fixo
      return 'landline';
    }
    
    return 'unknown';
  }
} 