<?php

class Ordem
{
    private $db;
     private $pdo;
       

    public function __construct()
    {
        $this->db = new Database();
        
     
    }

    

   

    public function inserir($dados)
{
    $this->db->query("INSERT INTO ordens
        (id_departamento, id_responsavel, cidade_origem, cidade_destino, tipo_destino, id_veiculo,
         data_saida, data_chegada, hora_saida, hora_chegada, km_percorrido, km_inicial_ordem,km_final_ordem, motivo,acompanhantes,
         id_status, id_usuario, id_transporte, valor_passagem, combustivel_necessario,exercicio, observacao_cancelamento)
        VALUES
        (:id_departamento, :id_responsavel, :cidade_origem, :cidade_destino, :tipo_destino, :id_veiculo,
         :data_saida, :data_chegada, :hora_saida, :hora_chegada, :km_percorrido, :km_inicial_ordem,:km_final_ordem, :motivo,:acompanhantes,
         :id_status, :id_usuario, :id_transporte, :valor_passagem, :combustivel_necessario, :exercicio, :observacao_cancelamento)");

    $this->db->bind('id_departamento', $dados['id_departamento']);
    $this->db->bind('id_responsavel', $dados['id_responsavel']);
    $this->db->bind('cidade_origem', $dados['cidade_origem']);
    $this->db->bind('cidade_destino', $dados['cidade_destino']);
    $this->db->bind('tipo_destino', $dados['tipo_destino']);
    $this->db->bind('id_veiculo', $dados['id_veiculo']);
    $this->db->bind('data_saida', $dados['data_saida']);
    $this->db->bind('data_chegada', $dados['data_chegada']);
    $this->db->bind('hora_saida', $dados['hora_saida']);
    $this->db->bind('hora_chegada', $dados['hora_chegada']);
    $this->db->bind('km_percorrido', $dados['km_percorrido']);
    $this->db->bind(':km_inicial_ordem', $dados['km_inicial_ordem']);
     $this->db->bind(':km_final_ordem', $dados['km_final_ordem']);
    $this->db->bind('motivo', $dados['motivo']);
    $this->db->bind('acompanhantes', $dados['acompanhantes']);
    $this->db->bind('id_status', $dados['id_status']);
    $this->db->bind('id_usuario', $dados['id_usuario']);
    $this->db->bind('id_transporte', $dados['id_transporte']);
    $this->db->bind('valor_passagem', $dados['valor_passagem']);
    $this->db->bind('combustivel_necessario', $dados['combustivel_necessario']);
    $this->db->bind('observacao_cancelamento', $dados['observacao_cancelamento']);
    $this->db->bind(':exercicio', $dados['exercicio']);

    return $this->db->executa();
}




    

    public function atualizar($id, $dados)
{
    $this->db->query("
        UPDATE ordens SET
            id_departamento = :id_departamento,
            cidade_origem = :cidade_origem,
            cidade_destino = :cidade_destino,
            tipo_destino = :tipo_destino,
            id_veiculo = :id_veiculo,
            data_saida = :data_saida,
            data_chegada = :data_chegada,
            hora_saida = :hora_saida,
            hora_chegada = :hora_chegada,
            km_percorrido = :km_percorrido,
            km_inicial_ordem = :km_inicial_ordem,
            km_final_ordem = :km_final_ordem,
            motivo = :motivo,
            acompanhantes = :acompanhantes,
            id_status = :id_status,
            id_transporte = :id_transporte,
            valor_passagem = :valor_passagem,
            combustivel_necessario = :combustivel_necessario,
            observacao_cancelamento = :observacao_cancelamento,
            exercicio = :exercicio,
            alterado = NOW()
        WHERE id_ordem = :id_ordem
    ");

    // Normalizar para NULL se vazio
    $dados['cidade_origem'] = !empty($dados['cidade_origem']) ? $dados['cidade_origem'] : null;
    $dados['cidade_destino'] = !empty($dados['cidade_destino']) ? $dados['cidade_destino'] : null;
    $dados['id_veiculo'] = !empty($dados['id_veiculo']) ? $dados['id_veiculo'] : null;
    $dados['valor_passagem'] = isset($dados['valor_passagem']) ? $dados['valor_passagem'] : null;
    $dados['combustivel_necessario'] = isset($dados['combustivel_necessario']) ? $dados['combustivel_necessario'] : null;

    // Binds (corrigido: sem dois pontos)
    $this->db->bind('id_departamento', $dados['id_departamento']);
    $this->db->bind('cidade_origem', $dados['cidade_origem']);
    $this->db->bind('cidade_destino', $dados['cidade_destino']);
    $this->db->bind('tipo_destino', $dados['tipo_destino']);
    $this->db->bind('id_veiculo', $dados['id_veiculo']);
    $this->db->bind('data_saida', $dados['data_saida']);
    $this->db->bind('data_chegada', $dados['data_chegada']);
    $this->db->bind('hora_saida', $dados['hora_saida']);
    $this->db->bind('hora_chegada', $dados['hora_chegada']);
    $this->db->bind('km_percorrido', $dados['km_percorrido']);
    $this->db->bind('km_inicial_ordem', $dados['km_inicial_ordem']);
    $this->db->bind('km_final_ordem', $dados['km_final_ordem']);
    $this->db->bind('motivo', $dados['motivo']);
    $this->db->bind('acompanhantes', $dados['acompanhantes']);
    $this->db->bind('id_status', $dados['id_status']);
    $this->db->bind('id_transporte', $dados['id_transporte']);
    $this->db->bind('valor_passagem', $dados['valor_passagem']);
    $this->db->bind('combustivel_necessario', $dados['combustivel_necessario']);
    $this->db->bind('observacao_cancelamento', $dados['observacao_cancelamento']);
    $this->db->bind('exercicio', $dados['exercicio']);
    $this->db->bind('id_ordem', $id);

    try {
        return $this->db->executa();
    } catch (PDOException $e) {
        echo "<pre>Erro PDO ao atualizar ordem: " . $e->getMessage() . "</pre>";
        exit;
    }
}




    public function remover($id, $id_usuario)
    {
        $this->db->query("UPDATE ordens SET removido = NOW(), alterado = NOW(), id_usuario = :id_usuario WHERE id_ordem = :id_ordem");
        $this->db->bind("id_usuario", $id_usuario);
        $this->db->bind("id_ordem", $id);
        $this->db->executa();

        $this->db->query("UPDATE ordens_funcionarios SET removido = NOW() WHERE id_ordem = :id_ordem");
        $this->db->bind("id_ordem", $id);
        return $this->db->executa();
    }

   public function funcionarioEmOrdemAberta($id_funcionario, $id_ordem_atual = null)
{
    $sql = "
        SELECT COUNT(*) as total 
        FROM ordens_funcionarios ofunc
        JOIN ordens o ON o.id_ordem = ofunc.id_ordem
        WHERE ofunc.id_funcionario = :id_funcionario
          AND ofunc.removido IS NULL
          AND o.removido IS NULL
          AND o.id_status IN (1, 2, 3, 4)
    ";

    if ($id_ordem_atual) {
        $sql .= " AND o.id_ordem != :id_ordem_atual";
    }

    $this->db->query($sql);
    $this->db->bind(':id_funcionario', $id_funcionario);

    if ($id_ordem_atual) {
        $this->db->bind(':id_ordem_atual', $id_ordem_atual);
    }

    $resultado = $this->db->resultado();
    return $resultado ? $resultado->total > 0 : false;
}
    public function ultimoId()
    {
        return $this->db->ultimoId();
    }

    public function atualizarFuncionarios($id_ordem, $funcionarios)
    {
        $this->db->query("DELETE FROM ordens_funcionarios WHERE id_ordem = :id_ordem");
        $this->db->bind('id_ordem', $id_ordem);
        $this->db->executa();

        foreach ($funcionarios as $id_funcionario) {
            $this->db->query("INSERT INTO ordens_funcionarios (id_ordem, id_funcionario)
                              VALUES (:id_ordem, :id_funcionario)");
            $this->db->bind('id_ordem', $id_ordem);
            $this->db->bind('id_funcionario', $id_funcionario);
            $this->db->executa();
        }
    }

    public function atualizarOutrasDespesas($id_ordem, $despesas)
    {
        $this->db->query("DELETE FROM despesas_diversas WHERE id_ordem = :id_ordem");
        $this->db->bind('id_ordem', $id_ordem);
        $this->db->executa();

        foreach ($despesas as $d) {
            $this->db->query("INSERT INTO despesas_diversas (id_ordem, descricao, valor)
                              VALUES (:id_ordem, :descricao, :valor)");
            $this->db->bind('id_ordem', $id_ordem);
            $this->db->bind('descricao', $d['descricao']);
            $this->db->bind('valor', str_replace(',', '.', $d['valor']));
            $this->db->executa();
        }
    }





    public function listarComFuncionarios()
{
   $this->db->query("
    SELECT 
        o.*, 
        d.nome_departamento,
        v.placa AS veiculo_placa,
        s.descricao AS status_nome,
        s.id_status,
        c1.nome AS cidade_origem_nome,
        c2.nome AS cidade_destino_nome,
        GROUP_CONCAT(DISTINCT p.nome ORDER BY p.nome SEPARATOR ', ') AS funcionarios,
        (SELECT COUNT(*) 
         FROM prestacao_contas pc 
         WHERE pc.id_ordem = o.id_ordem 
           AND pc.removido IS NULL) > 0 AS tem_prestacao
    FROM ordens o
    LEFT JOIN departamentos d ON o.id_departamento = d.id_departamento
    LEFT JOIN veiculos v ON o.id_veiculo = v.id_veiculo
    LEFT JOIN status s ON o.id_status = s.id_status
    LEFT JOIN cidades c1 ON o.cidade_origem = c1.id_cidade
    LEFT JOIN cidades c2 ON o.cidade_destino = c2.id_cidade
    LEFT JOIN ordens_funcionarios ofunc ON o.id_ordem = ofunc.id_ordem AND ofunc.removido IS NULL
    LEFT JOIN funcionarios f ON f.id_funcionario = ofunc.id_funcionario
    LEFT JOIN pessoas p ON p.id_pessoa = f.id_pessoa
    WHERE o.removido IS NULL
    GROUP BY o.id_ordem
    ORDER BY o.id_ordem DESC
");

    return $this->db->resultados();
}





public function excluir($id)
{
    // Exclui despesas diversas
    $this->db->query("DELETE FROM despesas_diversas WHERE id_ordem = :id_ordem");
    $this->db->bind(':id_ordem', $id);
    $this->db->executa();

    // Exclui vínculos com funcionários
    $this->db->query("DELETE FROM ordens_funcionarios WHERE id_ordem = :id_ordem");
    $this->db->bind(':id_ordem', $id);
    $this->db->executa();

    // Exclui registros de diárias vinculados
    $this->db->query("DELETE FROM diarias_funcionarios WHERE id_ordem = :id_ordem");
    $this->db->bind(':id_ordem', $id);
    $this->db->executa();

    // Exclui a ordem
    $this->db->query("DELETE FROM ordens WHERE id_ordem = :id_ordem");
    $this->db->bind(':id_ordem', $id);
    return $this->db->executa();
}




public function listarTodos()
    {
        $this->db->query("
            SELECT 
                o.*, 
                d.nome_departamento,
                v.placa AS veiculo_placa,
                s.descricao AS status_nome,
                c1.nome AS cidade_origem_nome,
                c2.nome AS cidade_destino_nome
            FROM ordens o
            LEFT JOIN departamentos d ON o.id_departamento = d.id_departamento
            LEFT JOIN veiculos v ON o.id_veiculo = v.id_veiculo
            LEFT JOIN status s ON o.id_status = s.id_status
            LEFT JOIN cidades c1 ON o.cidade_origem = c1.id_cidade
            LEFT JOIN cidades c2 ON o.cidade_destino = c2.id_cidade
            WHERE o.removido IS NULL
            ORDER BY o.id_ordem DESC
        ");
        return $this->db->resultados();
    }







    public function buscarPorId($id)
{
   $this->db->query("
    SELECT 
        o.*, 
    o.data_saida,
    o.data_chegada,
    d.nome_departamento,
    s.descricao AS status,
    p.nome AS nome_responsavel,
    v.placa AS veiculo_placa,
    s.descricao AS status_nome,
    c1.nome AS cidade_origem_nome,
    c2.nome AS cidade_destino_nome,
    tt.descricao AS tipo_transporte_nome,
    o.tipo_destino
    FROM ordens o
    LEFT JOIN departamentos d ON o.id_departamento = d.id_departamento
    LEFT JOIN status s ON s.id_status = o.id_status
    LEFT JOIN funcionarios f ON f.id_funcionario = o.id_responsavel
    LEFT JOIN pessoas p ON p.id_pessoa = f.id_pessoa
    LEFT JOIN veiculos v ON o.id_veiculo = v.id_veiculo
    LEFT JOIN cidades c1 ON o.cidade_origem = c1.id_cidade
    LEFT JOIN cidades c2 ON o.cidade_destino = c2.id_cidade
    LEFT JOIN tipos_transporte tt ON o.id_transporte = tt.id_transporte
    WHERE o.id_ordem = :id AND o.removido IS NULL
");

    $this->db->bind("id", $id);
    $ordem = $this->db->resultado();

    if ($ordem) {
        // funcionários
        $this->db->query("
            SELECT 
                f.id_funcionario, 
                p.nome AS nome_pessoa, 
                fu.descricao AS cargo,
                f.id_departamento
            FROM ordens_funcionarios ofunc
            INNER JOIN funcionarios f ON ofunc.id_funcionario = f.id_funcionario
            INNER JOIN pessoas p ON f.id_pessoa = p.id_pessoa
            LEFT JOIN funcoes fu ON f.id_funcoes = fu.id_funcao
            WHERE ofunc.id_ordem = :id_ordem AND ofunc.removido IS NULL
        ");
        $this->db->bind("id_ordem", $id);
        $funcionarios = $this->db->resultados();

        $ordem->funcionarios = $funcionarios;
        $ordem->funcionarios_ids = array_map(fn($f) => $f->id_funcionario, $funcionarios);

        $ordem->diarias = $this->listarDiariasPorOrdem($id);
        $ordem->total_diarias = $this->calcularTotalDiariasPorOrdem($id);
        $ordem->despesas = $this->listarOutrasDespesas($id);
    }

    return $ordem;
}


    public function listarDiariasPorOrdem($id_ordem)
    {
        $this->db->query("SELECT * FROM diarias_funcionarios WHERE id_ordem = :id_ordem AND removido IS NULL");
        $this->db->bind(":id_ordem", $id_ordem);
        return $this->db->resultados();
    }

    public function calcularTotalDiariasPorOrdem($id_ordem)
    {
        $this->db->query("SELECT SUM(total) as total_diarias FROM diarias_funcionarios WHERE id_ordem = :id_ordem AND removido IS NULL");
        $this->db->bind(':id_ordem', $id_ordem);
        $row = $this->db->resultado();
        return $row && $row->total_diarias ? $row->total_diarias : 0;
    }

    public function listarOutrasDespesas($id_ordem)
    {
        $this->db->query("SELECT * FROM despesas_diversas WHERE id_ordem = :id_ordem");
        $this->db->bind(':id_ordem', $id_ordem);
        return $this->db->resultados();
    }

    public function calcularTotalPassagens($id_ordem)
{
    $sql = "SELECT COALESCE(SUM(valor), 0) as total FROM passagens WHERE id_ordem = :id_ordem";
    $this->db->query($sql);
    $this->db->bind(':id_ordem', $id_ordem);
    return $this->db->single()->total;
}

public function calcularTotalCombustivel($id_ordem)
{
    $sql = "SELECT combustivel_necessario, preco_combustivel 
            FROM ordens 
            WHERE id_ordem = :id_ordem";
    
    $this->db->query($sql);
    $this->db->bind(':id_ordem', $id_ordem);
    $row = $this->db->single();

    return $row ? ($row->combustivel_necessario * $row->preco_combustivel) : 0;
}





public function calcularTotalDiarias($id_ordem)
{
    $sql = "SELECT COALESCE(SUM(valor), 0) as total FROM diarias_funcionarios WHERE id_ordem = :id_ordem";
    $this->db->query($sql);
    $this->db->bind(':id_ordem', $id_ordem);
    return $this->db->single()->total;
}

public function calcularTotalDespesas($id_ordem)
{
    $sql = "SELECT COALESCE(SUM(valor), 0) as total FROM despesas_diversas WHERE id_ordem = :id_ordem";
    $this->db->query($sql);
    $this->db->bind(':id_ordem', $id_ordem);
    return $this->db->single()->total;
}

public function atualizarTotalDiarias($id, $total_diarias)
{
    $this->db->query("UPDATE ordens SET total_diarias = :total_diarias WHERE id_ordem = :id_ordem");
    $this->db->bind(':total_diarias', $total_diarias);
    $this->db->bind(':id_ordem', $id);
    return $this->db->executa();
}

public function lerPorId($id)
{
    $this->db->query("
        SELECT o.*, 
               d.nome_departamento AS nome_departamento,
               co.nome AS cidade_origem_nome,
               cd.nome AS cidade_destino_nome,
               t.descricao AS tipo_transporte,
               v.placa AS placa_veiculo,
               s.descricao AS status,
               p.nome AS nome_responsavel
        FROM ordens o
        LEFT JOIN departamentos d ON d.id_departamento = o.id_departamento
        LEFT JOIN cidades co ON co.id_cidade = o.cidade_origem
        LEFT JOIN cidades cd ON cd.id_cidade = o.cidade_destino
        LEFT JOIN tipos_transporte t ON t.id_transporte = o.id_transporte
        LEFT JOIN veiculos v ON v.id_veiculo = o.id_veiculo
        LEFT JOIN status s ON s.id_status = o.id_status
        LEFT JOIN funcionarios f ON f.id_funcionario = o.id_responsavel
        LEFT JOIN pessoas p ON p.id_pessoa = f.id_pessoa
        WHERE o.id_ordem = :id
    ");
    $this->db->bind("id", $id);
    return $this->db->resultado();
}






public function funcionariosPorOrdem($id_ordem)
{
    $this->db->query("
        SELECT f.id_funcionario, p.nome AS nome_pessoa, fu.descricao AS cargo
        FROM ordens_funcionarios ofn
        JOIN funcionarios f ON f.id_funcionario = ofn.id_funcionario
        JOIN pessoas p ON p.id_pessoa = f.id_pessoa
        JOIN funcoes fu ON fu.id_funcao = f.id_funcoes
        WHERE ofn.id_ordem = :id_ordem
    ");
    $this->db->bind("id_ordem", $id_ordem);
    return $this->db->resultados();
}

public function despesasPorOrdem($id_ordem)
{
    $this->db->query("
        SELECT * FROM despesas_diversas
        WHERE id_ordem = :id_ordem
    ");
    $this->db->bind("id_ordem", $id_ordem);
    return $this->db->resultados();
}

public function diariasPorOrdem($id_ordem)
{
    $this->db->query("
        SELECT df.*, p.nome AS nome_pessoa, df.qtde AS quantidade_diarias
        FROM diarias_funcionarios df
        JOIN funcionarios f ON f.id_funcionario = df.id_funcionario
        JOIN pessoas p ON p.id_pessoa = f.id_pessoa
        WHERE df.id_ordem = :id_ordem
    ");
    $this->db->bind("id_ordem", $id_ordem);
    return $this->db->resultados();
}


public function filtrarRelatorios($filtros)
{
    // Consulta principal com cidade de origem incluída
    $sql = "SELECT o.*, 
                   d.nome_departamento, 
                   c1.nome AS cidade_origem_nome,
                   c2.nome AS cidade_destino_nome,
                   s.descricao AS status,
                   p.nome AS nome_responsavel
            FROM ordens o
            LEFT JOIN departamentos d ON d.id_departamento = o.id_departamento
            LEFT JOIN cidades c1 ON c1.id_cidade = o.cidade_origem
            LEFT JOIN cidades c2 ON c2.id_cidade = o.cidade_destino
            LEFT JOIN status s ON s.id_status = o.id_status
            LEFT JOIN funcionarios f ON f.id_funcionario = o.id_responsavel
            LEFT JOIN pessoas p ON p.id_pessoa = f.id_pessoa
            WHERE o.removido IS NULL";

    if (!empty($filtros['data_inicio']) && !empty($filtros['data_fim'])) {
        $sql .= " AND DATE(o.data_saida) BETWEEN :data_inicio AND :data_fim";
    }

    if (!empty($filtros['cidade_destino'])) {
        $sql .= " AND c2.nome LIKE :cidade_destino";
    }

    if (!empty($filtros['departamento'])) {
        $sql .= " AND o.id_departamento = :departamento";
    }

    if (!empty($filtros['status']) && $filtros['status'] != 'Todos') {
        $sql .= " AND s.descricao = :status";
    }

    $this->db->query($sql);

    if (!empty($filtros['data_inicio']) && !empty($filtros['data_fim'])) {
        $this->db->bind(':data_inicio', $filtros['data_inicio']);
        $this->db->bind(':data_fim', $filtros['data_fim']);
    }

    if (!empty($filtros['cidade_destino'])) {
        $this->db->bind(':cidade_destino', '%' . $filtros['cidade_destino'] . '%');
    }

    if (!empty($filtros['departamento'])) {
        $this->db->bind(':departamento', $filtros['departamento']);
    }

    if (!empty($filtros['status']) && $filtros['status'] != 'Todos') {
        $this->db->bind(':status', $filtros['status']);
    }

    $ordens = $this->db->resultados();

    // 🔁 Para cada ordem, buscar os funcionários vinculados
    foreach ($ordens as &$ordem) {
        $sqlFunc = "SELECT pes.nome 
                    FROM ordens_funcionarios ofu
                    JOIN funcionarios f ON f.id_funcionario = ofu.id_funcionario
                    JOIN pessoas pes ON pes.id_pessoa = f.id_pessoa
                    WHERE ofu.id_ordem = :id_ordem";

        $this->db->query($sqlFunc);
        $this->db->bind(':id_ordem', $ordem->id_ordem);
        $ordem->funcionarios = $this->db->resultados();
    }

    return $ordens;
}









public function buscarDespesasPorOrdem($id_ordem)
{
    return $this->despesasPorOrdem($id_ordem);
}

public function buscarPassagensPorOrdem($id_ordem)
{
    $this->db->query("
        SELECT * FROM passagens WHERE id_ordem = :id_ordem
    ");
    $this->db->bind('id_ordem', $id_ordem);
    return $this->db->resultados();
}
public function calcularCombustivel($id_ordem)
{
    return $this->calcularTotalCombustivel($id_ordem);
}

public function relatorioOrdensAprovadas($data_inicio, $data_fim)
{
    $sql = "
        SELECT 
            o.id_ordem,
            o.data_saida,
            o.data_chegada,
            co.nome AS cidade_origem,
            cd.nome AS cidade_destino,
            d.nome_departamento,
            s.descricao AS status,
            COALESCE(o.total_diarias, 0) +
            COALESCE(o.valor_passagem, 0) +
            COALESCE(o.combustivel_necessario * o.preco_combustivel, 0) +
            (
                SELECT COALESCE(SUM(valor), 0)
                FROM despesas_diversas dd
                WHERE dd.id_ordem = o.id_ordem
            ) AS total
        FROM ordens o
        LEFT JOIN cidades co ON co.id_cidade = o.cidade_origem
        LEFT JOIN cidades cd ON cd.id_cidade = o.cidade_destino
        LEFT JOIN departamentos d ON d.id_departamento = o.id_departamento
        LEFT JOIN status s ON s.id_status = o.id_status
        WHERE o.id_status = 2 -- Aprovadas
        AND o.removido IS NULL
        AND DATE(o.data_saida) BETWEEN :inicio AND :fim
        ORDER BY o.data_saida ASC
    ";

    $this->db->query($sql);
    $this->db->bind(':inicio', $data_inicio);
    $this->db->bind(':fim', $data_fim);
    return $this->db->resultados();
}


public function listarFuncionariosEmViagem($filtros = [])
{
    $sql = "
    SELECT 
        f.id_funcionario, 
        p.nome AS nome_funcionario, 
        o.id_ordem, 
        c.nome AS cidade_destino_nome, 
        o.data_saida, 
        o.data_chegada
    FROM ordens o
    INNER JOIN ordens_funcionarios of ON of.id_ordem = o.id_ordem
    INNER JOIN funcionarios f ON f.id_funcionario = of.id_funcionario
    INNER JOIN pessoas p ON p.id_pessoa = f.id_pessoa
    INNER JOIN cidades c ON c.id_cidade = o.cidade_destino
    INNER JOIN status s ON s.id_status = o.id_status
    WHERE o.removido IS NULL 
      AND of.removido IS NULL
";

// Filtros dinâmicos
$params = [];

if (!empty($filtros['status']) && $filtros['status'] != 'Todos') {
    $sql .= " AND s.descricao = :status";
    $params[':status'] = $filtros['status'];
} else {
    $sql .= " AND s.descricao IN ('APROVADA', 'EM ANDAMENTO')";
}

if (!empty($filtros['data_inicio']) && !empty($filtros['data_fim'])) {
    $sql .= " AND (
        (o.data_saida BETWEEN :data_inicio AND :data_fim)
        OR (o.data_chegada BETWEEN :data_inicio AND :data_fim)
        OR (:data_inicio BETWEEN o.data_saida AND o.data_chegada)
        OR (:data_fim BETWEEN o.data_saida AND o.data_chegada)
    )";

    $params[':data_inicio'] = $filtros['data_inicio'];
    $params[':data_fim'] = $filtros['data_fim'];
}


    $sql .= " ORDER BY o.data_saida DESC";

    $this->db->query($sql);

    foreach ($params as $chave => $valor) {
        $this->db->bind($chave, $valor);
    }

    return $this->db->resultados();
}









public function listarVeiculosEmUso()
{
    $this->db->query("
        SELECT v.descricao AS veiculo, v.placa, o.id_ordem, s.descricao AS status
        FROM ordens o
        JOIN veiculos v ON v.id_veiculo = o.id_veiculo
        JOIN status s ON s.id_status = o.id_status
        WHERE o.removido IS NULL AND o.id_status IN (2, 3, 4)
    ");
    return $this->db->resultados();
}

public function listarDiariasPorFuncionario()
{
    $this->db->query("
        SELECT p.nome AS funcionario, df.qtde AS quantidade_diarias, df.valor_total
        FROM diarias_funcionarios df
        JOIN funcionarios f ON f.id_funcionario = df.id_funcionario
        JOIN pessoas p ON p.id_pessoa = f.id_pessoa
        WHERE df.removido IS NULL
    ");
    return $this->db->resultados();
}

public function listarDespesasGerais()
{
    $this->db->query("
        SELECT 'Despesa Diversa' AS tipo, dd.descricao, dd.valor
        FROM despesas_diversas dd
        UNION ALL
        SELECT 'Passagem', '', p.valor
        FROM passagens p
    ");
    return $this->db->resultados();
}

public function lerOrdemCompleta($id)
{
    return $this->buscarPorId($id); // se já busca todos os dados (funcionários, despesas, diárias)
}

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

    if ($ordem) {
        $ordem->total_passagens = $this->calcularTotalPassagens($id);
        $ordem->total_despesas = $this->calcularTotalDespesas($id);
        $ordem->total_combustivel = $this->calcularTotalCombustivel($id);
        $ordem->total_diarias = $this->calcularTotalDiarias($id);

        $ordem->valor_total_geral = $ordem->total_passagens + $ordem->total_despesas + $ordem->total_combustivel + $ordem->total_diarias;
    }

    return $ordem;
}

public function obterDespesasPorMes()
{
    $sql = "
        SELECT 
            MONTH(o.data_saida) AS mes,
            SUM(df.total) AS total
        FROM ordens o
        INNER JOIN diarias_funcionarios df ON df.id_ordem = o.id_ordem
        WHERE o.removido IS NULL AND df.removido IS NULL
        GROUP BY mes
        ORDER BY mes
    ";

    $stmt = Database::getInstance()->prepare($sql);
    $stmt->execute();
    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}



public function obterDespesasPorTipo()
{
    $sql = "
        SELECT 
            tt.descricao AS tipo,
            SUM(df.total) AS total
        FROM ordens o
        INNER JOIN diarias_funcionarios df ON df.id_ordem = o.id_ordem
        LEFT JOIN tipos_transporte tt ON o.id_transporte = tt.id_transporte
        WHERE o.removido IS NULL AND df.removido IS NULL
        GROUP BY tt.descricao
    ";

    $stmt = Database::getInstance()->prepare($sql);
    $stmt->execute();
    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}


public function obterOrdensPorStatus()
{
    $sql = "
        SELECT 
            status,
            COUNT(*) AS total
        FROM ordens
        WHERE removido IS NULL
        GROUP BY status
    ";

    $stmt = Database::getInstance()->prepare($sql);
    $stmt->execute();
    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

public function diariasPorFuncionario()
{
    $sql = "
        SELECT 
            f.nome,
            SUM(df.valor_total) AS total
        FROM diarias_funcionarios df
        INNER JOIN funcionarios f ON df.id_funcionario = f.id_funcionario
        INNER JOIN ordens o ON df.id_ordem = o.id_ordem
        WHERE df.removido IS NULL AND o.removido IS NULL
        GROUP BY f.nome
        ORDER BY total DESC
        LIMIT 5
    ";

    $stmt = Database::getInstance()->prepare($sql);
    $stmt->execute();
    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
public function buscarDiariasPorOrdem($id_ordem)
{
    $sql = "SELECT 
                d.valor AS valor_diaria,
                SUM(d.qtde) AS total_diarias,
                SUM(d.total) AS total_valor
            FROM diarias_funcionarios d
            WHERE d.id_ordem = :id_ordem
            GROUP BY d.valor
            ORDER BY d.valor DESC";

    $this->db->query($sql);
    $this->db->bind(':id_ordem', $id_ordem);
    return $this->db->resultados();
}





}






