<?php
try {
    $host = 'localhost';
    $username = 'SYSDBA';
    $password = 'masterkey';

    $databaseOrigen = $_POST['db_origen'] ?? '';
    $databaseDestino = $_POST['db_destino'] ?? '';

    if (!$databaseOrigen || !file_exists($databaseOrigen)) {
        throw new Exception('Base de datos ORIGEN no válida o no encontrada.');
    }
    if (!$databaseDestino || !file_exists($databaseDestino)) {
        throw new Exception('Base de datos DESTINO no válida o no encontrada.');
    }

    function extraerCodigoEmpresa($ruta) {
        if (preg_match('/Empresa(\d{2})/', $ruta, $matches)) {
            return $matches[1];
        }
        throw new Exception("No se pudo determinar el código de empresa en ruta: $ruta");
    }

    $empresaOrigen = extraerCodigoEmpresa($databaseOrigen);
    $empresaDestino = extraerCodigoEmpresa($databaseDestino);

    $dbhOrigen = new PDO("firebird:host=$host;dbname=$databaseOrigen;charset=UTF8", $username, $password);
    $dbhOrigen->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $dbhDestino = new PDO("firebird:host=$host;dbname=$databaseDestino;charset=UTF8", $username, $password);
    $dbhDestino->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    function obtenerConcepto(PDO $dbh, $tablaCONM, $cveCpto) {
        $stmt = $dbh->prepare("SELECT TIPO_MOV, SIGNO FROM $tablaCONM WHERE CVE_CPTO = :cve");
        $stmt->execute([':cve' => $cveCpto]);
        return $stmt->fetch(PDO::FETCH_ASSOC);
    }

    function obtenerFolioYMov(PDO $dbh, $tablaMINVE) {
        $folio = (int)($dbh->query("SELECT MAX(CAST(CVE_FOLIO AS INTEGER)) AS F FROM $tablaMINVE")->fetchColumn() ?? 0) + 1;
        $mov = (int)($dbh->query("SELECT MAX(CAST(NUM_MOV AS INTEGER)) AS M FROM $tablaMINVE")->fetchColumn() ?? 0) + 1;
        return [$folio, $mov];
    }

    function registrarProductos(PDO $dbh, $empresaCodigo, $almacen, $fechaDoc, $cveCpto, $refer, $clave_clpv, $productos, $signoManual = null, $folioManual = null, $movInicial = null) {
        $tablaMINVE = "MINVE$empresaCodigo";
        $tablaINVE  = "INVE$empresaCodigo";
        $tablaCONM  = "CONM$empresaCodigo";

        $concepto = obtenerConcepto($dbh, $tablaCONM, $cveCpto);
        if (!$concepto) throw new Exception("Concepto $cveCpto no encontrado en empresa $empresaCodigo.");

        $signo = $signoManual ?? (($concepto['SIGNO'] >= 0) ? 1 : -1);
        list($folio, $numMov) = obtenerFolioYMov($dbh, $tablaMINVE);
        if ($folioManual) $folio = $folioManual;
        if ($movInicial) $numMov = $movInicial;

        $sqlInsert = "INSERT INTO $tablaMINVE (
            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, 
            'M', :refer, :clave_clpv, :cant, :cantCost, 0,
            :costo, 0, :uniVenta, 0, 1, :fechaElab, :cveFolio,
            :signo, 'S', 'S', :existG, :existencia
        )";
        $stmtInsert = $dbh->prepare($sqlInsert);

        foreach ($productos as $producto) {
            try {
                $cveArt = substr(trim($producto['producto'] ?? ''), 0, 20);
                $cant = floatval($producto['cantidad'] ?? 0);
                $costo = floatval($producto['costo_unidad'] ?? 0);

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

                $unidad = substr(trim($producto['unidad'] ?? 'PZA'), 0, 4);
                $refer = substr(trim($refer), 0, 10);
                $clave_clpv = substr(trim($clave_clpv), 0, 10);
                $folio = substr(strval($folio), 0, 20); // CVE_FOLIO a veces es VARCHAR(20)

                $stmtUnidad = $dbh->prepare("SELECT UNI_ALT FROM $tablaINVE WHERE CVE_ART = :cve");
                $stmtUnidad->execute([':cve' => $cveArt]);
                $unidadAlt = substr(trim($stmtUnidad->fetchColumn() ?: $unidad), 0, 4);

                $stmtExist = $dbh->prepare("SELECT COALESCE(EXIST, 0) FROM $tablaINVE WHERE CVE_ART = :cve");
                $stmtExist->execute([':cve' => $cveArt]);
                $existAntes = floatval($stmtExist->fetchColumn());

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

                $stmtInsert->execute([
                    ':cveArt' => $cveArt,
                    ':almacen' => $almacen,
                    ':numMov' => $numMov,
                    ':cve_cpto' => $cveCpto,
                    ':fechaDocu' => $fechaDoc,
                    ':refer' => $refer,
                    ':clave_clpv' => $clave_clpv,
                    ':cant' => $cant,
                    ':cantCost' => $cant,
                    ':costo' => $costo,
                    ':uniVenta' => $unidadAlt,
                    ':fechaElab' => date('Y-m-d H:i:s'),
                    ':cveFolio' => $folio,
                    ':signo' => $signo,
                    ':existG' => $existAntes,
                    ':existencia' => $existDespues
                ]);

                $stmtUpdate = $dbh->prepare("UPDATE $tablaINVE SET EXIST = EXIST + :cantidad, FCH_ULTCOM = :fecha WHERE CVE_ART = :cve");
                $stmtUpdate->execute([
                    ':cantidad' => $ajuste,
                    ':fecha' => $fechaDoc,
                    ':cve' => $cveArt
                ]);

                $numMov++;
            } catch (Throwable $e) {
                throw new Exception("Error al insertar producto '$cveArt': " . $e->getMessage());
            }
        }

        return [$folio, $numMov];
    }

    // DATOS POST
    $almacenOrigen = preg_replace('/\D/', '', $_POST['almacen'] ?? '');
    $almacenDestino = preg_replace('/\D/', '', $_POST['almacen2'] ?? '');
    $cveCptoOrigen = $_POST['concepto_numero'] ?? '';
    $cveCptoDestino = $_POST['concepto_numero2'] ?? '';
    $clave_clpv_origen = $_POST['clave_clpv'] ?? '';
    $clave_clpv_destino = $_POST['clave_clpv2'] ?? '';
    $fechaDoc = $_POST['fecha'] ?? date('Y-m-d');
    $refer = $_POST['documento_numero'] ?? 'REF';
    $productos = $_POST['productos'] ?? [];

    if (empty($productos)) {
        throw new Exception('No se recibieron productos.');
    }
    if (!$cveCptoOrigen || !$cveCptoDestino || !$almacenOrigen || !$almacenDestino) {
        throw new Exception('Faltan datos de concepto o almacén.');
    }

    // REGISTRO ORIGEN
    [$folioOrigen, $movInicial] = registrarProductos(
        $dbhOrigen, $empresaOrigen, $almacenOrigen, $fechaDoc, $cveCptoOrigen, $refer, $clave_clpv_origen, $productos
    );

    // REGISTRO DESTINO
    registrarProductos(
        $dbhDestino, $empresaDestino, $almacenDestino, $fechaDoc, $cveCptoDestino, $refer, $clave_clpv_destino, $productos, null, $folioOrigen, $movInicial
    );

    echo json_encode([
        'success' => true,
        'message' => 'Registro exitoso en ambas empresas.',
        'folio' => $folioOrigen
    ], JSON_UNESCAPED_UNICODE);

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