<?php
$host = 'localhost';
$database = 'C:\Program Files (x86)\Common Files\Aspel\Sistemas Aspel\SAE7.00\Ejemplos\Ejemplos.FDB';
$username = 'SYSDBA';
$password = 'masterkey';

try {
    $dbh = new PDO("firebird:host=$host;dbname=$database;charset=UTF8", $username, $password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $almacen = preg_replace('/\D/', '', $_POST['almacen']);
    $fechaDoc = $_POST['fecha'];
    $cveCpto = $_POST['concepto_numero'];

    // Obtener TIPO_MOV y SIGNO desde CONM01
    $sqlCpto = "SELECT TIPO_MOV, SIGNO FROM CONM01 WHERE CVE_CPTO = :cveCpto";
    $stmtCpto = $dbh->prepare($sqlCpto);
    $stmtCpto->execute([':cveCpto' => $cveCpto]);
    $cptoData = $stmtCpto->fetch(PDO::FETCH_ASSOC);

    if (!$cptoData) {
        throw new Exception("Concepto $cveCpto no encontrado en CONM01");
    }

    $tipoMov = $cptoData['TIPO_MOV'];
    $signo = (int)$cptoData['SIGNO'];
    $signo = ($signo >= 0) ? 1 : -1;

    $stmtFolio = $dbh->query("SELECT MAX(CAST(CVE_FOLIO AS INTEGER)) AS LAST_FOLIO FROM MINVE01");
    $lastFolio = $stmtFolio->fetch(PDO::FETCH_ASSOC)['LAST_FOLIO'] ?? 0;
    $folioActual = (int)$lastFolio + 1;

    $stmtMov = $dbh->query("SELECT MAX(CAST(NUM_MOV AS INTEGER)) AS LAST_MOV FROM MINVE01");
    $lastNumMov = $stmtMov->fetch(PDO::FETCH_ASSOC)['LAST_MOV'] ?? 0;
    $newNumMov = (int)$lastNumMov + 1;

    function existeNumMov(PDO $dbh, int $numMov): bool {
        $stmt = $dbh->prepare("SELECT 1 FROM MINVE01 WHERE CAST(NUM_MOV AS INTEGER) = :numMov");
        $stmt->execute([':numMov' => $numMov]);
        return (bool)$stmt->fetchColumn();
    }

    $sqlMINVE = "INSERT INTO MINVE01 (
        CVE_ART, ALMACEN, NUM_MOV, CVE_CPTO, FECHA_DOCU, 
        TIPO_DOC, REFER, CLAVE_CLPV, CANT, CANT_COST, PRECIO,
        COSTO, REG_SERIE, UNI_VENTA, E_LTPD, FACTOR_CON, FECHAELAB, CVE_FOLIO,
        SIGNO, COSTEADO, DESDE_INVE, EXIST_G, EXISTENCIA
    ) VALUES (
        :cveArt, :almacen, :numMov, :cve_cpto, :fechaDocu, 
        :tipoDoc, :refer, :clave_clpv, :cant, :cantCost, 0,
        :costo, 0, :uniVenta, 0, 1, :fechaElab, :cveFolio,
        :signo, 'S', 'S', :existG, :existencia
    )";

    $stmtMINVE = $dbh->prepare($sqlMINVE);

    $productos = $_POST['productos'] ?? [];
    if (empty($productos)) {
        throw new Exception('No se recibieron productos para registrar.');
    }

    foreach ($productos as $producto) {
        $sqlUnidad = "SELECT UNI_ALT FROM INVE01 WHERE CVE_ART = :cveArt";
        $stmtUnidad = $dbh->prepare($sqlUnidad);
        $stmtUnidad->execute([':cveArt' => $producto['producto']]);
        $unidadVenta = $stmtUnidad->fetchColumn() ?: 'PZA';

        $cveArt = $producto['producto'] ?? '';
        $cant = floatval($producto['cantidad'] ?? 0);
        $costo = floatval($producto['costo_unidad'] ?? 0);

        if (!$cveArt || $cant <= 0) {
            continue;
        }

        // Obtener existencia actual antes del movimiento
        $stmtExist = $dbh->prepare("SELECT COALESCE(EXIST, 0) AS EXIST FROM INVE01 WHERE CVE_ART = :cveArt");
        $stmtExist->execute([':cveArt' => $cveArt]);
        $existAntes = floatval($stmtExist->fetchColumn());

        $cantidadAjustada = $signo * $cant;
        $existDespues = $existAntes + $cantidadAjustada;

        while (existeNumMov($dbh, $newNumMov)) {
            $newNumMov++;
        }

        $stmtMINVE->execute([
            ':cveArt' => $cveArt,
            ':almacen' => $almacen,
            ':numMov' => $newNumMov,
            ':cve_cpto' => $cveCpto,
            ':fechaDocu' => $fechaDoc,
            ':tipoDoc' => 'M',
            ':refer' => $_POST['documento_numero'],
            ':clave_clpv' => $_POST['clave_clpv'],
            ':cant' => $cant,
            ':cantCost' => $cant,
            ':costo' => $costo,
            ':uniVenta' => $unidadVenta,
            ':fechaElab' => date('Y-m-d H:i:s'),
            ':cveFolio' => $folioActual,
            ':signo' => $signo,
            ':existG' => $existAntes,       // ← EXISTENCIAS ANTES DEL MOVIMIENTO
            ':existencia' => $existDespues  // ← EXISTENCIAS DESPUÉS DEL MOVIMIENTO (opcional)
        ]);

        // Actualizar existencias en INVE01
        $stmtUpdateExistencias = $dbh->prepare("
            UPDATE INVE01 SET 
                EXIST = COALESCE(EXIST, 0) + :cantidad, 
                FCH_ULTCOM = :fechaUltCompra 
            WHERE CVE_ART = :cveArt
        ");
        $stmtUpdateExistencias->execute([
            ':cantidad' => $cantidadAjustada,
            ':fechaUltCompra' => $fechaDoc,
            ':cveArt' => $cveArt
        ]);

        $newNumMov++;
    }

    echo json_encode([
        'success' => true,
        'message' => 'Productos registrados correctamente.',
        'new_cve_doc' => $folioActual
    ], JSON_UNESCAPED_UNICODE);
} catch (Throwable $e) {
    http_response_code(500);
    echo json_encode([
        'success' => false,
        'message' => 'Error: ' . $e->getMessage(),
        'trace' => $e->getTraceAsString()
    ]);
}
exit;
