

<?php
use \Mpdf\Mpdf;

class OrdensController extends Controller
{
    private $ordemModel, $departamentoModel, $cidadeModel, $funcionarioModel, $veiculoModel, $statusModel, $transporteModel,$db;

    public function __construct()
    
    {
        
        $this->ordemModel        = $this->model('Ordem');
        $this->departamentoModel = $this->model('Departamento');
        $this->cidadeModel       = $this->model('Cidade');
        $this->funcionarioModel  = $this->model('Funcionario');
        $this->veiculoModel      = $this->model('Veiculo');
        $this->statusModel       = $this->model('Status');
        $this->transporteModel   = $this->model('TipoTransporte');
    }

    public function index()
    {
        $dados['ordens'] = $this->ordemModel->listarComFuncionarios();
        $this->view('layout', [
            'conteudo' => __DIR__ . '/../Views/ordens/index.php',
            'dados'    => $dados
        ]);
    }

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

        // LOG do POST
        file_put_contents('debug_ordens.txt', date('Y-m-d H:i:s')." - POST cadastrar:\n".print_r($_POST,true)."\n", FILE_APPEND);

        // Normalizar tipo destino
        $tipo_destino_normalizado = strtolower(str_replace(' ', '_', $_POST['tipo_destino']));

        // Validação das cidades
        if ($tipo_destino_normalizado != 'viagens_internacionais') {
            if (empty($_POST['cidade_origem']) || empty($_POST['cidade_destino'])) {
                Sessao::mensagem('ordens', 'Informe a cidade de origem e destino.', 'alert alert-danger');
                header('Location: ' . URL . '/ordens/cadastrar');
                exit;
            }
            $cidade_origem = $_POST['cidade_origem'];
            $cidade_destino = $_POST['cidade_destino'];
        } else {
            $cidade_origem = null;
            $cidade_destino = null;
        }

        // Dados principais
        $dados = [
    'id_departamento' => $_POST['id_departamento'],
    'id_responsavel'  => $_POST['id_responsavel'],
    'cidade_origem'   => $cidade_origem,
    'cidade_destino'  => $cidade_destino,
    'tipo_destino'    => $tipo_destino_normalizado,
    'id_veiculo'      => !empty($_POST['id_veiculo']) ? $_POST['id_veiculo'] : null,
    'id_status'       => $_POST['id_status'], // <-- agora vem do form
    'id_transporte'   => $_POST['id_transporte'],
    'data_saida'      => $_POST['data_saida'],
    'hora_saida'      => $_POST['hora_saida'],
    'data_chegada'    => $_POST['data_chegada'],
    'hora_chegada'    => $_POST['hora_chegada'],
    'motivo'          => $_POST['motivo'],
     'acompanhantes'   => trim($_POST['acompanhantes']), // <- aqui está o novo campo
    'km_percorrido'   => $_POST['km_percorrido'],
    'km_inicial_ordem' => $_POST['km_inicial_ordem'] ?? null,
      'km_final_ordem'   => $_POST['km_final_ordem'] ?? null,
    'valor_passagem'  => !empty($_POST['valor_passagem']) ? str_replace(',', '.', $_POST['valor_passagem']) : null,
    'combustivel_necessario' => $_POST['combustivel_necessario'],
    'observacao_cancelamento' => $_POST['observacao_cancelamento'] ?? null,
    'id_usuario'      => $_SESSION['usuario_id'],
    'exercicio' => date('Y'),
];

 if (!empty($dados['km_inicial_ordem']) && !empty($dados['km_final_ordem'])) {
    if ($dados['km_final_ordem'] < $dados['km_inicial_ordem']) {
        Sessao::mensagem('ordens', 'Erro: o KM Final não pode ser menor que o KM Inicial.', 'alert alert-danger');
        header('Location: ' . URL . '/ordens/cadastrar');
        exit;
    }
}
        // Validação de datas
        $data_saida = new DateTime($_POST['data_saida'].' '.$_POST['hora_saida']);
        $data_chegada = new DateTime($_POST['data_chegada'].' '.$_POST['hora_chegada']);

        if ($data_chegada < $data_saida) {
            Sessao::mensagem('ordens', 'A data final não pode ser anterior à data inicial.', 'alert alert-danger');
            header('Location: ' . URL . '/ordens/cadastrar');
            exit;
        }

        file_put_contents('debug_ordens.txt', date('Y-m-d H:i:s')." - dados inserir:\n".print_r($dados,true)."\n", FILE_APPEND);

        if ($this->ordemModel->inserir($dados)) {
            $id_ordem = $this->ordemModel->ultimoId();

            if (!empty($dados['km_final_ordem']) && !empty($dados['id_veiculo'])) {
   if (!empty($dados['km_final_ordem']) && !empty($dados['id_veiculo'])) {
    $this->veiculoModel->atualizarKmMaximo($dados['id_veiculo'], $dados['km_final_ordem']);

   }}


            // Atualiza funcionários e despesas
            $this->ordemModel->atualizarFuncionarios($id_ordem, $_POST['funcionarios'] ?? []);
            $this->ordemModel->atualizarOutrasDespesas($id_ordem, $_POST['outras_despesas'] ?? []);

            // Calcula diárias
            $diariasFuncionariosModel = $this->model('DiariasFuncionarios');
            $diariasValoresModel = $this->model('DiariasValores');

            foreach ($_POST['funcionarios'] ?? [] as $id_funcionario) {
                $funcionario = $this->funcionarioModel->lerFuncionarioPorId($id_funcionario);
                if (!$funcionario) continue;

               // NÃO USE MAIS ISSO
/*
if ($tipo_destino_normalizado == 'viagens_internacionais') {
    $tipo_destino_calc = 'viagens_internacionais';
} else {
    $cidade = $this->cidadeModel->lerCidadePorId($cidade_destino);
    $tipo_destino_calc = strtolower(str_replace(' ', '_', $cidade ? $cidade->tipo_destino : 'outras_cidades'));
}
*/

// USE APENAS ISSO:
$tipo_destino_calc = $tipo_destino_normalizado;

                $cargo = strtoupper($funcionario->cargo);
                $valor_unitario = $diariasValoresModel->buscarValorPorFuncaoEDestino($cargo, $tipo_destino_calc);

                $diff_horas = ($data_chegada->getTimestamp() - $data_saida->getTimestamp()) / 3600;

                if ($diff_horas <= 4) {
                    $quantidade_diarias = 0;
                } elseif ($diff_horas <= 24) {
                    $quantidade_diarias = 1;
                } else {
                    $quantidade_diarias = ceil($diff_horas / 24);
                }

                $total = $quantidade_diarias * $valor_unitario;

                $dadosDiaria = [
                    'id_ordem'       => $id_ordem,
                    'id_funcionario' => $id_funcionario,
                    'qtde'           => $quantidade_diarias,
                    'valor'          => $valor_unitario,
                    'total'          => $total,
                    'id_usuario'     => $_SESSION['usuario_id']
                ];

                file_put_contents('debug_ordens.txt', date('Y-m-d H:i:s')." - dados diaria:\n".print_r($dadosDiaria,true)."\n", FILE_APPEND);

                $diariasFuncionariosModel->armazenar($dadosDiaria);
            }

            Sessao::mensagem('ordens', 'Ordem cadastrada com sucesso!');
            header('Location: ' . URL . '/ordens');
            exit;
        } else {
            Sessao::mensagem('ordens', 'Erro ao cadastrar ordem.', 'alert alert-danger');
            header('Location: ' . URL . '/ordens/cadastrar');
            exit;
        }
    }

    // Carrega dados para o formulário
    $dados['departamentos']    = $this->departamentoModel->listarTodos();
    $dados['cidades']          = $this->cidadeModel->listarTodos();
    $dados['funcionarios']     = $this->funcionarioModel->listarTodos();
    foreach ($dados['funcionarios'] as &$func) {
        $func->em_ordem_aberta = $this->ordemModel->funcionarioEmOrdemAberta($func->id_funcionario);
    }
    $dados['veiculos']         = $this->veiculoModel->listarTodos();
    $dados['status']           = $this->statusModel->listarTodos();
    $dados['tipos_transporte'] = $this->transporteModel->listarTodos();

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



public function editar($id)
{
    if ($_SERVER['REQUEST_METHOD'] == 'POST') {

        // Log do POST recebido para debug
        file_put_contents('debug_ordens.txt', date('Y-m-d H:i:s')." - POST editar:\n".print_r($_POST,true)."\n", FILE_APPEND);

        // Normaliza tipo destino
        $tipo_destino_normalizado = strtolower(str_replace(' ', '_', $_POST['tipo_destino']));

        // Validação das cidades
        if ($tipo_destino_normalizado != 'viagens_internacionais') {
            if (empty($_POST['cidade_origem']) || empty($_POST['cidade_destino'])) {
                Sessao::mensagem('ordens', 'Selecione a cidade de origem e destino.', 'alert alert-danger');
                header('Location: ' . URL . '/ordens/editar/' . $id);
                exit;
            }
            $cidade_origem = $_POST['cidade_origem'];
            $cidade_destino = $_POST['cidade_destino'];
        } else {
            $cidade_origem = null;
            $cidade_destino = null;
        }

        // Dados principais para update
        $dados = [
            'id_departamento' => $_POST['id_departamento'],
            'id_responsavel'  => $_POST['id_responsavel'],
            'cidade_origem'   => $cidade_origem,
            'cidade_destino'  => $cidade_destino,
            'tipo_destino'    => $tipo_destino_normalizado,
            'id_veiculo'      => !empty($_POST['id_veiculo']) ? $_POST['id_veiculo'] : null,
            'id_status'       => $_POST['id_status'],
            'id_transporte'   => $_POST['id_transporte'],
            'data_saida'      => $_POST['data_saida'],
            'hora_saida'      => $_POST['hora_saida'],
            'data_chegada'    => $_POST['data_chegada'],
            'hora_chegada'    => $_POST['hora_chegada'],
            'motivo'          => $_POST['motivo'],
             'acompanhantes'   => trim($_POST['acompanhantes']), // <- aqui está o novo campo
            'km_percorrido'   => $_POST['km_percorrido'],
            'km_inicial_ordem' => $_POST['km_inicial_ordem'] ?? null,
            'km_final_ordem'   => $_POST['km_final_ordem'] ?? null,
            'valor_passagem'  => !empty($_POST['valor_passagem']) ? str_replace(',', '.', $_POST['valor_passagem']) : null,
            'combustivel_necessario' => $_POST['combustivel_necessario'],
            'observacao_cancelamento' => $_POST['observacao_cancelamento'] ?? null,
            'id_usuario'      => $_SESSION['usuario_id'],
            'exercicio' => date('Y'),
        ];

         // ✅ VALIDAÇÃO KM
        if (!empty($dados['km_inicial_ordem']) && !empty($dados['km_final_ordem'])) {
            if ($dados['km_final_ordem'] < $dados['km_inicial_ordem']) {
                Sessao::mensagem('ordens', 'Erro: o KM Final não pode ser menor que o KM Inicial.', 'alert alert-danger');
                header('Location: ' . URL . '/ordens/editar/' . $id);
                exit;
            }
        }

        // Validação de datas
        $data_saida = new DateTime($_POST['data_saida'].' '.$_POST['hora_saida']);
        $data_chegada = new DateTime($_POST['data_chegada'].' '.$_POST['hora_chegada']);

        if ($data_chegada < $data_saida) {
            Sessao::mensagem('ordens', 'A data final não pode ser anterior à data inicial.', 'alert alert-danger');
            header('Location: ' . URL . '/ordens/editar/' . $id);
            exit;
        }

        file_put_contents('debug_ordens.txt', date('Y-m-d H:i:s')." - dados atualizar:\n".print_r($dados,true)."\n", FILE_APPEND);

        // Atualiza ordem
        if ($this->ordemModel->atualizar($id, $dados)) {

            // Atualiza funcionários e despesas
            $this->ordemModel->atualizarFuncionarios($id, $_POST['funcionarios'] ?? []);
            $this->ordemModel->atualizarOutrasDespesas($id, $_POST['outras_despesas'] ?? []);

            // Recalcula diárias
            $diariasFuncionariosModel = $this->model('DiariasFuncionarios');
            $diariasValoresModel = $this->model('DiariasValores');
            $diariasFuncionariosModel->excluirPorOrdem($id);

            $total_diarias = 0;  // Inicializa a variável para o total de diárias

            foreach ($_POST['funcionarios'] ?? [] as $id_funcionario) {
                $funcionario = $this->funcionarioModel->lerFuncionarioPorId($id_funcionario);
                if (!$funcionario) continue;

                // NÃO USE MAIS ISSO
/*
if ($tipo_destino_normalizado == 'viagens_internacionais') {
    $tipo_destino_calc = 'viagens_internacionais';
} else {
    $cidade = $this->cidadeModel->lerCidadePorId($cidade_destino);
    $tipo_destino_calc = strtolower(str_replace(' ', '_', $cidade ? $cidade->tipo_destino : 'outras_cidades'));
}
*/

// USE APENAS ISSO:
$tipo_destino_calc = $tipo_destino_normalizado;

                // Busca valor da diária
                $cargo = strtoupper($funcionario->cargo);
                $valor_unitario = $diariasValoresModel->buscarValorPorFuncaoEDestino($cargo, $tipo_destino_calc);

                // Calcula quantidade
                $data_saida = new DateTime($_POST['data_saida'].' '.$_POST['hora_saida']);
                $data_chegada = new DateTime($_POST['data_chegada'].' '.$_POST['hora_chegada']);
                $diff_horas = ($data_chegada->getTimestamp() - $data_saida->getTimestamp()) / 3600;
                $quantidade_diarias = ceil($diff_horas / 24);
                if ($quantidade_diarias < 1) $quantidade_diarias = 1;

                $total = $quantidade_diarias * $valor_unitario;

                // Insere diária
                $dadosDiaria = [
                    'id_ordem'       => $id,
                    'id_funcionario' => $id_funcionario,
                    'qtde'           => $quantidade_diarias,
                    'valor'          => $valor_unitario,
                    'total'          => $total,
                    'id_usuario'     => $_SESSION['usuario_id']
                ];

                file_put_contents('debug_ordens.txt', date('Y-m-d H:i:s')." - dados diaria editar:\n".print_r($dadosDiaria,true)."\n", FILE_APPEND);

                $diariasFuncionariosModel->armazenar($dadosDiaria);

                // Adiciona o valor da diária ao total
                $total_diarias += $total;
            }

            // Agora que o total de diárias foi calculado, atualiza o valor total na ordem
            $this->ordemModel->atualizarTotalDiarias($id, $total_diarias);  // Função para atualizar o total de diárias na ordem

            Sessao::mensagem('ordens', 'Ordem atualizada com sucesso!');
            header('Location: ' . URL . '/ordens');
            exit;

        } else {
            echo "Falha ao atualizar ordem.";
            exit;
        }
    }

    // Carrega dados para view
    $dados['ordem'] = $this->ordemModel->buscarPorId($id);
    $dados['ordem']->total_diarias = $this->ordemModel->calcularTotalDiarias($id);
    $dados['despesas_diversas'] = $this->ordemModel->listarOutrasDespesas($id);

    // Calcula total das despesas
    $total_despesas = 0;
    foreach ($dados['despesas_diversas'] as $despesa) {
        $total_despesas += floatval($despesa->valor);
    }

    // Total geral = diárias + despesas
    $dados['total_geral'] = $dados['ordem']->total_diarias + $total_despesas;

    if (!$dados['ordem']) {
        Sessao::mensagem('ordens', 'Ordem não encontrada!', 'alert alert-danger');
        header('Location: ' . URL . '/ordens');
        exit;
    }

    // Demais dados para selects
    $dados['departamentos']    = $this->departamentoModel->listarTodos();
    $dados['cidades']          = $this->cidadeModel->listarTodos();
    $dados['funcionarios']     = $this->funcionarioModel->listarTodos();
    foreach ($dados['funcionarios'] as &$func) {
        $func->em_ordem_aberta = $this->ordemModel->funcionarioEmOrdemAberta($func->id_funcionario, $id);
    }
    $dados['veiculos']         = $this->veiculoModel->listarTodos();
    $dados['status']           = $this->statusModel->listarTodos();
    $dados['tipos_transporte'] = $this->transporteModel->listarTodos();

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


















    





  

   



public function visualizar($id)
{
    // Buscar dados da ordem
    $ordem = $this->ordemModel->buscarPorId($id);

    // Verifica se a ordem existe
    if (!$ordem) {
        Sessao::mensagem('ordens', 'Ordem não encontrada!', 'alert alert-danger');
        header('Location: ' . URL . '/ordens');
        exit;
    }

    // Totais
    $total_passagens       = $this->ordemModel->calcularTotalPassagens($id);
    $total_outras_despesas = $this->ordemModel->calcularTotalDespesas($id);
    $total_diarias         = $this->ordemModel->calcularTotalDiarias($id);
    $total_geral           = $total_passagens + $total_outras_despesas + $total_diarias;

    // Montar array de dados
    $dados = [
        'ordem'                 => $ordem,
        'total_passagens'      => $total_passagens,
        'total_outras_despesas'=> $total_outras_despesas,
        'total_diarias'        => $total_diarias,
        'total_geral'          => $total_geral,
        'diarias'              => $this->ordemModel->buscarDiariasPorOrdem($id) // <- aqui está o ajuste
    ];

    // Carrega a view
    $this->view('layout', [
        'conteudo' => __DIR__ . '/../Views/ordens/visualizar.php',
        'dados'    => $dados
    ]);
}



public function deletar($id)
{
    $ordem = $this->ordemModel->buscarPorId($id);

    // Impede exclusão se a ordem estiver finalizada
    if ($ordem && strtoupper($ordem->status_nome) === 'FINALIZADA') {
        Sessao::mensagem('ordens', 'Não é possível excluir uma ordem FINALIZADA.', 'alert alert-warning');
        header('Location: ' . URL . '/ordens');
        exit;
    }

    if ($this->ordemModel->excluir($id)) {
        Sessao::mensagem('ordens', 'Ordem removida com sucesso!');
    } else {
        Sessao::mensagem('ordens', 'Erro ao remover ordem!', 'alert alert-danger');
    }

    header('Location: ' . URL . '/ordens');
    exit;
}


public function exportarPdf($id)
{
    $ordem = $this->ordemModel->lerPorId($id);
    $funcionarios = $this->ordemModel->funcionariosPorOrdem($id);
    $despesas = $this->ordemModel->despesasPorOrdem($id);

    $totais = [
        'diarias' => $this->ordemModel->calcularTotalDiarias($id),
        'despesas' => $this->ordemModel->calcularTotalDespesas($id),
        'passagens' => $this->ordemModel->calcularTotalPassagens($id),
        'combustivel' => $this->ordemModel->calcularTotalCombustivel($id),
    ];
    $totais['geral'] = $totais['diarias'] + $totais['despesas'] + $totais['passagens'] + $totais['combustivel'];

    ob_start();
    require_once '../app/Views/ordens/pdf.php';
    $html = ob_get_clean();

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


public function relatorioFinanceiro($id) {
    $ordem = $this->ordemModel->buscarPorId($id);
    $funcionarios = $this->ordemModel->buscarFuncionariosDaOrdem($id);
    $diarias = $this->ordemModel->buscarDiariasPorOrdem($id);
    $despesas = $this->ordemModel->buscarDespesasPorOrdem($id);
    $passagens = $this->ordemModel->buscarPassagensPorOrdem($id);
    $combustivel = $this->ordemModel->calcularCombustivel($id); // se aplicável

    $this->view('ordens/relatorio_financeiro', [
        'ordem' => $ordem,
        'funcionarios' => $funcionarios,
        'diarias' => $diarias,
        'despesas' => $despesas,
        'passagens' => $passagens,
        'combustivel' => $combustivel
    ]);
}

public function exportarRelatorioFinanceiroPdf($id)
{
    $ordemModel = new Ordem();

    $ordem = $ordemModel->buscarPorId($id);
    $diarias = $ordemModel->buscarDiariasPorOrdem($id);
    $despesas = $ordemModel->buscarDespesasPorOrdem($id);
    $passagens = $ordemModel->buscarPassagensPorOrdem($id);
    $totalCombustivel = $ordemModel->calcularTotalCombustivel($id);

    $totais = [
        'diarias' => $ordemModel->calcularTotalDiarias($id),
        'despesas' => $ordemModel->calcularTotalDespesas($id),
        'passagens' => $ordemModel->calcularTotalPassagens($id),
        'combustivel' => $totalCombustivel,
    ];
    $totais['geral'] = $totais['diarias'] + $totais['despesas'] + $totais['passagens'] + $totais['combustivel'];

    $dados = [
        'ordem' => $ordem,
        'diarias' => $diarias,
        'despesas' => $despesas,
        'passagens' => $passagens,
        'totais' => $totais
    ];

    // Renderizar a view em HTML para o mPDF
    ob_start();
    require_once '../app/Views/ordens/relatorio_financeiro_pdf.php'; // ou use o caminho adequado
    $html = ob_get_clean();

    // Geração do PDF
    $mpdf = new \Mpdf\Mpdf();
    $mpdf->WriteHTML($html);
    $mpdf->Output("relatorio_ordem_{$id}.pdf", 'I'); // I = inline
}



public function relatorio()
{
    $filtros = [
        'data_inicio' => $_GET['data_inicio'] ?? '',
        'data_fim' => $_GET['data_fim'] ?? '',
        'cidade_destino' => $_GET['cidade_destino'] ?? '',
        'departamento' => $_GET['departamento'] ?? '',
        'status' => $_GET['status'] ?? ''
    ];

    $dados['relatorios'] = $this->ordemModel->filtrarRelatorios($filtros); // <--- correto

     // INSIRA ABAIXO:
   // echo "<pre>";
    //print_r($dados['relatorios']);
    //echo "</pre>";
    //exit;

    $dados['filtros'] = $filtros;
    $dados['cidades'] = $this->cidadeModel->listarTodos();
    $dados['departamentos'] = $this->departamentoModel->listarTodos();
    $dados['status_lista'] = $this->statusModel->listarTodos();

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


public function ordensAprovadas()
{
    $dados = [
        'ordens' => [],
        'data_inicio' => '',
        'data_fim' => ''
    ];

    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        $data_inicio = $_POST['data_inicio'];
        $data_fim = $_POST['data_fim'];

        $model = new Ordem();
        $ordens = $model->relatorioOrdensAprovadas($data_inicio, $data_fim);

        $dados['ordens'] = $ordens;
        $dados['data_inicio'] = $data_inicio;
        $dados['data_fim'] = $data_fim;
    }

    $this->view('relatorios/ordens_aprovadas', $dados);
}



}
