<?php
defined('BASEPATH') or exit('No direct script access allowed');

class RodTicketController extends CI_Controller
{

    public function __construct()
    {
        parent::__construct();
    }

    private function hexToBin($hexString)
    {
        // Remove espaços e quebras de linha
        $hexString = preg_replace('/\s+/', '', $hexString);

        // Verifica se é uma string hexadecimal válida
        if (!ctype_xdigit($hexString)) {
            return false;
        }

        // Converte hex para binário
        $binary = '';
        for ($i = 0; $i < strlen($hexString); $i += 2) {
            $binary .= chr(hexdec(substr($hexString, $i, 2)));
        }

        return $binary;
    }

    private function processarPDF($hexData)
    {
        if (empty($hexData)) {
            return null;
        }

        try {
            // Se já vier em binário começa com %PDF, senão converte do HEX
            if (strncmp($hexData, '%PDF', 4) === 0) {
                $binaryData = $hexData;
            } else {
                $hexString = preg_replace('/\s+/', '', $hexData);

                if (strlen($hexString) % 2 !== 0) {
                    throw new Exception('Dados hexadecimais com comprimento ímpar');
                }

                $binaryData = $this->hexToBin($hexString);

                if ($binaryData === false) {
                    throw new Exception('Erro ao converter dados hexadecimais');
                }
            }

            // Verifica se é realmente um PDF (começa com %PDF)
            if (substr($binaryData, 0, 4) !== '%PDF') {
                throw new Exception('Dados não são um PDF válido');
            }

            return array(
                'binary' => $binaryData,
                'base64' => base64_encode($binaryData),
                'size' => strlen($binaryData)
            );
        } catch (Exception $e) {
            error_log('Erro ao processar PDF: ' . $e->getMessage());
            return null;
        }
    }

    public function consultaVendaEnviada()
    {

        $postData = file_get_contents('php://input');

        $data = json_decode($postData, true);

        // Verificar se o JSON é válido
        if (json_last_error() !== JSON_ERROR_NONE) {
            $this->saveToFile('thiago.txt', json_encode([
                'erro_json' => true,
                'json_error' => json_last_error_msg(),
                'postData' => $postData
            ]));

            http_response_code(400);
            echo 'JSON inválido';
            exit;
        }

        $CASHWIN_RODTICKET = $data['CASHWIN_RODTICKET'];


        $this->load->model('RodTicket_model');
        $model = new RodTicket_model();



        $dadosVenda = $model->consultaVendaEnviadaModel($data['telefone'], $CASHWIN_RODTICKET);


        $pdfProcessado = $this->processarPDF($dadosVenda->ORCAMENTO_PDF);

        $dadosVenda->ORCAMENTO_PDF = $pdfProcessado;

        $responsePDF = "";

        // Verifica se houve erro na consulta
        if (empty($dadosVenda)) {
            $this->saveToFile('thiago.txt', json_encode([
                'erro' => 'Nenhum resultado encontrado ou erro na query.'
            ]));
        } else {
            $this->saveToFile('thiago.txt', json_encode([
                'dadosVenda' => $dadosVenda
            ]));
        }


        if ($dadosVenda) {
            // Removendo o campo binário antes do json_encode
            $this->saveToFile('thiago.txt', json_encode([
                'ORCAMENTO_PDF' => $dadosVenda
            ]));

            $ORCAMENTO_PDF = $dadosVenda->ORCAMENTO_PDF;


            $responsePDF = $model->sendPdfViaCurl($dadosVenda, ($ORCAMENTO_PDF), $data['telefone'], 'ORCAMENTO');

            $this->saveToFile('thiago.txt', json_encode([
                'responsePDF' => ($responsePDF)
            ]));

            unset($dadosVenda->ORCAMENTO_PDF);
        }


        echo json_encode([
            'success' => true,
            'retorno' => $dadosVenda,
            "responsePDF" => $responsePDF
        ]);
    }

    public function consultaVendedorEnviado()
    {
        $postData = file_get_contents('php://input');
        $data = json_decode($postData, true);

        if (!isset($data) || empty($data) || !isset($data['telefone'])) {
            http_response_code(403);
            echo 'error';
            exit;
        }

        $CASHWIN_RODTICKET = $data['CASHWIN_RODTICKET'];

        $this->load->model('RodTicket_model');
        $model = new RodTicket_model();

        $dadosVenda = $model->consultaVendedorEnviadoModel($data['telefone'], $CASHWIN_RODTICKET);
        $responsePDF = "";

        if ($dadosVenda) {
            unset($dadosVenda->ORCAMENTO_PDF);
        }


        echo json_encode([
            'success' => true,
            'retorno' => $dadosVenda
        ]);
    }

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


    public function consultarUltimoFinanceiroCobranca()
    {
        $postData = file_get_contents('php://input');
        $data = json_decode($postData, true);

        // Verificar se o JSON é válido
        if (json_last_error() !== JSON_ERROR_NONE) {
            $this->saveToFile('thiago.txt', json_encode([
                'erro_json' => true,
                'json_error' => json_last_error_msg(),
                'postData' => $postData
            ]));

            http_response_code(400);
            echo 'JSON inválido';
            exit;
        }

        $this->load->model('RodTicket_model');
        $model = new RodTicket_model();

        // Chama o método atualizado que busca o PDF da rede
        $dadosCobranca = $model->consultarUltimoFinanceiroCobranca($data['telefone']);


        // Verifica se houve erro na consulta
        if ($dadosCobranca === null || !isset($dadosCobranca) || !isset($dadosCobranca->USUARIO_FONE)) {


            http_response_code(404);

            echo json_encode([
                'success' => false,
                'erro' => 'Nenhum resultado encontrado.',
                'responsePDF' => $dadosCobranca
            ]);
            return;
        }


        echo json_encode([
            'success' => true,
            'retorno' => $dadosCobranca
        ]);
    }

    public function consultarUltimaCobranca()
    {
        $postData = file_get_contents('php://input');
        $data = json_decode($postData, true);

        // Verificar se o JSON é válido
        if (json_last_error() !== JSON_ERROR_NONE) {
            $this->saveToFile('thiago.txt', json_encode([
                'erro_json' => true,
                'json_error' => json_last_error_msg(),
                'postData' => $postData
            ]));

            http_response_code(400);
            echo 'JSON inválido';
            exit;
        }

        $this->load->model('RodTicket_model');
        $model = new RodTicket_model();

        // Chama o método atualizado que busca o PDF da rede
        $dadosCobranca = $model->consultarUltimaCobrancaModel($data['telefone']);

        $responsePDF = "";

        // Verifica se houve erro na consulta
        if ($dadosCobranca === null || !isset($dadosCobranca) || !isset($dadosCobranca->NOME_ARQUIVO) || empty($dadosCobranca->NOME_ARQUIVO) || is_null($dadosCobranca->NOME_ARQUIVO)) {
            $this->saveToFile('thiago.txt', json_encode([
                'erro' => 'Nenhum resultado encontrado ou erro na query.'
            ]));

            http_response_code(404);

            echo json_encode([
                'success' => false,
                'erro' => 'Nenhum resultado encontrado ou erro na query.',
                'responsePDF' => ""
            ]);
            return;
        }

        $this->saveToFile('thiago.txt', json_encode([
            'dadosCobranca' => [
                'nome_arquivo' => $dadosCobranca->NOME_ARQUIVO,
                'cashwin_diretorio' => $dadosCobranca->CASHWIN_DIRETORIO,
                'caminho_arquivo' => $dadosCobranca->CAMINHO_ARQUIVO,
                'pdf_size' => strlen($dadosCobranca->ORCAMENTO_PDF)
            ]
        ]));

        // Processa o PDF da mesma forma que os outros métodos
        $pdfProcessado = $this->processarPDF($dadosCobranca->ORCAMENTO_PDF);

        $this->saveToFile('thiago.txt', json_encode([
            'ORCAMENTO_PDF' => $dadosCobranca->ORCAMENTO_PDF,
            'pdfProcessado' => $pdfProcessado
        ]));

        if ($pdfProcessado && isset($pdfProcessado['binary'])) {
            // Envia o PDF via WhatsApp usando o método específico para cobrança
            $responsePDF = $model->sendCobrancaPdfViaCurl($dadosCobranca, $pdfProcessado['binary'], $data['telefone'], 'FINANCEIRO');

            $this->saveToFile('thiago.txt', json_encode([
                'responsePDF' => $responsePDF
            ]));
        } else {
            $this->saveToFile('thiago.txt', json_encode([
                'erro' => 'Erro ao processar PDF para envio'
            ]));
        }

        // Remove o PDF binário do retorno para evitar problemas com JSON
        unset($dadosCobranca->ORCAMENTO_PDF);

        echo json_encode([
            'success' => true,
            'retorno' => $dadosCobranca,
            "responsePDF" => $responsePDF
        ]);
    }
}
