<?php
class RodTicket_model extends CI_Model
{

    public function __construct()
    {
        parent::__construct();
        $this->load->database();
    }

    public function consultaVendedorEnviadoModel($telefone, $cashwin)
    {
        // Inicializa o log detalhado
        $logDetalhado = [
            'timestamp' => date('Y-m-d H:i:s'),
            'funcao' => 'consultaVendedorEnviadoModel',
            'usuario' => 'RodCopilot',
            'etapas' => []
        ];

        try {
            // ETAPA 1: Recebimento do parâmetro
            $logDetalhado['etapas'][] = [
                'etapa' => '1_recebimento_parametro',
                'status' => 'sucesso',
                'dados' => [
                    'telefone_original' => $telefone,
                    'tipo_telefone' => gettype($telefone),
                    'tamanho_telefone' => strlen($telefone)
                ]
            ];

            // ETAPA 2: Limpeza do telefone
            $telefone = preg_replace('/\D/', '', $telefone);
            $logDetalhado['etapas'][] = [
                'etapa' => '2_limpeza_telefone',
                'status' => 'sucesso',
                'dados' => [
                    'telefone_limpo' => $telefone,
                    'tamanho_apos_limpeza' => strlen($telefone)
                ]
            ];

            // ETAPA 3: Validação do formato
            if (!preg_match('/^55\d{2}\d{8,9}$/', $telefone)) {
                $logDetalhado['etapas'][] = [
                    'etapa' => '3_validacao_formato',
                    'status' => 'erro',
                    'dados' => [
                        'erro' => 'Formato de telefone inválido',
                        'telefone_testado' => $telefone,
                        'regex_usado' => '^55\d{2}\d{8,9}$'
                    ]
                ];
                $logDetalhado['resultado_final'] = null;
                $this->saveToFile('consulta_vendedor_log.txt', json_encode($logDetalhado, JSON_PRETTY_PRINT));
                return null;
            }

            $logDetalhado['etapas'][] = [
                'etapa' => '3_validacao_formato',
                'status' => 'sucesso',
                'dados' => [
                    'telefone_validado' => $telefone
                ]
            ];

            // ETAPA 4: Processamento do número
            $numeroSemDDI = substr($telefone, 2);
            $logDetalhado['etapas'][] = [
                'etapa' => '4_remocao_ddi',
                'status' => 'sucesso',
                'dados' => [
                    'numero_sem_ddi' => $numeroSemDDI,
                    'tamanho_sem_ddi' => strlen($numeroSemDDI)
                ]
            ];

            // ETAPA 5: Geração das variações do telefone
            if (preg_match('/^\d{2}9\d{8}$/', $numeroSemDDI)) {
                $telefoneCom9 = $telefone;
                $telefoneSem9 = '55' . substr($numeroSemDDI, 0, 2) . substr($numeroSemDDI, 3);
                $tipoNumero = "celular_com_9";
            } elseif (preg_match('/^\d{2}\d{8}$/', $numeroSemDDI)) {
                $telefoneSem9 = $telefone;
                $telefoneCom9 = '55' . substr($numeroSemDDI, 0, 2) . '9' . substr($numeroSemDDI, 2);
                $tipoNumero = "fixo_sem_9";
            } else {
                $logDetalhado['etapas'][] = [
                    'etapa' => '5_geracao_variacoes',
                    'status' => 'erro',
                    'dados' => [
                        'erro' => 'Número não reconhecido',
                        'numero_sem_ddi' => $numeroSemDDI,
                        'regex_celular' => '^\d{2}9\d{8}$',
                        'regex_fixo' => '^\d{2}\d{8}$'
                    ]
                ];
                $logDetalhado['resultado_final'] = null;
                $this->saveToFile('consulta_vendedor_log.txt', json_encode($logDetalhado, JSON_PRETTY_PRINT));
                return null;
            }

            $logDetalhado['etapas'][] = [
                'etapa' => '5_geracao_variacoes',
                'status' => 'sucesso',
                'dados' => [
                    'tipo_numero_detectado' => $tipoNumero,
                    'telefone_com_9' => $telefoneCom9,
                    'telefone_sem_9' => $telefoneSem9
                ]
            ];

            // ETAPA 6: Montagem da SQL
            $sql = "
            SELECT 
                o.*,
                cv.NOME as NOME_VENDEDOR,
                o.TELEFONE_VENDEDOR as CELULAR_VENDEDOR
            FROM 
                " . $cashwin . ".dbo.ORCAMENTO_NOTIFICACAO o
            LEFT JOIN " . $cashwin . ".dbo.VENDA v ON v.COD_VENDA = o.COD_VENDA
            INNER JOIN dbo.CAD_VEND cv ON cv.CODIGO = v.COD_VENDEDOR
            WHERE 
                (o.TELEFONE = ? OR o.TELEFONE = ?)
            ORDER BY 
                o.ID DESC
            OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY;
        ";

            $logDetalhado['etapas'][] = [
                'etapa' => '6_montagem_sql',
                'status' => 'sucesso',
                'dados' => [
                    'sql_gerado' => trim($sql),
                    'parametros' => [$telefoneCom9, $telefoneSem9],
                    'constante_db' => $cashwin,
                    'observacao_sql' => 'Query com INNER JOIN em CAD_VEND - pode não retornar dados se vendedor não existir'
                ]
            ];

            // ETAPA 7: Execução da query
            $logDetalhado['etapas'][] = [
                'etapa' => '7_antes_execucao_query',
                'status' => 'iniciando',
                'dados' => [
                    'momento' => date('Y-m-d H:i:s.u'),
                    'memoria_usada' => memory_get_usage(true)
                ]
            ];

            $query = $this->db->query($sql, [$telefoneCom9, $telefoneSem9]);

            // ETAPA 8: Verificação de erros na query
            if (!$query) {
                $erroDB = $this->db->error();
                $logDetalhado['etapas'][] = [
                    'etapa' => '8_verificacao_erro_query',
                    'status' => 'erro',
                    'dados' => [
                        'erro_db' => $erroDB,
                        'query_object' => $query,
                        'tipo_erro' => gettype($query),
                        'last_query' => $this->db->last_query()
                    ]
                ];
                $logDetalhado['resultado_final'] = null;
                //$this->saveToFile('consulta_vendedor_log.txt', json_encode($logDetalhado, JSON_PRETTY_PRINT));
                return null;
            }

            $logDetalhado['etapas'][] = [
                'etapa' => '8_verificacao_erro_query',
                'status' => 'sucesso',
                'dados' => [
                    'query_executada' => true,
                    'tipo_query_object' => gettype($query),
                    'last_query' => $this->db->last_query()
                ]
            ];

            // ETAPA 9: Verificação do número de resultados
            $numRows = $query->num_rows();
            $logDetalhado['etapas'][] = [
                'etapa' => '9_verificacao_num_resultados',
                'status' => 'sucesso',
                'dados' => [
                    'numero_linhas_encontradas' => $numRows,
                    'tem_resultados' => $numRows > 0
                ]
            ];

            // ETAPA 10: Obtenção do resultado
            $row = $query->row();

            $logDetalhado['etapas'][] = [
                'etapa' => '10_obtencao_resultado',
                'status' => 'sucesso',
                'dados' => [
                    'resultado_obtido' => $row ? true : false,
                    'tipo_resultado' => gettype($row),
                    'numero_colunas' => $row ? count((array)$row) : 0,
                    'colunas_disponiveis' => $row ? array_keys((array)$row) : [],
                    'dados_resultado' => $row
                ]
            ];

            // ETAPA 11: Análise dos dados de retorno
            if (!$row) {
                $logDetalhado['etapas'][] = [
                    'etapa' => '11_analise_dados_vazios',
                    'status' => 'alerta',
                    'dados' => [
                        'possivel_causa_1' => 'Telefone não encontrado na tabela ORCAMENTO_NOTIFICACAO',
                        'possivel_causa_2' => 'VENDA não encontrada para o COD_VENDA do orçamento',
                        'possivel_causa_3' => 'VENDEDOR não encontrado na tabela CAD_VEND (INNER JOIN)',
                        'telefones_pesquisados' => [$telefoneCom9, $telefoneSem9],
                        'sugestao' => 'Verificar se existem dados nas tabelas base com os telefones informados'
                    ]
                ];
            } else {
                $logDetalhado['etapas'][] = [
                    'etapa' => '11_analise_dados_encontrados',
                    'status' => 'sucesso',
                    'dados' => [
                        'telefone_encontrado' => isset($row->TELEFONE) ? $row->TELEFONE : 'campo_nao_encontrado',
                        'nome_vendedor' => isset($row->NOME_VENDEDOR) ? $row->NOME_VENDEDOR : 'campo_nao_encontrado',
                        'celular_vendedor' => isset($row->CELULAR_VENDEDOR) ? $row->CELULAR_VENDEDOR : 'campo_nao_encontrado',
                        'cod_venda' => isset($row->COD_VENDA) ? $row->COD_VENDA : 'campo_nao_encontrado'
                    ]
                ];
            }

            // ETAPA 12: Preparação do retorno
            $logDetalhado['resultado_final'] = $row;
            $logDetalhado['status_geral'] = $row ? 'sucesso_com_dados' : 'sucesso_sem_dados';

            $this->saveToFile('consulta_vendedor_log.txt', json_encode($logDetalhado, JSON_PRETTY_PRINT));

            return $row;
        } catch (Exception $e) {
            // ETAPA DE ERRO GERAL
            $logDetalhado['etapas'][] = [
                'etapa' => 'erro_exception',
                'status' => 'erro_critico',
                'dados' => [
                    'mensagem_erro' => $e->getMessage(),
                    'arquivo_erro' => $e->getFile(),
                    'linha_erro' => $e->getLine(),
                    'trace' => $e->getTraceAsString()
                ]
            ];
            $logDetalhado['resultado_final'] = null;
            $logDetalhado['status_geral'] = 'erro_critico';

            $this->saveToFile('consulta_vendedor_log.txt', json_encode($logDetalhado, JSON_PRETTY_PRINT));

            return null;
        }
    }

    public function consultaVendedorEnviadoModelOLD($telefone)
    {
        // Inicializa um array para armazenar os logs
        $logs = [];

        // Log: Número original recebido
        $logs['telefone_original'] = $telefone;

        // Remove espaços e caracteres não numéricos
        $telefone = preg_replace('/\D/', '', $telefone);
        $logs['telefone_limpo'] = $telefone;

        // Verifica se o número tem o formato correto (com DDI e DDD)
        if (!preg_match('/^55\d{2}\d{8,9}$/', $telefone)) {
            $logs['erro'] = "Formato de telefone inválido.";
            $this->saveToFile('consulta_vendedor_log.txt', json_encode($logs, JSON_PRETTY_PRINT));
            return null;
        }

        // Remove o DDI (55) para facilitar a manipulação
        $numeroSemDDI = substr($telefone, 2);

        // Se o número tem 11 dígitos (9 + 8), remove o nono dígito
        if (preg_match('/^\d{2}9\d{8}$/', $numeroSemDDI)) {
            $telefoneCom9 = $telefone; // Mantém o número original
            $telefoneSem9 = '55' . substr($numeroSemDDI, 0, 2) . substr($numeroSemDDI, 3);
            $logs['detalhe'] = "Número com 12 dígitos (celular com DDI), removendo o nono dígito.";
        } elseif (preg_match('/^\d{2}\d{8}$/', $numeroSemDDI)) {
            $telefoneSem9 = $telefone; // Mantém o número original
            $telefoneCom9 = '55' . substr($numeroSemDDI, 0, 2) . '9' . substr($numeroSemDDI, 2);
            $logs['detalhe'] = "Número com 11 dígitos (fixo com DDI), adicionando o nono dígito.";
        } else {
            $logs['erro'] = "Número não reconhecido.";
            $this->saveToFile('consulta_vendedor_log.txt', json_encode($logs, JSON_PRETTY_PRINT));
            return null;
        }

        // Log: Telefones gerados
        $logs['telefoneCom9'] = $telefoneCom9;
        $logs['telefoneSem9'] = $telefoneSem9;

        // Monta a consulta SQL manualmente com prepared statements
        $sql = "
            SELECT 
                o.*
                cv.NOME as NOME_VENDEDOR,
                o.TELEFONE_VENDEDOR as CELULAR_VENDEDOR
            FROM 
                " . CASHWIN_RODTICKET . ".dbo.ORCAMENTO_NOTIFICACAO o
            LEFT JOIN " . CASHWIN_RODTICKET . ".dbo.VENDA v ON v.COD_VENDA = o.COD_VENDA
            INNER JOIN dbo.CAD_VEND cv ON cv.CODIGO = v.COD_VENDEDOR
            WHERE 
                (o.TELEFONE = ? OR o.TELEFONE = ?)
            ORDER BY 
                o.ID DESC
            OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY;
        ";


        // Log da query gerada
        $logs['sql_gerado'] = $sql;
        $this->saveToFile('consulta_vendedor_log.txt', json_encode($logs, JSON_PRETTY_PRINT));

        // Log antes da execução da query
        $this->saveToFile('consulta_vendedor_log.txt', json_encode(['status' => 'Antes da execução da query']));

        // Executa a consulta com prepared statements
        $query = $this->db->query($sql, [$telefoneCom9, $telefoneSem9]);

        // Verifica se a query retornou um erro
        if (!$query) {
            $erroDB = $this->db->error(); // Captura o erro do banco
            $this->saveToFile('consulta_vendedor_log.txt', json_encode(['erro_sql' => $erroDB], JSON_PRETTY_PRINT));
            return null;
        }

        // Log depois da execução da query (se chegar aqui, significa que a query não deu erro crítico)
        $this->saveToFile('consulta_vendedor_log.txt', json_encode(['status' => 'Query executada com sucesso']));

        // Obtém a primeira linha do resultado
        $row = $query->row();

        // Salva o log detalhado no arquivo
        $this->saveToFile('consulta_vendedor_log.txt', json_encode(['dadosVendedor' => $row], JSON_PRETTY_PRINT));

        return $row;
    }

    public function consultaVendaEnviadaModel($telefone, $CASHWIN)
    {
        // Inicializa um array para armazenar os logs
        $logs = [];

        // Log: Número original recebido
        $logs['telefone_original'] = $telefone;

        // Remove espaços e caracteres não numéricos
        $telefone = preg_replace('/\D/', '', $telefone);
        $logs['telefone_limpo'] = $telefone;

        // Verifica se o número tem o formato correto (com DDI e DDD)
        if (!preg_match('/^55\d{2}\d{8,9}$/', $telefone)) {
            $logs['erro'] = "Formato de telefone inválido.";
            $this->saveToFile('thiago.txt', json_encode($logs, JSON_PRETTY_PRINT));
            return null;
        }

        // Remove o DDI (55) para facilitar a manipulação
        $numeroSemDDI = substr($telefone, 2);


        // Se o número tem 11 dígitos (9 + 8), remove o nono dígito
        if (preg_match('/^\d{2}9\d{8}$/', $numeroSemDDI)) {
            $telefoneCom9 = $telefone; // Mantém o número original
            $telefoneSem9 = '55' . substr($numeroSemDDI, 0, 2) . substr($numeroSemDDI, 3);
            $logs['detalhe'] = "Número com 12 dígitos (celular com DDI), removendo o nono dígito.";
        } elseif (preg_match('/^\d{2}\d{8}$/', $numeroSemDDI)) {
            $telefoneSem9 = $telefone; // Mantém o número original
            $telefoneCom9 = '55' . substr($numeroSemDDI, 0, 2) . '9' . substr($numeroSemDDI, 2);
            $logs['detalhe'] = "Número com 11 dígitos (fixo com DDI), adicionando o nono dígito.";
        } else {
            $logs['erro'] = "Número não reconhecido.";
            $this->saveToFile('thiago.txt', json_encode($logs, JSON_PRETTY_PRINT));
            return null;
        }

        // Log: Telefones gerados
        $logs['telefoneCom9'] = $telefoneCom9;
        $logs['telefoneSem9'] = $telefoneSem9;

        // Monta a consulta SQL manualmente com prepared statements
        $sql = "
                SELECT 
				o.*
                FROM " . $CASHWIN . ".dbo.ORCAMENTO_NOTIFICACAO o
                LEFT JOIN " . $CASHWIN . ".dbo.VENDA v 
                    ON v.COD_VENDA = o.COD_VENDA
                WHERE 
                    (o.TELEFONE = ? OR o.TELEFONE = ?)
                ORDER BY o.ID DESC
                OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY;
            ";


        // Log da query gerada
        $logs['sql_gerado'] = $sql;
        $this->saveToFile('thiago.txt', json_encode($logs, JSON_PRETTY_PRINT));

        // Log antes da execução da query
        $this->saveToFile('thiago.txt', json_encode(['status' => 'Antes da execução da query']));

        // Executa a consulta com prepared statements
        $query = $this->db->query($sql, [$telefoneCom9, $telefoneSem9]);

        // Verifica se a query retornou um erro
        if (!$query) {
            $erroDB = $this->db->error(); // Captura o erro do banco
            $this->saveToFile('thiago.txt', json_encode([
                'erro_sql' => $erroDB
            ], JSON_PRETTY_PRINT));
            return null;
        }

        // Log depois da execução da query (se chegar aqui, significa que a query não deu erro crítico)
        $this->saveToFile('thiago.txt', json_encode(['status' => 'Query executada com sucesso']));

        // Obtém a primeira linha do resultado
        $row = $query->row();

        // Salva o log detalhado no arquivo
        $this->saveToFile('thiago.txt', json_encode(['dadosVenda' => $row], JSON_PRETTY_PRINT));

        return $row;
    }




    function sendPdfViaCurl($dadosVenda, $pdfContent, $phone, $type)
    {
        // Configurações da API
        $url = 'https://api.rodticket.com/v2/send/message';

        $COD_VENDA = $dadosVenda->COD_VENDA;

        // Cria um arquivo temporário para armazenar o PDF
        $tempFilePath = "/" . $COD_VENDA . "_pdf.pdf";
        if (file_put_contents($tempFilePath, $pdfContent) === false) {
            return "Erro ao criar arquivo temporário.";
        }


        //	file_put_contents('text.pdf', $tempFilePath);

        // Cria o objeto CURLFile para o arquivo PDF

        $cfile = curl_file_create($tempFilePath, 'application/pdf', "orcamento_{$COD_VENDA}.pdf");

        // FormData conforme documentação da API
        $postFields = [
            "number" => $phone,  // O número do destinatário
            "medias" => $cfile   // O arquivo PDF
        ];

        $token = $type == 'FINANCEIRO' ? TOKEN_RODTICKET_FINANCEIRO : TOKEN_RODTICKET;

        // Inicializa o cURL
        $curl = curl_init();

        // Configura as opções do cURL para envio multipart/form-data
        curl_setopt_array($curl, array(
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => $postFields, // Enviando os dados e arquivo
            CURLOPT_HTTPHEADER => array(
                'Authorization: Bearer ' . $token, // Token de autenticação
                // NÃO definimos Content-Type manualmente para permitir multipart correto
            ),
        ));

        // Executa a requisição e captura a resposta
        $response = curl_exec($curl);

        // Se houver erro, captura e retorna
        if (curl_errno($curl)) {
            $error = curl_error($curl);
            curl_close($curl);
            unlink($tempFilePath);
            return "Erro cURL: " . $error;
        }

        // Fecha o cURL e remove o arquivo temporário
        curl_close($curl);
        unlink($tempFilePath);

        return [
            '$response' => $response,
            'tempFilePath' => $tempFilePath,
            'pdfContent' => $pdfContent

        ];
    }

    private function saveToFile($filename, $data)
    {
        file_put_contents(APPPATH . 'logs/' . $filename, $data . PHP_EOL, FILE_APPEND);
    }


    function sendCobrancaPdfViaCurl($dadosCobranca, $pdfContent, $phone, $type)
    {
        // Configurações da API
        $url = 'https://api.rodticket.com/v2/send/message';

        // Cria um arquivo temporário para armazenar o PDF
        $tempFilePath = tempnam(sys_get_temp_dir(), 'cobranca_pdf_');
        if (file_put_contents($tempFilePath, $pdfContent) === false) {
            return "Erro ao criar arquivo temporário.";
        }

        // Cria o objeto CURLFile para o arquivo PDF
        $nomeArquivo = $dadosCobranca->NOME_ARQUIVO;
        $nomeArquivo = preg_replace('/[^a-zA-Z0-9._-]/', '_', $nomeArquivo);
        $cfile = curl_file_create($tempFilePath, 'application/pdf', $nomeArquivo);

        // FormData conforme documentação da API
        $postFields = [
            "number" => $phone,  // O número do destinatário
            "medias" => $cfile   // O arquivo PDF
        ];

        $token = $type == 'FINANCEIRO' ? TOKEN_RODTICKET_FINANCEIRO : TOKEN_RODTICKET;

        // Inicializa o cURL
        $curl = curl_init();

        // Configura as opções do cURL para envio multipart/form-data
        curl_setopt_array($curl, array(
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => $postFields,
            CURLOPT_HTTPHEADER => array(
                'Authorization: Bearer ' . $token, // Token de autenticação
                // NÃO definimos Content-Type manualmente para permitir multipart correto
            ),
        ));

        // Executa a requisição e captura a resposta
        $response = curl_exec($curl);

        // Se houver erro, captura e retorna
        if (curl_errno($curl)) {
            $error = curl_error($curl);
            curl_close($curl);
            unlink($tempFilePath);
            return "Erro cURL: " . $error;
        }

        // Fecha o cURL e remove o arquivo temporário
        curl_close($curl);
        unlink($tempFilePath);

        return $response;
    }

    public function consultarCobrancas($telefone)
    {
        // Inicializa um array para armazenar os logs
        $logs = [];

        // Log: Número original recebido
        $logs['telefone_original'] = $telefone;

        // Remove espaços e caracteres não numéricos
        $telefone = preg_replace('/\D/', '', $telefone);
        $logs['telefone_limpo'] = $telefone;

        // Verifica se o número tem o formato correto (com DDI e DDD)
        if (!preg_match('/^55\d{2}\d{8,9}$/', $telefone)) {
            $logs['erro'] = "Formato de telefone inválido.";
            $this->saveToFile('thiago.txt', json_encode($logs, JSON_PRETTY_PRINT));
            return null;
        }

        // Remove o DDI (55) para facilitar a manipulação
        $numeroSemDDI = substr($telefone, 2);

        // Se o número tem 11 dígitos (9 + 8), remove o nono dígito
        if (preg_match('/^\d{2}9\d{8}$/', $numeroSemDDI)) {
            $telefoneCom9 = $telefone; // Mantém o número original
            $telefoneSem9 = '55' . substr($numeroSemDDI, 0, 2) . substr($numeroSemDDI, 3);
            $logs['detalhe'] = "Número com 12 dígitos (celular com DDI), removendo o nono dígito.";
        } elseif (preg_match('/^\d{2}\d{8}$/', $numeroSemDDI)) {
            $telefoneSem9 = $telefone; // Mantém o número original
            $telefoneCom9 = '55' . substr($numeroSemDDI, 0, 2) . '9' . substr($numeroSemDDI, 2);
            $logs['detalhe'] = "Número com 11 dígitos (fixo com DDI), adicionando o nono dígito.";
        } else {
            $logs['erro'] = "Número não reconhecido.";
            $this->saveToFile('thiago.txt', json_encode($logs, JSON_PRETTY_PRINT));
            return null;
        }

        // Log: Telefones gerados
        $logs['telefoneCom9'] = $telefoneCom9;
        $logs['telefoneSem9'] = $telefoneSem9;

        // PASSO 1: Obter o nome do CASHWIN_ através da primeira query
        $sqlCashwin = "
            SELECT TOP 1
                pn.PAR_EMPRESA,
                pc.DIRETORIO,
                pn.COD_PENDENCIA
            FROM    
                PEND_NOTIFICACAO pn 
            INNER JOIN dbo.PAR_CASH pc ON(pc.CODIGO = pn.PAR_EMPRESA )
            WHERE
                pn.TELEFONE = ? OR pn.TELEFONE = ?
			ORDER BY 
				pn.CODIGO DESC
        ";
        $logs['sql_cashwin'] = $sqlCashwin;

        $queryDiretorio = $this->db->query($sqlCashwin, [$telefoneCom9, $telefoneSem9]);

        if (!$queryDiretorio || $queryDiretorio->num_rows() == 0) {
            $logs['erro'] = "Não foi possível obter o diretório CASHWIN para o telefone.";
            return $logs;
        }

        $diretorioData = $queryDiretorio->row();
        $cashwinDiretorio = $diretorioData->DIRETORIO;
        $COD_PENDENCIA = $diretorioData->COD_PENDENCIA;

        $logs['cashwin_cod_pendencia'] = $COD_PENDENCIA;
        $logs['cashwin_diretorio'] = $cashwinDiretorio;

        $sqlCodigoCliente = "
            SELECT TOP 1
                pecr.CODIGODOCLIENTE AS COD_CLIENTE
            FROM    
                PEND_NOTIFICACAO pn 
                INNER JOIN " . $cashwinDiretorio . ".dbo.CAD_PECR pecr ON pecr.CODIGO = pn.COD_PENDENCIA
            WHERE
                pn.TELEFONE = ? OR pn.TELEFONE = ?
			ORDER BY 
				pn.CODIGO DESC
        ";
        $queryAcharCliente = $this->db->query($sqlCodigoCliente, [$telefoneCom9, $telefoneSem9]);
        $results = $queryAcharCliente->result_array();

        if (sizeof($results) <= 0) {
            $logs['erro'] = "Não foi possível obter o diretório CLIENTE para o telefone.";
            $logs['sqlCodigoCliente'] = $sqlCodigoCliente;
            return $logs;
        }

        $COD_CLIENTE = $results[0]['COD_CLIENTE'];

        $sqlConsultarPendencias = "
                                select
                                    *
                                from
                                    {$cashwinDiretorio}.dbo.CAD_PECR cp 
                                WHERE
                                    cp.CODIGODOCLIENTE  = ?
                                order by
                                    cp.DATADEVENCIMENTO ASC
        ";

        $queryConsultarPendencias = $this->db->query($sqlConsultarPendencias, [$COD_CLIENTE]);
        $resultConsultarPendencias = $queryConsultarPendencias->resultArray();

        $logs['pendencias_encontradas'] = $resultConsultarPendencias;

        return $logs;
    }

    public function consultarUltimaCobrancaModel($telefone)
    {
        // Inicializa um array para armazenar os logs
        $logs = [];

        // Log: Número original recebido
        $logs['telefone_original'] = $telefone;

        // Remove espaços e caracteres não numéricos
        $telefone = preg_replace('/\D/', '', $telefone);
        $logs['telefone_limpo'] = $telefone;

        // Verifica se o número tem o formato correto (com DDI e DDD)
        if (!preg_match('/^55\d{2}\d{8,9}$/', $telefone)) {
            $logs['erro'] = "Formato de telefone inválido.";
            $this->saveToFile('thiago.txt', json_encode($logs, JSON_PRETTY_PRINT));
            return null;
        }

        // Remove o DDI (55) para facilitar a manipulação
        $numeroSemDDI = substr($telefone, 2);

        // Se o número tem 11 dígitos (9 + 8), remove o nono dígito
        if (preg_match('/^\d{2}9\d{8}$/', $numeroSemDDI)) {
            $telefoneCom9 = $telefone; // Mantém o número original
            $telefoneSem9 = '55' . substr($numeroSemDDI, 0, 2) . substr($numeroSemDDI, 3);
            $logs['detalhe'] = "Número com 12 dígitos (celular com DDI), removendo o nono dígito.";
        } elseif (preg_match('/^\d{2}\d{8}$/', $numeroSemDDI)) {
            $telefoneSem9 = $telefone; // Mantém o número original
            $telefoneCom9 = '55' . substr($numeroSemDDI, 0, 2) . '9' . substr($numeroSemDDI, 2);
            $logs['detalhe'] = "Número com 11 dígitos (fixo com DDI), adicionando o nono dígito.";
        } else {
            $logs['erro'] = "Número não reconhecido.";
            $this->saveToFile('thiago.txt', json_encode($logs, JSON_PRETTY_PRINT));
            return null;
        }

        // Log: Telefones gerados
        $logs['telefoneCom9'] = $telefoneCom9;
        $logs['telefoneSem9'] = $telefoneSem9;

        // PASSO 1: Obter o nome do CASHWIN_ através da primeira query
        $sqlCashwin = "
            SELECT TOP 1
                pn.PAR_EMPRESA,
                pc.DIRETORIO,
                pn.COD_PENDENCIA
            FROM    
                PEND_NOTIFICACAO pn 
            INNER JOIN dbo.PAR_CASH pc ON(pc.CODIGO = pn.PAR_EMPRESA )
            WHERE
                pn.TELEFONE = ? OR pn.TELEFONE = ?
			ORDER BY 
				pn.CODIGO DESC
        ";

        $logs['sql_cashwin'] = $sqlCashwin;
        $this->saveToFile('thiago.txt', json_encode($logs, JSON_PRETTY_PRINT));

        $queryDiretorio = $this->db->query($sqlCashwin, [$telefoneCom9, $telefoneSem9]);

        if (!$queryDiretorio || $queryDiretorio->num_rows() == 0) {
            $logs['erro'] = "Não foi possível obter o diretório CASHWIN para o telefone.";
            $this->saveToFile('thiago.txt', json_encode($logs, JSON_PRETTY_PRINT));
            return null;
        }

        $diretorioData = $queryDiretorio->row();
        $cashwinDiretorio = $diretorioData->DIRETORIO;
        $COD_PENDENCIA = $diretorioData->COD_PENDENCIA;
        $logs['cashwin_diretorio'] = $cashwinDiretorio;

        // PASSO 2: Obter o nome do arquivo PDF através da segunda query
        $sqlNomeArquivo = "
            SELECT TOP 1
                CAST(pecr.CODIGODOCLIENTE AS varchar) + '_' +
                RIGHT('000' + CAST(pecr.COD_BANCO AS varchar), 3) + '_' +
                CAST(pecr.NOSSO_NUMERO AS varchar) + '_' +
                CAST(pecr.CARTEIRA_CONTA AS varchar) + '.pdf' AS NOME_FILE,
				pecr.NDODOCUMENTO
            FROM    
                PEND_NOTIFICACAO pn 
                INNER JOIN " . $cashwinDiretorio . ".dbo.CAD_PECR pecr ON pecr.CODIGO = pn.COD_PENDENCIA
            WHERE
                pn.TELEFONE = ? OR pn.TELEFONE = ?
			ORDER BY 
				pn.CODIGO DESC
        ";

        $logs['sql_nome_arquivo'] = $sqlNomeArquivo;
        $this->saveToFile('thiago.txt', json_encode($logs, JSON_PRETTY_PRINT));

        $queryNomeArquivo = $this->db->query($sqlNomeArquivo, [$telefoneCom9, $telefoneSem9]);

        if (!$queryNomeArquivo || $queryNomeArquivo->num_rows() == 0) {
            $logs['erro'] = "Não foi possível obter o nome do arquivo PDF.";
            $this->saveToFile('thiago.txt', json_encode($logs, JSON_PRETTY_PRINT));
            return null;
        }

        $arquivoData = $queryNomeArquivo->row();
        $nomeArquivo = $arquivoData->NOME_FILE;
        $logs['nome_arquivo'] = $nomeArquivo;

        // PASSO 3: Buscar o arquivo PDF via FTP
        $logs['ftp_info'] = [
            'host' => '10.1.1.254',
            'user' => 'ingasoft',
            'passive' => true,
            'observacao' => 'Raiz do FTP já é a pasta de BOLETOS'
        ];

        list($okFtp, $pdfContent, $ftpError, $ftpMatchNome) = $this->fetchPdfFromFtp($nomeArquivo);
        if (!$okFtp) {
            $logs['erro'] = 'Falha ao obter arquivo via FTP';
            $logs['motivo_erro'] = $ftpError;
            $logs['nome_arquivo_tentado'] = $nomeArquivo;
            if ($ftpMatchNome) {
                $logs['arquivo_correspondente_encontrado'] = $ftpMatchNome;
            }
            $this->saveToFile('thiago.txt', json_encode($logs, JSON_PRETTY_PRINT));
            return null;
        }

        // Lê o conteúdo já baixado do FTP
        if ($pdfContent === false) {
            $logs['erro'] = "Erro ao ler o arquivo PDF.";
            $this->saveToFile('thiago.txt', json_encode($logs, JSON_PRETTY_PRINT));
            return null;
        }

        // Converte para hexadecimal para compatibilidade com o processamento existente
        $pdfHex = bin2hex($pdfContent);
        $logs['pdf_size'] = strlen($pdfContent);

        // Cria um objeto com os dados necessários
        $resultado = new stdClass();
        $resultado->ORCAMENTO_PDF = $pdfHex;
        $resultado->NOME_ARQUIVO = str_replace(' ', '_', $arquivoData->NDODOCUMENTO) . '.pdf';
        $resultado->CASHWIN_DIRETORIO = $cashwinDiretorio;
        $resultado->CAMINHO_ARQUIVO = 'ftp://10.1.1.254/' . $nomeArquivo;
        $resultado->TELEFONE = $telefone;

        // Salva o log detalhado no arquivo
        $logs['resultado'] = 'PDF encontrado e processado com sucesso';
        $this->saveToFile('thiago.txt', json_encode($logs, JSON_PRETTY_PRINT));

        return $resultado;
    }

    /**
     * Faz o download de um PDF via FTP a partir do nome do arquivo.
     * - Tenta baixar diretamente usando o nome informado
     * - Se falhar com 550, lista a raiz e tenta encontrar um match case-insensitive
     * Retorno: array [$ok, $contentOrFalse, $errorMessageOrNull, $nomeMatchOuNull]
     */
    private function fetchPdfFromFtp($nomeArquivo)
    {
        $host = '10.1.1.254';
        $user = 'ingasoft';
        $pass = 'mudar@123';

        $conn = @ftp_connect($host, 21, 10);
        if (!$conn) {
            return [false, false, 'Não conectou ao FTP (timeout/host).', null];
        }

        // Login
        if (!@ftp_login($conn, $user, $pass)) {
            @ftp_close($conn);
            return [false, false, 'Falha no login do FTP (credenciais).', null];
        }

        // Sempre passivo para atravessar firewall/NAT
        @ftp_pasv($conn, true);

        $nomeArquivo = trim($nomeArquivo);
        $nomeArquivo = str_replace(['\\\\', '\\'], '/', $nomeArquivo);

        // Tenta baixar direto
        $temp = @tmpfile();
        if ($temp === false) {
            @ftp_close($conn);
            return [false, false, 'Falha ao criar arquivo temporário local.', null];
        }
        $meta = stream_get_meta_data($temp);
        $tmpPath = $meta['uri'];

        $ok = @ftp_get($conn, $tmpPath, $nomeArquivo, FTP_BINARY);
        if ($ok) {
            $content = file_get_contents($tmpPath);
            @fclose($temp);
            @ftp_close($conn);
            return [$content !== false, $content, null, $nomeArquivo];
        }

        // Fallback: lista diretório raiz e tenta match case-insensitive
        $lista = @ftp_nlist($conn, '.');
        if ($lista === false || empty($lista)) {
            @fclose($temp);
            @ftp_close($conn);
            return [false, false, 'Não conseguiu listar diretório no FTP ou está vazio.', null];
        }

        $alvoLower = strtolower(basename($nomeArquivo));
        $match = null;
        foreach ($lista as $item) {
            $base = basename($item);
            if (strtolower($base) === $alvoLower) {
                $match = $item;
                break;
            }
        }

        if ($match) {
            $ok2 = @ftp_get($conn, $tmpPath, $match, FTP_BINARY);
            if ($ok2) {
                $content = file_get_contents($tmpPath);
                @fclose($temp);
                @ftp_close($conn);
                return [$content !== false, $content, null, $match];
            }
        }

        @fclose($temp);
        @ftp_close($conn);
        return [false, false, 'Arquivo não encontrado via FTP (direto e por listagem).', $match];
    }

    public function consultarUltimoFinanceiroCobranca($telefone)
    {
        // Inicializa um array para armazenar os logs
        $logs = [];

        // Log: Número original recebido
        $logs['telefone_original'] = $telefone;

        // Remove espaços e caracteres não numéricos
        $telefone = preg_replace('/\D/', '', $telefone);
        $logs['telefone_limpo'] = $telefone;

        // Verifica se o número tem o formato correto (com DDI e DDD)
        if (!preg_match('/^55\d{2}\d{8,9}$/', $telefone)) {
            $logs['erro'] = "Formato de telefone inválido.";
            $this->saveToFile('financeiro_cobranca_log.txt', json_encode($logs, JSON_PRETTY_PRINT));
            return null;
        }

        // Remove o DDI (55) para facilitar a manipulação
        $numeroSemDDI = substr($telefone, 2);

        // Se o número tem 11 dígitos (9 + 8), remove o nono dígito
        if (preg_match('/^\d{2}9\d{8}$/', $numeroSemDDI)) {
            $telefoneCom9 = $telefone; // Mantém o número original
            $telefoneSem9 = '55' . substr($numeroSemDDI, 0, 2) . substr($numeroSemDDI, 3);
            $logs['detalhe'] = "Número com 12 dígitos (celular com DDI), removendo o nono dígito.";
        } elseif (preg_match('/^\d{2}\d{8}$/', $numeroSemDDI)) {
            $telefoneSem9 = $telefone; // Mantém o número original
            $telefoneCom9 = '55' . substr($numeroSemDDI, 0, 2) . '9' . substr($numeroSemDDI, 2);
            $logs['detalhe'] = "Número com 11 dígitos (fixo com DDI), adicionando o nono dígito.";
        } else {
            $logs['erro'] = "Número não reconhecido.";
            $this->saveToFile('financeiro_cobranca_log.txt', json_encode($logs, JSON_PRETTY_PRINT));
            return null;
        }

        // Log: Telefones gerados
        $logs['telefoneCom9'] = $telefoneCom9;
        $logs['telefoneSem9'] = $telefoneSem9;

        // SQL para obter dados do financeiro/cobrança
        $sqlCashwin = "
            SELECT
                TOP 1
                pn.PAR_EMPRESA,
                pc.DIRETORIO,
                cu.APELIDO,
                cu.USUARIO_FONE
            FROM    
                dbo.PEND_NOTIFICACAO pn 
                INNER JOIN dbo.PAR_CASH pc ON(pc.CODIGO = pn.PAR_EMPRESA )
                INNER JOIN dbo.CAD_USUA cu ON(cu.CODIGO = pn.COD_USUARIO)
            WHERE
                pn.TELEFONE = ? OR pn.TELEFONE = ?
            ORDER BY pn.CODIGO DESC
        ";

        $logs['sql_financeiro'] = $sqlCashwin;
        $this->saveToFile('financeiro_cobranca_log.txt', json_encode($logs, JSON_PRETTY_PRINT));

        // Executa a consulta
        $query = $this->db->query($sqlCashwin, [$telefoneCom9, $telefoneSem9]);

        if (!$query || $query->num_rows() == 0) {
            $logs['erro'] = "Nenhum registro encontrado para o telefone informado.";
            $this->saveToFile('financeiro_cobranca_log.txt', json_encode($logs, JSON_PRETTY_PRINT));
            return null;
        }

        // Obtém os dados da consulta
        $row = $query->row();

        // Cria o objeto de retorno apenas com APELIDO e USUARIO_FONE
        $resultado = new stdClass();
        $resultado->APELIDO = $row->APELIDO;
        $resultado->USUARIO_FONE = $row->USUARIO_FONE;

        // Log do resultado
        $logs['resultado'] = [
            'apelido' => $row->APELIDO,
            'usuario_fone' => $row->USUARIO_FONE
        ];

        $this->saveToFile('financeiro_cobranca_log.txt', json_encode($logs, JSON_PRETTY_PRINT));

        // Envia contato via API do RodTicket
        try {
            $destino = $telefone; // número do cliente que solicitou (já está com DDI 55)
            $apelidoContato = $row->APELIDO ?: 'Financeiro';
            $foneContato = $row->USUARIO_FONE;

            // Normaliza números
            $normalize = function ($n) {
                $n = preg_replace('/\D/', '', (string)$n);
                if ($n === '' || $n === null) return $n;
                if (strpos($n, '55') !== 0) {
                    $n = '55' . $n;
                }
                return $n;
            };

            $destino = $normalize($destino);
            $foneContato = $normalize($foneContato);

            if (!empty($destino) && !empty($foneContato)) {
                $respContato = $this->sendContactViaCurl(
                    $destino,
                    $apelidoContato,
                    $foneContato,
                    'Olá! Segue o contato do financeiro/cobrança.',
                    'FINANCEIRO'
                );

                // Loga a resposta do envio do contato
                $this->saveToFile('financeiro_cobranca_log.txt', json_encode([
                    'envio_contato' => [
                        'destino' => $destino,
                        'nome' => $apelidoContato,
                        'numero_contato' => $foneContato,
                        'resposta_api' => $respContato
                    ]
                ], JSON_PRETTY_PRINT));

                // Opcionalmente anexa um indicador no retorno
                // $resultado->ENVIADO_CONTATO = true;
            }
        } catch (Exception $e) {
            $this->saveToFile('financeiro_cobranca_log.txt', json_encode([
                'erro_envio_contato' => $e->getMessage()
            ], JSON_PRETTY_PRINT));
        }

        return $resultado;
    }

    /**
     * Envia um contato via API do RodTicket
     * @param string $destNumber Número de destino (cliente) no formato 55DDDN... (somente dígitos)
     * @param string $contactName Nome do contato a ser enviado
     * @param string $contactNumber Número do contato (financeiro/cobrança) no formato 55DDDN... (somente dígitos)
     * @param string|null $body Mensagem opcional a ser enviada junto
     * @return string Resposta da API ou mensagem de erro do cURL
     */
    public function sendContactViaCurl($destNumber, $contactName, $contactNumber, $body = null, $type)
    {
        $url = 'https://api.rodticket.com/v2/send/message';

        // Normalização simples dos números (somente dígitos e garantindo prefixo 55)
        $normalize = function ($n) {
            $n = preg_replace('/\D/', '', (string)$n);
            if ($n === '' || $n === null) return $n;
            if (strpos($n, '55') !== 0) {
                $n = '55' . $n;
            }
            return $n;
        };

        $destNumber = $normalize($destNumber);
        $contactNumber = $normalize($contactNumber);

        $payload = [[
            'number' => $destNumber,
            'body' => $body ?: 'Olá! Seguem os dados de contato do setor financeiro/cobrança.',
            'contact' => [
                'name' => $contactName,
                'number' => $contactNumber,
            ],
        ]];

        $token = $type == 'FINANCEIRO' ? TOKEN_RODTICKET_FINANCEIRO : TOKEN_RODTICKET;

        $curl = curl_init();
        curl_setopt_array($curl, [
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => json_encode($payload),
            CURLOPT_HTTPHEADER => [
                'Authorization: Bearer ' . $token,
                'Content-Type: application/json',
            ],
        ]);

        $response = curl_exec($curl);

        if (curl_errno($curl)) {
            $error = curl_error($curl);
            curl_close($curl);
            return 'Erro cURL: ' . $error;
        }

        curl_close($curl);
        return $response;
    }
}
