/**
 * Agente responsável pelas regras de negócio e validação da exportação de remessas CNAB.
 * Centraliza a lógica que antes estava espalhada na View.
 */
export class CnabRemessaExportAgent {
  /**
   * Valida se os dados são suficientes para exportação
   * @param {Object} record - Registro da remessa ou dados parciais
   * @param {string} selectedBank - Banco selecionado no contexto
   * @param {string} paymentMode - Modo de pagamento (PIX/TED)
   * @returns {Object} { valid: boolean, errors: string[] }
   */
  validateExport(record, selectedBank, paymentMode) {
    const errors = [];
    
    // Validação básica de existência
    if (!record) {
        errors.push("Registro de remessa inválido ou nulo.");
        return { valid: false, errors };
    }

    const nRemessa = record.n_remessa || record.remessa;
    if (!nRemessa) {
        errors.push("Número da remessa não identificado.");
    }

    if (!paymentMode) {
        errors.push("Modo de pagamento (PIX/TED) não definido.");
    }

    // Validações específicas de regra de negócio poderiam vir aqui
    // Ex: Se for TED, banco é obrigatório? Se for PIX, chaves são validadas em outro lugar?
    
    return {
      valid: errors.length === 0,
      errors
    };
  }

  /**
   * Determina os parâmetros finais para a API (Banco e Tipo)
   * @returns {Object} { bank: string, type: string }
   */
  determineBankAndType(record, selectedBank, paymentMode) {
    // Normalização do Banco
    let bank = 'ITAU'; // Default seguro
    
    if (selectedBank) {
        bank = selectedBank.toUpperCase();
    } else if (record && record.banco) {
        // Tentativa de inferência se nada for passado
        const b = record.banco.toLowerCase();
        if (b.includes('itau')) bank = 'ITAU';
        else if (b.includes('santander')) bank = 'SANTANDER';
        else if (b.includes('bradesco')) bank = 'BRADESCO';
    }

    // Normalização do Tipo de Remessa
    // A API espera strings específicas como 'REMESSA_PIX' ou 'REMESSA_TED'
    let type = 'REMESSA_PIX';
    if (paymentMode === 'TED') {
        type = 'REMESSA_TED';
    }

    return { bank, type };
  }

  /**
   * Localiza o nome exato do arquivo físico numa lista de arquivos do servidor
   * @param {Object} filesList - Resposta da API contendo array 'conteudo' ou 'arquivos'
   * @param {string} type - Tipo calculado (apenas para log/contexto)
   * @param {string|number} nRemessa - Número da remessa para busca
   * @returns {string|null} Nome do arquivo completo ou null
   */
  findFilenameInList(filesList, type, nRemessa) {
    // Suporta dois formatos de resposta:
    // 1. { conteudo: [...] } - formato antigo
    // 2. Array direto de arquivos - formato novo
    let arquivos = [];
    
    if (Array.isArray(filesList)) {
      arquivos = filesList;
    } else if (filesList?.conteudo && Array.isArray(filesList.conteudo)) {
      arquivos = filesList.conteudo;
    } else if (filesList?.arquivos && Array.isArray(filesList.arquivos)) {
      arquivos = filesList.arquivos;
    } else {
      console.warn('[CnabRemessaExportAgent] Lista de arquivos inválida ou vazia.');
      return null;
    }

    if (arquivos.length === 0) {
      console.warn('[CnabRemessaExportAgent] Nenhum arquivo na lista.');
      return null;
    }

    // Normaliza para string para busca segura
    const searchTarget = String(nRemessa).trim();
    
    // Remove zeros à esquerda para busca mais flexível
    // Ex: "0000241" pode estar em "CB237_0000241.REM" ou "CI240_001_0000241.REM"
    const searchTargetNoZeros = searchTarget.replace(/^0+/, '') || '0';
    
    // Algoritmo de busca "Best Match"
    // Busca arquivos que contém o número da remessa (com ou sem zeros à esquerda)
    const matches = arquivos.filter(filename => {
      const filenameStr = String(filename);
      // Busca pelo número completo ou sem zeros à esquerda
      return filenameStr.includes(searchTarget) || 
             filenameStr.includes(searchTargetNoZeros) ||
             filenameStr.includes(searchTarget.padStart(7, '0')); // Pad com zeros à esquerda
    });

    if (matches.length === 0) {
      console.warn(`[CnabRemessaExportAgent] Nenhum arquivo encontrado para remessa ${nRemessa}`);
      console.log('   - Arquivos disponíveis:', arquivos.slice(0, 5));
      return null;
    }

    // Se houver mais de um, pega o primeiro match encontrado
    // (em produção, poderia ordenar por data se disponível)
    if (matches.length > 1) {
        console.log(`[CnabRemessaExportAgent] Múltiplos arquivos encontrados para remessa ${nRemessa}:`, matches);
        console.log(`   - Usando: ${matches[0]}`);
    }

    // Retorna o nome COMPLETO do arquivo (ex: "CB237_0000598.REM" ou "CI240_001_0000241.REM")
    return matches[0];
  }
}
