<?php
session_start();
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// Configuración de la base de datos
$host = 'localhost';
'C:\Program Files (x86)\Common Files\Aspel\Sistemas Aspel\SAE7.00\Ejemplos\Ejemplos.fdb';
$username = 'SYSDBA';
$password = 'masterkey';

header('Content-Type: application/json');

function clean_input($key, $default = '', $is_numeric = false)
{
    if (!isset($_POST[$key]) || $_POST[$key] === '') {
        return $is_numeric ? 0 : $default;
    }
    $value = $_POST[$key];
    return $is_numeric ? floatval(str_replace(',', '.', $value)) : $value;
}

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    try {
        $dbh = new PDO("firebird:dbname=$host:$database;charset=UTF8", $username, $password);
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $dbh->beginTransaction();

        // Datos del formulario
        $clave = clean_input('clave');
        $descripcion = clean_input('descripcion');
        $tipo_producto = clean_input('tipo_producto');
        $tipo_costeo = clean_input('tipo_costeo');
        $con_serie = isset($_POST['con_serie']) ? 'S' : 'N';
        $con_lote = isset($_POST['con_lote']) ? 'S' : 'N';
        $con_pedimento = isset($_POST['con_pedimento']) ? 'S' : 'N';
        $cve_pais = clean_input('cve_pais');
        $uni_entrada = clean_input('uni_entrada');
        $tiempo_surt = clean_input('tiempo_surt', '', true);
        $uni_salida = clean_input('uni_salida');
        $control_alm = clean_input('control_alm');
        $fac_unidades = clean_input('fac_unidades', '', true);
        $volumen = clean_input('volumen', '', true);
        $peso = clean_input('peso', '', true);
        $uni_empaque = clean_input('uni_empaque');
        $existencia = clean_input('existencia', '', true);
        $stock_min = clean_input('stock_min', '', true);
        $stock_max = clean_input('stock_max', '', true);
        $apart = clean_input('apart', '', true);
        $tipo = clean_input('tipo');
        $esquema = clean_input('IMPU01'); // CORREGIDO: El campo que viene del formulario
        $pendientes_recibir = clean_input('pendientes_recibir', '', true);
        $pendientes_surtir = clean_input('pendientes_surtir', '', true);
        $promedio_costo = clean_input('promedio_costo', '', true);
        $ultimo_costo = clean_input('ultimo_costo', '', true);
        $cantidad_acumulados = clean_input('cantidad_acumulados', '', true);
        $monto_acumulados = clean_input('monto_acumulados', '', true);
        $cantidad_compras = clean_input('cantidad_compras', '', true);
        $monto_compras = clean_input('monto_compras', '', true);
        $apl_man_ieps = isset($_POST['apl_man_ieps']) ? $_POST['apl_man_ieps'] : null;
        $num_moneda = clean_input('NUMMONED', true);

        // Verificar si el artículo ya existe
        $sql_check = "SELECT COUNT(*) FROM INVE01 WHERE CVE_ART = :clave";
        $stmt_check = $dbh->prepare($sql_check);
        $stmt_check->bindParam(':clave', $clave);
        $stmt_check->execute();
        $exists = $stmt_check->fetchColumn();

        if ($exists > 0) {
            // Actualizar el artículo
            $sql_update = "UPDATE INVE01 
                           SET DESCR = :descripcion, 
                               TIPO_ELE = :tipo_producto, 
                               TIP_COSTEO = :tipo_costeo, 
                               STATUS = 'A' 
                           WHERE CVE_ART = :clave";

            $stmt_update = $dbh->prepare($sql_update);
            $stmt_update->bindParam(':clave', $clave);
            $stmt_update->bindParam(':descripcion', $descripcion);
            $stmt_update->bindParam(':tipo_producto', $tipo_producto);
            $stmt_update->bindParam(':tipo_costeo', $tipo_costeo);
            $stmt_update->execute();

            $dbh->commit();
            echo json_encode(["status" => "success", "message" => "Artículo actualizado correctamente."]);
        } else {
            // Insertar un nuevo artículo
            $sql_insert = "INSERT INTO INVE01 
                (CVE_ART, STATUS, DESCR, TIPO_ELE, TIP_COSTEO, CON_SERIE, CON_LOTE, CON_PEDIMENTO,
                 LIN_PROD, UNI_MED, TIEM_SURT, UNI_ALT, CTRL_ALM, FAC_CONV, VOLUMEN, PESO, UNI_EMP,
                 EXIST, STOCK_MIN, STOCK_MAX, APART, CUOTA_IEPS, CVE_ESQIMPU, COMP_X_REC, PEND_SURT,
                 COSTO_PROM, ULT_COSTO, VTAS_ANL_C, VTAS_ANL_M, COMP_ANL_C, COMP_ANL_M, APL_MAN_IEPS) 
             VALUES 
                (:clave, 'A', :descripcion, :tipo_producto, :tipo_costeo, :con_serie, :con_lote, :con_pedimento,
                 :cve_pais, :uni_entrada, :tiempo_surt, :uni_salida, :control_alm, :fac_unidades, :volumen, :peso,
                 :uni_empaque, :existencia, :stock_min, :stock_max, :apart, :tipo, :esquema, :pendientes_recibir,
                 :pendientes_surtir, :promedio_costo, :ultimo_costo, :cantidad_acumulados, :monto_acumulados,
                 :cantidad_compras, :monto_compras, :apl_man_ieps)";

            $stmt_insert = $dbh->prepare($sql_insert);

            $stmt_insert->bindParam(':clave', $clave);
            $stmt_insert->bindParam(':descripcion', $descripcion);
            $stmt_insert->bindParam(':tipo_producto', $tipo_producto);
            $stmt_insert->bindParam(':tipo_costeo', $tipo_costeo);
            $stmt_insert->bindParam(':con_serie', $con_serie);
            $stmt_insert->bindParam(':con_lote', $con_lote);
            $stmt_insert->bindParam(':con_pedimento', $con_pedimento);
            $stmt_insert->bindParam(':cve_pais', $cve_pais);
            $stmt_insert->bindParam(':uni_entrada', $uni_entrada);
            $stmt_insert->bindParam(':tiempo_surt', $tiempo_surt);
            $stmt_insert->bindParam(':uni_salida', $uni_salida);
            $stmt_insert->bindParam(':control_alm', $control_alm);
            $stmt_insert->bindParam(':fac_unidades', $fac_unidades);
            $stmt_insert->bindParam(':volumen', $volumen);
            $stmt_insert->bindParam(':peso', $peso);
            $stmt_insert->bindParam(':uni_empaque', $uni_empaque);
            $stmt_insert->bindParam(':existencia', $existencia);
            $stmt_insert->bindParam(':stock_min', $stock_min);
            $stmt_insert->bindParam(':stock_max', $stock_max);
            $stmt_insert->bindParam(':apart', $apart);
            $stmt_insert->bindParam(':tipo', $tipo);
            $stmt_insert->bindParam(':esquema', $esquema);
            $stmt_insert->bindParam(':pendientes_recibir', $pendientes_recibir);
            $stmt_insert->bindParam(':pendientes_surtir', $pendientes_surtir);
            $stmt_insert->bindParam(':promedio_costo', $promedio_costo);
            $stmt_insert->bindParam(':ultimo_costo', $ultimo_costo);
            $stmt_insert->bindParam(':cantidad_acumulados', $cantidad_acumulados);
            $stmt_insert->bindParam(':monto_acumulados', $monto_acumulados);
            $stmt_insert->bindParam(':cantidad_compras', $cantidad_compras);
            $stmt_insert->bindParam(':monto_compras', $monto_compras);
            $stmt_insert->bindParam(':apl_man_ieps', $apl_man_ieps);

            $stmt_insert->execute();
            $dbh->commit();

            echo json_encode(["status" => "success", "message" => "Artículo guardado correctamente."]);
        }
    } catch (PDOException $e) {
        if ($dbh->inTransaction()) $dbh->rollBack();
        echo json_encode(["status" => "error", "message" => "Error: " . $e->getMessage()]);
        if (empty($clave)) {
            echo json_encode(["status" => "error", "message" => "La clave del artículo no puede estar vacía."]);
            exit;
        }
        
    }
} else {
    echo json_encode(["status" => "error", "message" => "Formulario no enviado."]);
}
