<?php
declare(strict_types=1);
ini_set('display_errors', 0);
error_reporting(E_ALL);
ini_set('log_errors', 1);
ini_set('error_log', dirname(__DIR__) . '/../logs/php_errors.log');

require_once(dirname(__DIR__) . '/config/db.php');
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);

header('Content-Type: application/json; charset=utf-8');

function safeJson(array $data): void {
    echo json_encode($data, JSON_UNESCAPED_UNICODE);
    exit;
}

if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

$empresa = $_SESSION['empresa']['id'] ?? null;

if (!$empresa) {
    safeJson(['ok' => false, 'msg' => 'Sessão expirada. Faça login.']);
}

$acao = $_GET['ajax'] ?? null;

try {

    /* ================================================================================
       LISTAR CONTAS DO PLANO + ORÇADOS + REALIZADOS
       ================================================================================ */
    if ($acao === 'listar_contas') {

        $cdorcamento = (int)($_GET['cdorcamento'] ?? 0);
        if ($cdorcamento <= 0) {
            safeJson(['ok' => false, 'msg' => 'Orçamento inválido.']);
        }

        // Cabeçalho
        $sqlCfg = "
            SELECT o.cdempresa,
                   o.cdexercicio,
                   o.cdcentrocusto,
                   e.anoref,
                   c.dscentro,
                   m.formato,
                   m.simbolo
              FROM back.orcamento o
         LEFT JOIN back.empresa emp ON emp.cdempresa = o.cdempresa
         LEFT JOIN back.moeda   m   ON m.cdmoeda     = emp.cdmoeda
         LEFT JOIN back.exercicio e ON e.cdexercicio = o.cdexercicio
         LEFT JOIN back.centro_custo c ON c.cdcentrocusto = o.cdcentrocusto
             WHERE o.cdorcamento = :id
        ";

        $cfg = $pdo->prepare($sqlCfg);
        $cfg->execute([':id' => $cdorcamento]);
        $cfg = $cfg->fetch(PDO::FETCH_ASSOC);

        if (!$cfg) {
            safeJson(['ok' => false, 'msg' => 'Orçamento não encontrado.']);
        }

        // Plano de contas
        $sqlPlano = "
            SELECT cdcontacontabil,
                   cdconta,
                   cdcontapai,
                   dsconta,
                   fltipo
              FROM back.planocontabil
          ORDER BY cdconta ASC
        ";

        try {
            $contas = $pdo->query($sqlPlano)->fetchAll(PDO::FETCH_ASSOC);
            if (!is_array($contas)) {
                $contas = [];
            }
        } catch (Exception $e) {
            safeJson(['ok' => false, 'msg' => 'Erro ao carregar plano de contas: ' . $e->getMessage()]);
        }

        $dados = [];

        foreach ($contas as $c) {

            $cdconta = $c['cdcontacontabil'];

            // ORÇADOS
            $sqlOrc = "
                SELECT cdorcamentodet,
                       jan, fev, mar, abr, mai, jun,
                       jul, ago, set, \"out\", nov, dez
                  FROM back.orcamentodet
                 WHERE cdorcamento     = :orc
                   AND cdcontacontabil = :cc
                 LIMIT 1
            ";

            $s = $pdo->prepare($sqlOrc);
            $s->execute([
                ':orc' => $cdorcamento,
                ':cc'  => $cdconta
            ]);

            $orcados = array_fill(0, 12, 0.0);
            $cdorcamentodet = null;

            if ($r = $s->fetch(PDO::FETCH_ASSOC)) {
                $cdorcamentodet = (int)$r["cdorcamentodet"];
                $orcados = [
                    (float)$r["jan"],
                    (float)$r["fev"],
                    (float)$r["mar"],
                    (float)$r["abr"],
                    (float)$r["mai"],
                    (float)$r["jun"],
                    (float)$r["jul"],
                    (float)$r["ago"],
                    (float)$r["set"],
                    (float)$r["out"],
                    (float)$r["nov"],
                    (float)$r["dez"]
                ];
            }

            // REALIZADOS
            $sqlReal = "
                SELECT mesref, valor_realizado
                  FROM back.v_realizado_anterior
                 WHERE cdempresa       = :emp
                   AND cdcontacontabil = :cc
                   AND anoorcamento    = :ano
            ";

            $realizados = array_fill(0, 12, 0.0);
            
            try {
                $r2 = $pdo->prepare($sqlReal);
                $r2->execute([
                    ':emp' => $cfg['cdempresa'],
                    ':cc'  => $cdconta,
                    ':ano' => $cfg['anoref']
                ]);

                while ($rr = $r2->fetch(PDO::FETCH_ASSOC)) {
                    $mes = (int)$rr["mesref"] - 1;
                    if ($mes >= 0 && $mes < 12) {
                        $realizados[$mes] = (float)$rr["valor_realizado"];
                    }
                }
            } catch (Exception $e) {
                // Se tabela v_realizado_anterior não existir ou falhar, apenas ignora realizados
                // error_log('Aviso em listar_contas: ' . $e->getMessage());
            }

            // Montagem final
            $dados[] = [
                'cdcontacontabil' => (int)$c['cdcontacontabil'],
                'cdorcamentodet'  => $cdorcamentodet, // <-- ESSENCIAL
                'cdconta'         => $c['cdconta'],
                'cdcontapai'      => $c['cdcontapai'] ?: null,
                'dsconta'         => $c['dsconta'],
                'fltipo'          => $c['fltipo'],
                'orcados'         => $orcados,
                'realizados'      => $realizados
            ];
        }

        safeJson([
            'ok'          => true,
            'moeda'       => $cfg['simbolo'],
            'formato'     => $cfg['formato'],
            'exercicio'   => $cfg['anoref'],
            'centrocusto' => $cfg['dscentro'],
            'dados'       => $dados
        ]);
    }



    /* ================================================================================
       CRIAR REGISTRO EM ORCAMENTODET (PAI)
       ================================================================================ */
    if ($acao === 'criar_orcamentodet') {

    $cdorcamento     = (int)($_POST['cdorcamento'] ?? 0);
    $cdcontacontabil = (int)($_POST['cdcontacontabil'] ?? 0);
    $anoref          = (int)($_POST['anoref'] ?? 0);

    if ($cdorcamento <= 0 || $cdcontacontabil <= 0) {
        safeJson(['ok' => false, 'msg' => 'Dados inválidos.']);
    }

    try {

        // 🔹 Insere herdando natureza e matriz do plano contábil
        $stmt = $pdo->prepare("
            INSERT INTO back.orcamentodet
                (
                    cdempresa,
                    cdorcamento,
                    cdcontacontabil,
                    anoref,
                    flnatureza,                 
                    dthcriacao
                )
            SELECT
                :emp,
                :orc,
                pc.cdcontacontabil,
                :ano,
                pc.flnatureza,                
                NOW()
            FROM back.planocontabil pc
            WHERE pc.cdcontacontabil = :cc
            ON CONFLICT (cdorcamento, cdcontacontabil)
            DO NOTHING
            RETURNING cdorcamentodet
        ");

        $stmt->execute([
            ':emp' => $empresa,
            ':orc' => $cdorcamento,
            ':cc'  => $cdcontacontabil,
            ':ano' => $anoref
        ]);

        $novo = $stmt->fetchColumn();

        // 🔹 Se já existia, apenas retorna o id
        if (!$novo) {

            $stmtBusca = $pdo->prepare("
                SELECT cdorcamentodet
                  FROM back.orcamentodet
                 WHERE cdorcamento = :orc
                   AND cdcontacontabil = :cc
                 LIMIT 1
            ");

            $stmtBusca->execute([
                ':orc' => $cdorcamento,
                ':cc'  => $cdcontacontabil
            ]);

            $novo = $stmtBusca->fetchColumn();
        }

        safeJson([
            'ok' => true,
            'cdorcamentodet' => (int)$novo
        ]);

    } catch (Exception $e) {
        safeJson(['ok' => false, 'msg' => $e->getMessage()]);
    }
}
    safeJson(['ok' => false, 'msg' => 'Ação desconhecida.']);

} catch (Exception $e) {
    safeJson(['ok' => false, 'msg' => 'Erro: '.$e->getMessage()]);
}
