<?php

error_reporting(E_ALL);
ini_set('display_errors', 1);


class Prestacao_contasController extends Controller
{
    private $prestacaoModel;

    public function __construct()
    {
        if (!Sessao::estaLogado()) {
            URL::redirecionar('usuarios/login');
        }
        $this->prestacaoModel = $this->model('PrestacaoContas');
    }

    public function index()
    {
        $dados = [
            'prestacoes' => $this->prestacaoModel->lerPrestacoes()
        ];
        $this->view('layout', [
            'conteudo' => __DIR__ . '/../Views/prestacao_contas/index.php',
            'dados'    => $dados
        ]);
    }

    public function cadastrar()
    {
        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
            $formulario = filter_input_array(INPUT_POST, FILTER_SANITIZE_SPECIAL_CHARS);
            $id_ordem = $formulario['id_ordem'] ?? null;

            $valor_gasto = isset($formulario['valor_gasto']) 
                ? floatval(str_replace(',', '.', str_replace('.', '', $formulario['valor_gasto']))) 
                : 0;

          $valor_previsto = 0;
$valores = $this->prestacaoModel->obterValorPrevistoDaOrdem($id_ordem);
if ($valores) {
    $valor_previsto = 
        floatval($valores->total_diarias ?? 0) +
        floatval($valores->valor_combustivel ?? 0) +
        floatval($valores->valor_passagens ?? 0) +
        floatval($valores->outras_despesas ?? 0);
}


            $descontos = isset($formulario['descontos']) 
                ? floatval(str_replace(',', '.', str_replace('.', '', $formulario['descontos']))) 
                : 0;

            $valor_saldo = $valor_previsto - $valor_gasto - $descontos;

            if ($valor_saldo > 0) {
                $devolucao = $valor_saldo;
                $reembolso = 0.00;
            } else {
                $reembolso = abs($valor_saldo);
                $devolucao = 0.00;
            }

            $dados = [
                'id_ordem'    => $id_ordem,
                'doc'         => $formulario['doc'] ?? '',
                'valor_gasto' => $valor_gasto,
                 'valor_previsto'=> $valor_previsto, // ✅ ADICIONE AQUI!
                'reembolso'   => $reembolso,
                'devolucao'   => $devolucao,
                'descontos'   => $descontos,
                'obs'         => $formulario['obs'] ?? '',
                'id_usuario'  => $_SESSION['id_usuario'] ?? 1
            ];

            if ($this->prestacaoModel->armazenar($dados)) {
                $idPrestacao = $this->prestacaoModel->ultimoIdInserido();
                $caminho = realpath(__DIR__ . '/../../public/comprovantes_prestacao/') . '/';

                if (!empty($_FILES['comprovantes']['name'][0])) {
                    foreach ($_FILES['comprovantes']['name'] as $index => $nome) {
                        $tmp = $_FILES['comprovantes']['tmp_name'][$index];

                        if (!empty($tmp) && is_uploaded_file($tmp)) {
                            $nomeSanitizado = preg_replace('/[^a-zA-Z0-9_\-.]/', '_', basename($nome));
                            $nomeFinal = date('Ymd_His') . '_' . $nomeSanitizado;

                            if (move_uploaded_file($tmp, $caminho . $nomeFinal)) {
                                $this->prestacaoModel->salvarComprovante([
                                    'id_prestacao_contas' => $idPrestacao,
                                    'arquivo' => $nomeFinal
                                ]);
                            }
                        }
                    }
                }

                $this->prestacaoModel->atualizarStatusOrdem($id_ordem, 'Prestacao realizada');
                Sessao::mensagem('prestacao_contas', 'Prestacao cadastrada com sucesso!');
                URL::redirecionar('prestacao_contas');
            } else {
                Sessao::mensagem('prestacao_contas', 'Erro ao cadastrar prestacao', 'alert alert-danger');
            }
        }

        $id_ordem = $_GET['id_ordem'] ?? null;
        $dados = [
            'ordens' => $this->prestacaoModel->lerOrdens(),
            'valor_previsto' => '',
            'ordem' => null
        ];

        if ($id_ordem && is_numeric($id_ordem)) {
            $ordem = $this->prestacaoModel->buscarPorIdDaOrdem($id_ordem);
            $dados['ordem'] = $ordem;

            $valores = $this->prestacaoModel->obterValorPrevistoDaOrdem($id_ordem);
            if ($valores) {
                $valorTotal = floatval($valores->total_diarias) +
                              floatval($valores->valor_combustivel) +
                              floatval($valores->valor_passagens) +
                              floatval($valores->outras_despesas);
                $dados['valor_previsto'] = number_format($valorTotal, 2, ',', '');
            }

            $dados['id_ordem'] = $id_ordem;
        }

        $this->view('layout', [
            'conteudo' => __DIR__ . '/../Views/prestacao_contas/cadastrar.php',
            'dados'    => $dados
        ]);
    }


    
    public function editar($id)
    
    {
        function sanitizarValor($valor)
        {
            return floatval(str_replace(',', '.', str_replace('.', '', $valor)));
        }

        if ($_SERVER['REQUEST_METHOD'] == 'POST') {

               file_put_contents('log_debug.txt', "POST recebido\n", FILE_APPEND); // <-- aqui
            $formulario = filter_input_array(INPUT_POST, FILTER_SANITIZE_SPECIAL_CHARS);
            $id_ordem = $formulario['id_ordem'] ?? null;
            $valor_gasto = isset($formulario['valor_gasto']) ? sanitizarValor($formulario['valor_gasto']) : 0;
            $valor_previsto = isset($formulario['valor_previsto']) ? sanitizarValor($formulario['valor_previsto']) : 0;
            $descontos = isset($formulario['descontos']) ? sanitizarValor($formulario['descontos']) : 0;

            $valor_saldo = $valor_previsto - $valor_gasto - $descontos;

            if ($valor_saldo > 0) {
                $devolucao = $valor_saldo;
                $reembolso = 0.00;
            } else {
                $reembolso = abs($valor_saldo);
                $devolucao = 0.00;
            }

            $dados = [
                'id_prestacao_contas' => $id,
                'id_ordem'    => $id_ordem,
                'doc'         => $formulario['doc'] ?? '',
                'valor_gasto' => $valor_gasto,
                  'valor_previsto' => $valor_previsto,
                'reembolso'   => $reembolso,
                'devolucao'   => $devolucao,
                'descontos'   => $descontos,
                'obs'         => $formulario['obs'] ?? ''
            ];

         file_put_contents('log_debug.txt', "Dados recebidos:\n" . print_r($dados, true), FILE_APPEND);

if ($this->prestacaoModel->atualizar($dados)) {
    file_put_contents('log_debug.txt', "Atualizou no banco com sucesso\n", FILE_APPEND);

    $caminho = realpath(__DIR__ . '/../../public/comprovantes_prestacao/') . '/';
    if (!empty($_FILES['comprovantes']['name'][0])) {
        foreach ($_FILES['comprovantes']['name'] as $index => $nome) {
            $tmp = $_FILES['comprovantes']['tmp_name'][$index];
            if (!empty($tmp) && is_uploaded_file($tmp)) {
                $nomeSanitizado = preg_replace('/[^a-zA-Z0-9_\-.]/', '_', basename($nome));
                $nomeFinal = date('Ymd_His') . '_' . $nomeSanitizado;
                if (move_uploaded_file($tmp, $caminho . $nomeFinal)) {
                    $this->prestacaoModel->salvarComprovante([
                        'id_prestacao_contas' => $id,
                        'arquivo' => $nomeFinal
                    ]);
                }
            }
        }
    }

    Sessao::mensagem('prestacao_contas', 'Prestacao atualizada com sucesso!');
    ob_clean(); // limpa buffer antes do header
    header('Location: ' . URL . '/prestacao_contas');
    exit;

} else {
    file_put_contents('log_debug.txt', "❌ ERRO ao atualizar. Verifique o model PrestacaoContas->atualizar()\n", FILE_APPEND);
    Sessao::mensagem('prestacao_contas', 'Erro ao atualizar prestacao', 'alert alert-danger');
}

        }

        $prestacao = $this->prestacaoModel->lerPrestacaoPorId($id);
        $comprovantes = $this->prestacaoModel->obterComprovantes($id);

        $valor_previsto = 0;
        if ($prestacao && $prestacao->id_ordem) {
            $valores = $this->prestacaoModel->obterValorPrevistoDaOrdem($prestacao->id_ordem);
            if ($valores) {
                $valor_previsto = floatval($valores->total_diarias) +
                                  floatval($valores->valor_combustivel) +
                                  floatval($valores->valor_passagens) +
                                  floatval($valores->outras_despesas);
            }
        }

        $dados = [
            'prestacao'    => $prestacao,
            'ordens'       => $this->prestacaoModel->lerOrdens(),
            'comprovantes' => $comprovantes,
            'valor_previsto' => number_format($valor_previsto, 2, ',', '')
        ];

        $this->view('layout', [
            'conteudo' => __DIR__ . '/../Views/prestacao_contas/editar.php',
            'dados'    => $dados
        ]);
    }

   






public function editarPorOrdem($id_ordem)
{
    $prestacao = $this->prestacaoModel->buscarPorIdOrdem($id_ordem);

    if (!$prestacao) {
        Sessao::mensagem('prestacao_contas', 'Prestação não encontrada.', 'alert alert-danger');
        URL::redirecionar('ordens');
        exit;
    }

    // Redireciona corretamente para evitar POST duplo
    header('Location: ' . URL . '/prestacao_contas/editar/' . $prestacao->id_prestacao_contas);
    exit;
}




    public function visualizar($id)
    {
        $prestacao = $this->prestacaoModel->lerPrestacaoPorId($id);
        $comprovantes = $this->prestacaoModel->obterComprovantes($id);

        $dados = [
            'prestacao'    => $prestacao,
            'comprovantes' => $comprovantes
        ];
        $this->view('layout', [
            'conteudo' => __DIR__ . '/../Views/prestacao_contas/visualizar.php',
            'dados'    => $dados
        ]);
    }

   public function excluir($id)
{
    // Garante que só usuários autorizados executem
    if (!Sessao::usuarioLogado()) {
        URL::redirecionar('usuarios/login');
        return;
    }

    if ($this->prestacaoContaModel->remover($id)) {
        Sessao::mensagem('prestacao_contas', 'Prestação de contas excluída com sucesso.');
    } else {
        Sessao::mensagem('prestacao_contas', 'Erro ao excluir prestação de contas.', 'alert alert-danger');
    }

    URL::redirecionar('prestacao_contas');
}


public function exportarPdf($id)
{
    $ordemModel = new Ordem();
    $prestacao = $this->prestacaoModel->lerPrestacaoPorId($id);

    $ordem = $ordemModel->buscarPorId($prestacao->id_ordem);

    // Calcula valor previsto
    $valorPrevisto = $this->prestacaoModel->obterValorPrevistoDaOrdem($prestacao->id_ordem);
    $totalPrevisto = 0;
    if ($valorPrevisto) {
        $totalPrevisto = 
            floatval($valorPrevisto->total_diarias ?? 0) +
            floatval($valorPrevisto->valor_combustivel ?? 0) +
            floatval($valorPrevisto->valor_passagens ?? 0) +
            floatval($valorPrevisto->outras_despesas ?? 0);
    }

    // Preenche os dados
    if ($ordem && $prestacao) {
        $ordem->valor_total      = $totalPrevisto;
        $ordem->valor_gasto      = $prestacao->valor_gasto ?? 0;
        $ordem->valor_reembolso  = $prestacao->reembolso ?? 0;
        $ordem->valor_devolucao  = $prestacao->devolucao ?? 0;
        $ordem->observacoes      = $prestacao->obs ?? '';
    }

    $dados = ['ordem' => $ordem];

    ob_start();
    include_once __DIR__ . '/../Views/prestacao_contas/prestacao_pdf.php';
    $html = ob_get_clean();

    require_once __DIR__ . '/../../vendor/autoload.php';

    $mpdf = new \Mpdf\Mpdf(['mode' => 'utf-8', 'format' => 'A4']);
    $mpdf->WriteHTML($html);
    $mpdf->Output("prestacao_contas_{$id}.pdf", 'I');
}


    
}
