<?php
ini_set('display_errors', 0);
error_reporting(E_ALL);

require_once(dirname(__DIR__) . '/config/db.php');
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
header('Content-Type: application/json; charset=utf-8');

if (session_status() === PHP_SESSION_NONE) session_start();
$cdempresa = $_SESSION['cdempresa'] ?? 1;

function jsonResponse($data) {
    echo json_encode($data, JSON_UNESCAPED_UNICODE);
    exit;
}

try {

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

    // ======================================================
    // 🔹 LISTAR ORÇAMENTOS
    // ======================================================
    if ($acao === 'listar') {

        $cdexercicio = $_GET['cdexercicio'] ?? '';
        $centro      = trim($_GET['centro'] ?? '');

        $sql = "
            SELECT o.cdorcamento,
                   o.descricao,
                   e.anoref,
                   c.dscentro
              FROM back.orcamento o
         LEFT JOIN back.exercicio e ON e.cdexercicio = o.cdexercicio
         LEFT JOIN back.centro_custo c ON c.cdcentrocusto = o.cdcentrocusto
             WHERE o.cdempresa = :emp and o.flexcluido = 0
        ";

        $params = [':emp' => $cdempresa];

        if ($cdexercicio) {
            $sql .= " AND o.cdexercicio = :exe";
            $params[':exe'] = $cdexercicio;
        }

        if ($centro !== '') {
            $sql .= " AND c.dscentro ILIKE :centro";
            $params[':centro'] = "%$centro%";
        }

        $sql .= " ORDER BY e.anoref DESC, c.dscentro ASC";

        $stmt = $pdo->prepare($sql);
        $stmt->execute($params);

        jsonResponse($stmt->fetchAll(PDO::FETCH_ASSOC));
    }

    // ======================================================
    // 🔹 SALVAR CABEÇALHO (CRIAR ORÇAMENTO)
    // ======================================================
    if ($acao === 'salvar_cabecalho') {

        $dados = json_decode(file_get_contents('php://input'), true);
        if (!$dados) {
            jsonResponse(['ok' => false, 'msg' => '❌ Dados inválidos.']);
        }

        $cdexercicio   = (int)($dados['cdexercicio'] ?? 0);
        $cdcentrocusto = (int)($dados['cdcentrocusto'] ?? 0);
        $descricao     = trim($dados['descricao'] ?? '');
        $observacao    = trim($dados['observacao'] ?? '');

        if (!$cdexercicio || !$cdcentrocusto || !$descricao) {
            jsonResponse(['ok' => false, 'msg' => '⚠️ Preencha todos os campos obrigatórios.']);
        }

        // --------------------------------------------------
        // 🔒 Evita duplicidade de orçamento
        // --------------------------------------------------
        $check = $pdo->prepare("
            SELECT cdorcamento
              FROM back.orcamento
             WHERE cdempresa = :emp
               AND cdexercicio = :exe
               AND cdcentrocusto = :cc
			   and flexcluido = 0
        ");

        $check->execute([
            ':emp' => $cdempresa,
            ':exe' => $cdexercicio,
            ':cc'  => $cdcentrocusto
        ]);

        if ($check->fetchColumn()) {
            jsonResponse([
                'ok' => false,
                'msg' => '⚠️ Já existe um orçamento para este exercício e centro de custo.'
            ]);
        }

        // --------------------------------------------------
        // 🔹 INSERE ORÇAMENTO
        // --------------------------------------------------
        $stmt = $pdo->prepare("
            INSERT INTO back.orcamento
                (cdempresa, cdexercicio, cdcentrocusto, descricao, observacao, flexcluido, dthcriacao)
            VALUES
                (:emp, :exe, :cc, :desc, :obs, 0, NOW())
            RETURNING cdorcamento
        ");

        $stmt->execute([
            ':emp'  => $cdempresa,
            ':exe'  => $cdexercicio,
            ':cc'   => $cdcentrocusto,
            ':desc' => $descricao,
            ':obs'  => $observacao
        ]);

        $cdorcamento = (int)$stmt->fetchColumn();

        // ==================================================
        // ✅ INSERE AUTOMATICAMENTE AS CONTAS MATRIZ
        //    flativo = 0 AND flmatriz = true
        //    já grava flnatureza e flmatriz corretamente
        // ==================================================
        $stmtMatriz = $pdo->prepare("
            INSERT INTO back.orcamentodet
                (
                    cdempresa,
                    cdorcamento,
                    cdcontacontabil,
                    anoref,
                    flnatureza,
                    flmatriz,
                    dthcriacao
                )
            SELECT
                :emp,
                :orc,
                pc.cdcontacontabil,
                e.anoref,
                pc.flnatureza,
                true,
                NOW()
            FROM back.planocontabil pc
            JOIN back.exercicio e
              ON e.cdexercicio = :exe
            WHERE pc.flativo  = 0
              AND pc.flmatriz = true
            ON CONFLICT (cdorcamento, cdcontacontabil)
            DO NOTHING
        ");

        $stmtMatriz->execute([
            ':emp' => $cdempresa,
            ':orc' => $cdorcamento,
            ':exe' => $cdexercicio
        ]);

        jsonResponse([
            'ok'          => true,
            'msg'         => '✅ Orçamento criado com sucesso!',
            'cdorcamento' => $cdorcamento
        ]);
    }

  // ======================================================
// 🔹 EXCLUIR (SEMPRE COM CONFIRMAÇÃO)
// ======================================================
if ($acao === 'excluir') {

    $id = (int)($_GET['id'] ?? 0);
    if ($id <= 0) {
        jsonResponse(['ok' => false, 'msg' => '❌ ID inválido.']);
    }

    // 🔎 Conta lançamentos
    $check = $pdo->prepare("
        SELECT COUNT(*)
          FROM back.orcamentodet
         WHERE cdorcamento = :id and flmatriz is null
    ");
    $check->execute([':id' => $id]);

    $qtdLancamentos = (int)$check->fetchColumn();

    // ⚠️ Primeira chamada: só alerta (NÃO exclui)
    if (empty($_GET['confirmado'])) {

        if ($qtdLancamentos > 0) {
            jsonResponse([
                'ok'             => false,
                'precisaConfirmar' => true,
                'qtdLancamentos' => $qtdLancamentos,
                'msg' => "⚠️ Este orçamento possui {$qtdLancamentos} lançamento(s). Deseja realmente excluir?"
            ]);
        } else {
            jsonResponse([
                'ok'             => false,
                'precisaConfirmar' => true,
                'qtdLancamentos' => 0,
                'msg' => "⚠️ Este orçamento não possui lançamentos. Deseja realmente excluir?"
            ]);
        }
    }

    // 🗑️ Exclusão lógica (somente após confirmação)
    $stmt = $pdo->prepare("
        UPDATE back.orcamento
           SET flexcluido = 1
         WHERE cdorcamento = :id
           AND cdempresa   = :emp
    ");

    $stmt->execute([
        ':id'  => $id,
        ':emp' => $cdempresa
    ]);

    jsonResponse([
        'ok'  => true,
        'msg' => '🗑️ Orçamento excluído com sucesso!'
    ]);
}


	// ======================================================
// 🔹 LISTAR CENTROS DE CUSTO
// ======================================================
if ($acao === 'listar_centros') {

    $stmt = $pdo->prepare("
        SELECT cdcentrocusto, dscentro
          FROM back.centro_custo
         WHERE flativo = 0 and cdcentropai is not null
         ORDER BY dscentro
    ");

    $stmt->execute(); // ✅ SEM parâmetros

    jsonResponse($stmt->fetchAll(PDO::FETCH_ASSOC));
}



    // ======================================================
    // 🔹 AÇÃO DESCONHECIDA
    // ======================================================
    jsonResponse(['ok' => false, 'msg' => '❌ Ação desconhecida.']);

} catch (Exception $e) {

    jsonResponse([
        'ok'  => false,
        'msg' => '❌ Erro geral: ' . $e->getMessage()
    ]);
}
