/**
 * Configurações de localização para Guiné-Bissau
 * Compatível com backend (application.yml)
 */

export const LOCALE_CONFIG = {
  country: 'Guiné-Bissau',
  countryCode: 'GW',
  currency: 'XOF', // Franco CFA da África Ocidental
  currencySymbol: 'FCFA',
  timezone: 'Africa/Bissau',
  locale: 'pt-GW', // Português da Guiné-Bissau
  dateFormat: 'DD/MM/YYYY',
  dateTimeFormat: 'DD/MM/YYYY HH:mm',
  phoneCode: '+245',
};

/**
 * Formata valor monetário no formato da Guiné-Bissau (XOF - Franco CFA)
 * @param value - Valor numérico a ser formatado
 * @param options - Opções de formatação (compact, decimals)
 * @returns String formatada no formato XOF (ex: "1 000 FCFA" ou "1,0 M FCFA" para milhões)
 */
export function formatCurrency(
  value: number,
  options?: {
    compact?: boolean;
    decimals?: number;
  }
): string {
  const { compact = false, decimals = 0 } = options || {};
  
  if (compact) {
    // Formatação compacta manual para evitar símbolos incorretos
    let formattedNumber: string;
    let suffix = '';
    
    if (value >= 1_000_000_000) {
      // Bilhões
      const billions = value / 1_000_000_000;
      formattedNumber = new Intl.NumberFormat('pt-GW', {
        minimumFractionDigits: decimals,
        maximumFractionDigits: 1,
      }).format(billions);
      suffix = ' B';
    } else if (value >= 1_000_000) {
      // Milhões
      const millions = value / 1_000_000;
      formattedNumber = new Intl.NumberFormat('pt-GW', {
        minimumFractionDigits: decimals,
        maximumFractionDigits: 1,
      }).format(millions);
      suffix = ' M';
    } else if (value >= 1_000) {
      // Milhares
      const thousands = value / 1_000;
      formattedNumber = new Intl.NumberFormat('pt-GW', {
        minimumFractionDigits: decimals,
        maximumFractionDigits: 1,
      }).format(thousands);
      suffix = ' K';
    } else {
      // Menor que 1000
      formattedNumber = new Intl.NumberFormat('pt-GW', {
        minimumFractionDigits: decimals,
        maximumFractionDigits: decimals,
      }).format(value);
    }
    
    return `${formattedNumber}${suffix} FCFA`;
  } else {
    // Formatação padrão (sem compact)
    const numberFormatter = new Intl.NumberFormat('pt-GW', {
      minimumFractionDigits: decimals,
      maximumFractionDigits: decimals,
    });
    
    const formattedNumber = numberFormatter.format(value);
    return `${formattedNumber} FCFA`;
  }
}

/**
 * Formata número no formato da Guiné-Bissau
 * @param value - Valor numérico a ser formatado
 * @param decimals - Número de casas decimais (padrão: 2)
 * @returns String formatada (ex: "1 000,00" ou "1.234,56")
 */
export function formatNumber(value: number, decimals: number = 0): string {
  return new Intl.NumberFormat('pt-GW', {
    minimumFractionDigits: decimals,
    maximumFractionDigits: decimals,
  }).format(value);
}

/**
 * Formata data no formato DD/MM/YYYY (Guiné-Bissau)
 * @param date - Data (Date object ou string ISO)
 * @returns String formatada (ex: "28/12/2024")
 */
export function formatDate(date: Date | string): string {
  const d = typeof date === 'string' ? new Date(date) : date;
  return new Intl.DateTimeFormat('pt-GW', {
    day: '2-digit',
    month: '2-digit',
    year: 'numeric',
    timeZone: LOCALE_CONFIG.timezone,
  }).format(d);
}

/**
 * Formata data e hora no formato DD/MM/YYYY HH:mm (Guiné-Bissau)
 * @param date - Data (Date object ou string ISO)
 * @returns String formatada (ex: "28/12/2024 14:30")
 */
export function formatDateTime(date: Date | string): string {
  const d = typeof date === 'string' ? new Date(date) : date;
  return new Intl.DateTimeFormat('pt-GW', {
    day: '2-digit',
    month: '2-digit',
    year: 'numeric',
    hour: '2-digit',
    minute: '2-digit',
    timeZone: LOCALE_CONFIG.timezone,
  }).format(d);
}

/**
 * Formata telefone no formato da Guiné-Bissau (+245 XXX XXX XXX)
 * @param phone - Número de telefone (com ou sem código do país)
 * @returns String formatada (ex: "+245 955 123 456")
 */
export function formatPhone(phone: string): string {
  // Remove caracteres não numéricos
  const cleaned = phone.replace(/\D/g, '');
  
  // Se começa com 245, adiciona +
  if (cleaned.startsWith('245')) {
    return `+${cleaned.slice(0, 3)} ${cleaned.slice(3, 6)} ${cleaned.slice(6, 9)} ${cleaned.slice(9)}`;
  }
  
  // Se não tem código do país, adiciona
  if (cleaned.length === 9) {
    return `+245 ${cleaned.slice(0, 3)} ${cleaned.slice(3, 6)} ${cleaned.slice(6)}`;
  }
  
  return phone;
}

/**
 * Parse LocalDate string (YYYY-MM-DD) para Date object
 * @param dateString - String no formato YYYY-MM-DD
 * @returns Date object
 */
export function parseLocalDate(dateString: string): Date {
  return new Date(dateString + 'T00:00:00');
}

/**
 * Formata LocalDate string (YYYY-MM-DD) para formato de exibição DD/MM/YYYY
 * @param dateString - String no formato YYYY-MM-DD (vindo do backend)
 * @returns String formatada DD/MM/YYYY
 */
export function formatLocalDate(dateString: string): string {
  if (!dateString) return '';
  return formatDate(parseLocalDate(dateString));
}
