<?php declare(strict_types=1);

class Sinistro2_Service_ImportarIndenizacaoAgro
{
    const TITLES = [
        'id_sinistro_seguradora' => 'Sinistro Essor',
        'id_liquidacao' => 'Liquidação',
        'id_processo' => 'Processo Agro',
        'id_proposta' => 'Proposta',
        'nr_apolice' => 'Apólice',
        'ds_nome_proponente' => 'Segurado',
        'cpf_cnpj' => 'CPF/CNPJ',
        'ds_nome_abreviado' => 'Corretor',
        'vl_indenizacao' => 'Valor Estimado de Indenização',
        'ds_status' => 'Status',
        'ds_nome_produto' => 'Produto',
        'ds_nome_safra' => 'Safra',
        'ds_nome_municipio' => 'Município',
        'ds_sigla' => 'UF',
        'tp_liquidacao' => 'Tipo',
        'dt_base_pagamento' => 'Dt. Base Pagamento',
        'dt_encerramento_colheita' => 'Dt. Encerramento Colheita',
        'ds_nome_beneficiario_1' => 'Beneficiário 1 Nome',
        'ds_cpf_cnpj_beneficiario_1' => 'Beneficiário 1 CPF/CNPJ',
        'ds_valor_beneficiario_1' => 'Beneficiário 1 Valor',
        'nu_conta_corrente_1' => 'Conta',
        'nu_digito_conta_corrente_1' => 'Digito',
        'nu_agencia_1' => 'Agência',
        'nu_digito_agencia_1' => 'Digito',
        'nr_banco_1' => 'Número Banco',
        'nr_tipo_conta_1' => 'Tipo de Conta',
        'ds_nome_beneficiario_2' => 'Beneficiário 2 Nome',
        'ds_cpf_cnpj_beneficiario_2' => 'Beneficiário 2 CPF/CNPJ',
        'ds_valor_beneficiario_2' => 'Beneficiário 2 Valor',
        'nu_conta_corrente_2' => 'Conta',
        'nu_digito_conta_corrente_2' => 'Digito',
        'nu_agencia_2' => 'Agência',
        'nu_digito_agencia_2' => 'Digito',
        'nr_banco_2' => 'Número Banco',
        'nr_tipo_conta_2' => 'Tipo de Conta',
        'ds_nome_beneficiario_3' => 'Beneficiário 3 Nome',
        'ds_cpf_cnpj_beneficiario_3' => 'Beneficiário 3 CPF/CNPJ',
        'ds_valor_beneficiario_3' => 'Beneficiário 3 Valor',
        'nu_conta_corrente_3' => 'Conta',
        'nu_digito_conta_corrente_3' => 'Digito',
        'nu_agencia_3' => 'Agência',
        'nu_digito_agencia_3' => 'Digito',
        'nr_banco_3' => 'Número Banco',
        'nr_tipo_conta_3' => 'Tipo de Conta',
        'data_agendamento' => 'Data Agendamento'
    ];

    public function execute(
        array $idsLiquidacoes,
        ?array $antecipacoes = null,
        ?int $idRelatorioIndenizacaoAgroAnterior = null
    ) {
        list($dataBaseInicio, $dataBaseFim) = (new Sinistro2_Model_RelatorioImportacaoIndenizacao)
            ->getDataBasesByIdLiquidacoes($idsLiquidacoes);

        $rs = (new Relatorio_Model_Sinistro())->importacaoIndenizacaoAgro(
            $idsLiquidacoes,
            $dataBaseInicio,
            $dataBaseFim,
            !empty($idRelatorioIndenizacaoAgroAnterior)
        );
        
        if (empty($rs)) {
            throw new Exception('Nenhum registro encotrado para o período informado.', 1);
        }
        
        if (!empty($antecipacoes)) {
            $idsLiquidacoesAntecipacoes = '';
            $relatorioLiquidacoesAntecipacaoPagamento =  (new Relatorio_Model_Sinistro())->getLiquidacoesDeAntecipacoes($antecipacoes);

            if ($relatorioLiquidacoesAntecipacaoPagamento) {
                $relatorioLiquidacoesAntecipacaoPagamento = $this->excluirIdsJaExistentes($rs, $relatorioLiquidacoesAntecipacaoPagamento);
                $rs = array_merge($rs, $relatorioLiquidacoesAntecipacaoPagamento);
            }

            $separador = '';
            foreach($antecipacoes as $a) {
                $idsLiquidacoesAntecipacoes .= "{$separador} {$a['id_liquidacao']}";
                $separador = ',';
            }
        }

        $idStatusLiquidacaoAguardandoPagamento = (new Sistema_Model_Status())->getIdStatus('AGUARDANDO_PAGAMENTO', 'LIQUIDACOES');
        $idStatusLiquidacaoIndenizacaoPaga = (new Sistema_Model_Status())->getIdStatus('INDENIZACAO_PAGA', 'LIQUIDACOES');

        $idsLiquidacoes = $idsLiquidacoesAtualizarStatus = [];
        foreach ($rs as $row) {
            if (
                $row['id_status_liquidacao'] != $idStatusLiquidacaoAguardandoPagamento
                && $row['id_status_liquidacao'] != $idStatusLiquidacaoIndenizacaoPaga
            ) {
                $idsLiquidacoesAtualizarStatus[$row['id_liquidacao']] = $row['id_liquidacao'];
            }

            $idsLiquidacoes[$row['id_liquidacao']] = $row['id_liquidacao'];
        }
        
        if (!empty($idsLiquidacoes)) {
            $serviceMontaRelatiroLiquidacao = new Relatorio_Service_Montarelatorioliquidacao();
            $rs = $serviceMontaRelatiroLiquidacao->executa($rs, true, $idsLiquidacoes);
            
            $dataBaseInicio = DateTime::createFromFormat('Y-m-d', $dataBaseInicio)->format('Ymd');
            $dataBaseFim = DateTime::createFromFormat('Y-m-d', $dataBaseFim)->format('Ymd');
            
            list($filename, $fullPath) = $this->salvarArquivo($dataBaseInicio, $dataBaseFim);
           
            $idRelatorio = (new Sinistro2_Model_RelatorioImportacaoIndenizacao())->save([
                'dt_base_inicial' => $dataBaseInicio,
                'dt_base_final' => $dataBaseFim,
                'ds_nome_arquivo' => $filename,
                'ds_incluiu_antecipacoes' => !empty($antecipacoes),
                'ds_ids_liquidacoes_antecipacoes' => (!empty($idsLiquidacoesAntecipacoes))
                    ? $idsLiquidacoesAntecipacoes
                    : ''
            ]);
            
            (new Sinistro2_Model_Liquidacoes())->atualizarStatusLiquidacoesImportacaoIndenizacao(
                $idsLiquidacoes,
                $idsLiquidacoesAtualizarStatus,
                $idStatusLiquidacaoAguardandoPagamento,
                $idRelatorio
            );

            if (!empty($idsLiquidacoesAntecipacoes)) {
                (new Sinistro2_Model_AntecipacaoPagamento())->atualizarStatusLiquidacoes(
                    explode(',',$idsLiquidacoesAntecipacoes), $idStatusLiquidacaoAguardandoPagamento
                );
            }
            
            return [$serviceMontaRelatiroLiquidacao->getConteudoCsv($rs, self::TITLES), $fullPath];
        }
    }

    private function excluirIdsJaExistentes(array $array1, array $array2): array
    {
        // Extrai os id_liquidacao do primeiro array
        $idsExistentes = array_column($array1, 'id_liquidacao');

        // Filtra o segundo array, mantendo apenas os itens com id_liquidacao que não estão no primeiro
        return array_filter($array2, function($item) use ($idsExistentes) {
            return !in_array($item['id_liquidacao'], $idsExistentes);
        });
    }

    private function salvarArquivo(string $dataBaseInicio, string $dataBaseFim): array
    {
        $baseName = "indenizacoes_agro_{$dataBaseInicio}_{$dataBaseFim}";

        $path = APPLICATION_PATH . '/upload_files/indenizacoes/';
        $counter = 1;

        $filename = "{$baseName}_{$counter}.csv";
        $fullPath = "{$path}{$filename}";
        
        while(file_exists($fullPath)) {
            $fullPath = "{$path}{$baseName}_{$counter}.csv";
            $filename = "{$baseName}_{$counter}.csv";
            $counter++;
        }

        return [$filename, $fullPath];
    }
}