<?php

class PrestacaoContas
{
    private $db;

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

    public function lerPrestacoes()
    {
        $this->db->query("
            SELECT 
                pc.*, 
                o.id_ordem as numero_ordem,
                (
                    SELECT 
                        COALESCE(SUM(df.total), 0) +
                        COALESCE(SUM(CASE WHEN LOWER(dd.descricao) LIKE '%combustivel%' THEN dd.valor ELSE 0 END), 0) +
                        COALESCE(SUM(CASE WHEN LOWER(dd.descricao) LIKE '%passagem%' THEN dd.valor ELSE 0 END), 0) +
                        COALESCE(SUM(CASE WHEN LOWER(dd.descricao) NOT LIKE '%combustivel%' AND LOWER(dd.descricao) NOT LIKE '%passagem%' THEN dd.valor ELSE 0 END), 0)
                    FROM ordens o2
                    LEFT JOIN diarias_funcionarios df ON o2.id_ordem = df.id_ordem
                    LEFT JOIN despesas_diversas dd ON o2.id_ordem = dd.id_ordem
                    WHERE o2.id_ordem = pc.id_ordem
                ) AS valor_previsto
            FROM prestacao_contas pc
            LEFT JOIN ordens o ON pc.id_ordem = o.id_ordem
            WHERE pc.removido IS NULL
            ORDER BY pc.criado_em DESC
        ");
        return $this->db->resultados();
    }

    public function lerPrestacaoPorId($id)
    {
        $this->db->query("
            SELECT pc.*, o.id_ordem as numero_ordem
            FROM prestacao_contas pc
            LEFT JOIN ordens o ON pc.id_ordem = o.id_ordem
            WHERE pc.id_prestacao_contas = :id AND pc.removido IS NULL
        ");
        $this->db->bind("id", $id);
        return $this->db->resultado();
    }

    public function armazenar($dados)
{
    try {
        $dados['valor_gasto'] = floatval($dados['valor_gasto'] ?? 0);
        $dados['reembolso']   = floatval($dados['reembolso'] ?? 0);
        $dados['devolucao']   = floatval($dados['devolucao'] ?? 0);
        $dados['descontos']   = floatval($dados['descontos'] ?? 0);

        $this->db->query("
            INSERT INTO prestacao_contas 
                (id_ordem, doc, valor_gasto, reembolso, devolucao, descontos, obs, id_usuario)
            VALUES 
                (:id_ordem, :doc, :valor_gasto, :reembolso, :devolucao, :descontos, :obs, :id_usuario)
        ");

        $this->db->bind('id_ordem', $dados['id_ordem']);
        $this->db->bind('doc', $dados['doc']);
        $this->db->bind('valor_gasto', $dados['valor_gasto']);
        $this->db->bind('reembolso', $dados['reembolso']);
        $this->db->bind('devolucao', $dados['devolucao']);
        $this->db->bind('descontos', $dados['descontos']);
        $this->db->bind('obs', $dados['obs']);
        $this->db->bind('id_usuario', $dados['id_usuario']);

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

    } catch (PDOException $e) {
        file_put_contents('public/log_erros_prestacao.txt', date('Y-m-d H:i:s') . " - Erro: " . $e->getMessage() . PHP_EOL, FILE_APPEND);
        return false;
    }
}

    public function atualizar($dados)
{
    try {
        // Sanitize e formata os valores numéricos
        $dados['valor_gasto']     = floatval($dados['valor_gasto'] ?? 0);
        $dados['valor_previsto']  = floatval($dados['valor_previsto'] ?? 0);
        $dados['reembolso']       = floatval($dados['reembolso'] ?? 0);
        $dados['devolucao']       = floatval($dados['devolucao'] ?? 0);
        $dados['descontos']       = floatval($dados['descontos'] ?? 0);

        // Prepara a query com todos os campos necessários
        $this->db->query("
            UPDATE prestacao_contas SET
                id_ordem        = :id_ordem,
                doc             = :doc,
                valor_gasto     = :valor_gasto,
                valor_previsto  = :valor_previsto,
                reembolso       = :reembolso,
                devolucao       = :devolucao,
                descontos       = :descontos,
                obs             = :obs,
                alterado        = NOW()
            WHERE id_prestacao_contas = :id_prestacao_contas
        ");

        // Faz o bind apenas dos campos utilizados na query
        $this->db->bind(':id_ordem', $dados['id_ordem']);
        $this->db->bind(':doc', $dados['doc']);
        $this->db->bind(':valor_gasto', $dados['valor_gasto']);
        $this->db->bind(':valor_previsto', $dados['valor_previsto']);
        $this->db->bind(':reembolso', $dados['reembolso']);
        $this->db->bind(':devolucao', $dados['devolucao']);
        $this->db->bind(':descontos', $dados['descontos']);
        $this->db->bind(':obs', $dados['obs']);
        $this->db->bind(':id_prestacao_contas', $dados['id_prestacao_contas']);

        // Executa a atualização
        return $this->db->executa();

    } catch (PDOException $e) {
        // Log de erro
        $logPath = __DIR__ . '/../../public/log_erros_prestacao.txt';
        file_put_contents(
            $logPath,
            date('Y-m-d H:i:s') . " - Erro: " . $e->getMessage() . PHP_EOL,
            FILE_APPEND
        );
        return false;
    }
}


    public function remover($id)
    {
        $this->db->query("UPDATE prestacao_contas SET removido = NOW() WHERE id_prestacao_contas = :id");
        $this->db->bind("id", $id);
        return $this->db->executa();
    }

    public function lerOrdens()
    {
        $this->db->query("SELECT id_ordem FROM ordens WHERE removido IS NULL ORDER BY id_ordem DESC");
        return $this->db->resultados();
    }

    public function atualizarStatusOrdem($id_ordem, $status)
    {
        $this->db->query("UPDATE ordens SET status_prestacao = :status WHERE id_ordem = :id_ordem");
        $this->db->bind("status", $status);
        $this->db->bind("id_ordem", $id_ordem);
        return $this->db->executa();
    }

    public function obterValorPrevistoDaOrdem($id_ordem)
    {
        $this->db->query("
            SELECT 
                COALESCE(SUM(df.total), 0) as total_diarias,
                (
                    SELECT COALESCE(SUM(dd.valor), 0)
                    FROM despesas_diversas dd
                    WHERE dd.id_ordem = :id_ordem AND LOWER(dd.descricao) LIKE '%combustivel%'
                ) as valor_combustivel,
                (
                    SELECT COALESCE(SUM(dd.valor), 0)
                    FROM despesas_diversas dd
                    WHERE dd.id_ordem = :id_ordem AND LOWER(dd.descricao) LIKE '%passagem%'
                ) as valor_passagens,
                (
                    SELECT COALESCE(SUM(dd.valor), 0)
                    FROM despesas_diversas dd
                    WHERE dd.id_ordem = :id_ordem AND LOWER(dd.descricao) NOT LIKE '%combustivel%'
                          AND LOWER(dd.descricao) NOT LIKE '%passagem%'
                ) as outras_despesas
            FROM ordens o
            LEFT JOIN diarias_funcionarios df ON o.id_ordem = df.id_ordem
            WHERE o.id_ordem = :id_ordem
            GROUP BY o.id_ordem
        ");
        $this->db->bind("id_ordem", $id_ordem);
        return $this->db->resultado();
    }

    public function salvarComprovante($dados)
    {
        error_log("Salvando comprovante: " . json_encode($dados));

        $this->db->query("
            INSERT INTO prestacao_comprovantes (id_prestacao_contas, arquivo) 
            VALUES (:id_prestacao_contas, :arquivo)
        ");
        $this->db->bind('id_prestacao_contas', $dados['id_prestacao_contas']);
        $this->db->bind('arquivo', $dados['arquivo']);
        return $this->db->executa();
    }

    public function obterComprovantes($id_prestacao)
    {
        $this->db->query("SELECT * FROM prestacao_comprovantes WHERE id_prestacao_contas = :id");
        $this->db->bind('id', $id_prestacao);
        return $this->db->resultados();
    }

    public function ultimoIdInserido()
    {
        return $this->db->ultimoIdInserido();
    }

    public function buscarPorIdDaOrdem($id_ordem) {
    $this->db->query("SELECT * FROM ordens WHERE id_ordem = :id");
    $this->db->bind(':id', $id_ordem);
    return $this->db->single();
}



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

}
