<?php
/**
 * ARQUIVO: processar.php (UNIFICADO)
 * OBJETIVO: Validar financeiro, dar baixa no estoque e fechar a Nota Fiscal.
 */
declare(strict_types=1);
header('Content-Type: application/json');
require_once "../configuracao/conexao.php"; 
$datem = date('d/m/y/h/m/s');
$enumvai="NF".$_SERVER["REMOTE_ADDR"]."-".$datem.time();

$id = (int)($_GET['id'] ?? 0);

if ($id <= 0) {
    echo json_encode(['status' => 'erro', 'message' => 'ID da nota inválido ou não informado.']);
    exit;
}

try {
    // Inicia a transação para garantir que só salve se TUDO der certo
    $mysqli->begin_transaction();

    // 1. BUSCA DADOS DA NOTA (Cabecalho)
    $res_nf = $mysqli->query("SELECT codigo, nf_cab_tot_nf, nf_cab_status, nf_cab_c_v FROM nf_cab WHERE codigo = $id");
    $nf = $res_nf->fetch_assoc();

    if (!$nf) throw new Exception("Nota fiscal não encontrada no sistema.");
    if ($nf['nf_cab_status'] !== 'P') throw new Exception("Esta nota já foi processada (Status: " . $nf['nf_cab_status'] . ").");

    // 2. VALIDAÇÃO FINANCEIRA (Comparação com reg_c140)
    $res_c140 = $mysqli->query("SELECT SUM(CAST(reg_c140_vl_tit AS DECIMAL(15,2))) as total FROM reg_c140 WHERE reg_c140_num_tit = '$id' AND ativo = 's'");
    $fin = $res_c140->fetch_assoc();

    $v_nota = round((float)($nf['nf_cab_tot_nf'] ?? 0), 2);
    $v_fin = round((float)($fin['total'] ?? 0), 2);
    $diferenca = round($v_nota - $v_fin, 2);

    if (abs($diferenca) > 0.01) {
        throw new Exception(
            "BLOQUEIO DE SEGURANÇA: Divergência Financeira!\n\n" .
            "Total Nota: R$ " . number_format($v_nota, 2, ',', '.') . "\n" .
            "Total Títulos (C140): R$ " . number_format($v_fin, 2, ',', '.') . "\n" .
            "Diferença: R$ " . number_format($diferenca, 2, ',', '.')
        );
    }

    // 3. MOVIMENTAÇÃO DE ESTOQUE (reg_h010_mov)
    $itens = $mysqli->query("SELECT nf_itens_cod_item, nf_itens_qtd_item FROM nf_itens WHERE nf_itens_nf_cab = $id");
    
    if ($itens->num_rows === 0) throw new Exception("A nota não possui itens para movimentar estoque.");

    $stmtMov = $mysqli->prepare("INSERT INTO reg_h010_mov (ativo, data, reg_h010_mov_tipo_doc, reg_h010_mov_num_doc, reg_h010_mov_qtd_doc, reg_h010_mov_cod_item, reg_h010_mov_origem_doc, reg_h010_mov_dest_doc, reg_h010_mov_item,enumsistema) VALUES ('S', CURDATE(), 'NFE', ?, ?, ?, ?, ?, ?,?)");

    $tipoMov = $nf['nf_cab_c_v']; // 'E' (Entrada) ou 'S' (Saída)

    while ($item = $itens->fetch_assoc()) {
        $qtd = (float)$item['nf_itens_qtd_item'];
        $cod = $item['nf_itens_cod_item'];

        // Define origem/destino/sentido com base no tipo da nota
        if ($tipoMov === 'S') {
            $origem = 'NFE'; $destino = 'NFE'; $sentido = 'S';
        } else {
            // Corrigido para Entrada: Origem NFE para Destino EST (Estoque)
            $origem = 'NFE'; $destino = 'NFE'; $sentido = 'E';
        }

        $stmtMov->bind_param("idsssss", $id, $qtd, $cod, $origem, $destino, $sentido,$enumvai);
        $stmtMov->execute();
    }

    // 4. ATUALIZA STATUS DA NOTA PARA 'F' (Fechada)
    $update = $mysqli->query("UPDATE nf_cab SET nf_cab_status = 'F' WHERE codigo = $id");
    if (!$update) throw new Exception("Erro ao atualizar status da nota: " . $mysqli->error);

    // Se chegou até aqui sem erros, confirma as alterações no banco
    $mysqli->commit();

    echo json_encode([
        'status' => 'sucesso', 
        'message' => "Nota $id validada, estoque atualizado e encerrada com sucesso!"
    ]);

} catch (Exception $e) {
    // Se qualquer erro ocorrer, cancela todas as alterações (Rollback)
    $mysqli->rollback();
    echo json_encode([
        'status' => 'erro', 
        'message' => $e->getMessage()
    ]);
}