<?php
include 'is_logged.php'; // Verifica si el usuario está logueado
$session_id = session_id();
$sucursal_users = $_SESSION['sucursal_users'];

/* Validación del lado del servidor */
if (empty($_POST['id_proveedor'])) {
    $errors[] = "El ID del proveedor está vacío.";
} else {
    /* Conexión a la base de datos */
    require_once "../db.php";
    require_once "../php_conexion.php";
    require_once "../funciones.php";

    $simbolo_moneda = get_row('perfil', 'moneda', 'id_perfil', 1);

    // Validar productos en la tabla temporal
    $sql_count = mysqli_query($conexion, "SELECT * FROM tmp_compra WHERE session_id='$session_id' AND sucursal_tmp='$sucursal_users'");
    if (mysqli_num_rows($sql_count) == 0) {
        echo "<script>swal('No hay productos agregados en la factura', 'Intentar de nuevo', 'error');</script>";
        exit;
    }

    // Variables iniciales
    $id_proveedor = intval($_POST['id_proveedor']);
    $id_vendedor = intval($_SESSION['id_users']);
    $condiciones = intval($_POST['condiciones']);
    $factura = mysqli_real_escape_string($conexion, strip_tags($_POST['factura'], ENT_QUOTES));
    $referencia = mysqli_real_escape_string($conexion, strip_tags($_POST['ref'], ENT_QUOTES));
    $resibido = floatval(str_replace(',', '', $_POST['resibido']));
    $fecha = mysqli_real_escape_string($conexion, $_POST['fecha']);
    $estado = ($condiciones == 4) ? 2 : 1;
    
    // Obtener fecha actual para el campo added_kardex
    $fecha_actual = date('Y-m-d H:i:s');
    
    /* Control de Caja */
    $caja = mysqli_query($conexion, "SELECT LAST_INSERT_ID(caja_id) as last_id, estado_caja FROM detalle_caja WHERE estado_caja = 0 AND sucursal_id = '$sucursal_users'");
    $rw = mysqli_fetch_array($caja);
    $id_caja = $rw['last_id'] ?? 0;

    // Iniciar transacción
    mysqli_begin_transaction($conexion);

    try {
        // Primero, obtener TODOS los productos de la tabla temporal y guardarlos en array
        $sql = "SELECT tmp_compra.*, productos.stock_producto, productos.costo_producto 
                FROM tmp_compra 
                LEFT JOIN productos ON productos.id_producto = tmp_compra.id_producto 
                WHERE tmp_compra.session_id = '$session_id' 
                AND tmp_compra.sucursal_tmp = '$sucursal_users'";
        
        $result = mysqli_query($conexion, $sql);
        
        if (!$result) {
            throw new Exception("Error al consultar productos temporales: " . mysqli_error($conexion));
        }
        
        // Guardar productos en array para procesar después
        $productos_tmp = array();
        $sumador_total = 0;
        
        while ($row = mysqli_fetch_array($result)) {
            $id_producto = intval($row['id_producto']);
            $cantidad = floatval($row['cantidad_tmp']);
            $costo = floatval(str_replace(',', '', $row['costo_tmp']));
            $precio_total = $costo * $cantidad;
            
            $productos_tmp[] = array(
                'id_producto' => $id_producto,
                'cantidad' => $cantidad,
                'costo' => $costo,
                'precio_total' => $precio_total,
                'stock_actual' => floatval($row['stock_producto']),
                'costo_actual' => floatval($row['costo_producto'])
            );
            
            $sumador_total += $precio_total;
        }
        
        if (empty($productos_tmp)) {
            throw new Exception("No hay productos para procesar en la compra");
        }

        // Insertar en facturas_compras PRIMERO para obtener el ID
        $subtotal = $sumador_total;
        $saldo_credito = $subtotal - $resibido;
        $iva_compra = 0; // Si no tienes IVA en el formulario
        $tipo_factura = 'COMP'; // Tipo de factura

        // Insertar factura de compra
        $query_factura = "INSERT INTO facturas_compras 
                          (numero_factura, fecha_factura, id_proveedor, id_vendedor, condiciones, 
                           monto_factura, estado_factura, id_users_factura, id_sucursal, 
                           ref_factura, iva_compra, tipo_factura, control_caja) 
                          VALUES 
                          ('$factura', '$fecha', '$id_proveedor', '$id_vendedor', '$condiciones', 
                           '$subtotal', '$estado', '$id_vendedor', '$sucursal_users', 
                           '$referencia', '$iva_compra', '$tipo_factura', '$id_caja')";
        
        if (!mysqli_query($conexion, $query_factura)) {
            throw new Exception("Error al guardar la factura de compra: " . mysqli_error($conexion));
        }

        // Obtener el ID de la factura insertada
        $id_factura = mysqli_insert_id($conexion);
        
        if ($id_factura == 0) {
            throw new Exception("No se pudo obtener el ID de la factura de compra");
        }

        // DEBUG: Mostrar ID de factura
        error_log("ID Factura Compra creada: " . $id_factura);

        // Ahora procesar los productos para el detalle
        foreach ($productos_tmp as $producto) {
            $id_producto = $producto['id_producto'];
            $cantidad = $producto['cantidad'];
            $costo = $producto['costo'];
            
            // DEBUG: Mostrar datos del producto
            error_log("Insertando detalle - Producto ID: $id_producto, Cantidad: $cantidad, Costo: $costo, Factura: $id_factura");
            
            // Primero, insertar en detalle_fact_compra
            // NOTA: Ajusta los nombres de campos según tu tabla real de detalles de compra
            // Asumo que se llama detalle_fact_compra y tiene campos similares a detalle_fact_ventas
            $query_detalle = "INSERT INTO detalle_fact_compra 
                              (id_factura, numero_factura, id_producto, cantidad, precio_costo, sucursal_id) 
                              VALUES 
                              ('$id_factura', '$factura', '$id_producto', '$cantidad', '$costo', '$sucursal_users')";
            
            $result_detalle = mysqli_query($conexion, $query_detalle);
            
            if (!$result_detalle) {
                throw new Exception("Error al insertar detalle de compra para producto ID $id_producto: " . mysqli_error($conexion));
            }
            
            // DEBUG: Confirmar inserción
            error_log("Detalle insertado correctamente para producto ID: $id_producto");
            
            // Luego, actualizar stock y costo promedio en productos
            $stock_actual = $producto['stock_actual'];
            $costo_actual = $producto['costo_actual'];
            
            // Calcular nuevo costo promedio
            $stock_final = $stock_actual + $cantidad;
            
            if ($stock_actual > 0) {
                $total_actual = $stock_actual * $costo_actual;
                $total_nuevo = $cantidad * $costo;
                $total_final = $total_actual + $total_nuevo;
                $costo_promedio = $total_final / $stock_final;
            } else {
                $costo_promedio = $costo;
            }
            
            // Actualizar producto - verificar si hay campo sucursal_id
            $query_update = "UPDATE productos 
                             SET stock_producto = '$stock_final', 
                                 costo_producto = '$costo_promedio' 
                             WHERE id_producto = '$id_producto'";
            // Si tu tabla productos tiene campo sucursal_id, añade: AND sucursal_id = '$sucursal_users'
            
            $result_update = mysqli_query($conexion, $query_update);
            
            if (!$result_update) {
                throw new Exception("Error al actualizar stock del producto ID $id_producto: " . mysqli_error($conexion));
            }
            
            // DEBUG: Confirmar actualización de stock
            error_log("Stock actualizado para producto ID $id_producto: Stock final = $stock_final, Costo promedio = $costo_promedio");
            
            // Registrar en kardex
            $nuevo_total_saldo = $stock_final * $costo_promedio;
            
            // Verificar estructura de tabla kardex
            $query_kardex = "INSERT INTO kardex 
                            (fecha_kardex, producto_kardex, 
                             cant_entrada, costo_entrada, total_entrada,
                             cant_salida, costo_salida, total_salida,
                             cant_saldo, costo_saldo, total_saldo,
                             added_kardex, users_kardex, tipo_movimiento, id_factura, sucursal_kardex) 
                            VALUES 
                            ('$fecha', '$id_producto', 
                             '$cantidad', '$costo', '" . ($cantidad * $costo) . "',
                             '0', '0', '0',
                             '$stock_final', '$costo_promedio', '$nuevo_total_saldo',
                             '$fecha_actual', '$id_vendedor', '1', '$id_factura', '$sucursal_users')";
            
            if (!mysqli_query($conexion, $query_kardex)) {
                error_log("Error al insertar en kardex para producto $id_producto: " . mysqli_error($conexion));
            } else {
                error_log("Kardex registrado para producto ID: $id_producto");
            }
        }

        // Manejar crédito si las condiciones son 4 (crédito)
        if ($condiciones == 4 && $saldo_credito > 0) {
            $query_credito = "INSERT INTO credito_proveedor 
                              (id_credito, numero_factura, fecha_credito, id_proveedor, 
                               monto_credito, saldo_credito, estado_credito, id_users, id_sucursal) 
                              VALUES 
                              (NULL, '$factura', '$fecha', '$id_proveedor', 
                               '$subtotal', '$saldo_credito', '1', '$id_vendedor', '$sucursal_users')";
            
            $result_credito = mysqli_query($conexion, $query_credito);
            
            if (!$result_credito) {
                error_log("Error al registrar crédito: " . mysqli_error($conexion));
                // No lanzar excepción para no revertir toda la transacción por este error menor
            } else {
                error_log("Crédito registrado para proveedor ID: $id_proveedor");
            }

            if ($resibido > 0) {
                $query_abono = "INSERT INTO creditos_abonos_prov 
                                (id_abono, numero_factura, fecha_abono, id_proveedor, 
                                 monto_credito, valor_abono, saldo_credito, id_users, id_sucursal, concepto) 
                                VALUES 
                                (NULL, '$factura', '$fecha', '$id_proveedor', 
                                 '$subtotal', '$resibido', '$saldo_credito', 
                                 '$id_vendedor', '$sucursal_users', 'CRÉDITO INICIAL')";
                
                $result_abono = mysqli_query($conexion, $query_abono);
                
                if (!$result_abono) {
                    error_log("Error al registrar abono inicial: " . mysqli_error($conexion));
                } else {
                    error_log("Abono inicial registrado: $resibido");
                }
            }
        }

        // Confirmar transacción
        mysqli_commit($conexion);

        // Limpiar tabla temporal DESPUÉS de confirmar
        $delete_tmp = mysqli_query($conexion, "DELETE FROM tmp_compra WHERE session_id='$session_id' AND sucursal_tmp='$sucursal_users'");
        
        if (!$delete_tmp) {
            error_log("Error al limpiar tabla temporal: " . mysqli_error($conexion));
        } else {
            error_log("Tabla temporal limpiada para session_id: $session_id");
        }

        // Mensaje de éxito
        echo "<script>
            swal('Compra guardada exitosamente', 'Factura: $factura', 'success');
            setTimeout(function() {
                window.location.href = 'compras.php';
            }, 2000);
          </script>";
          
    
    } catch (Exception $e) {
        // Revertir transacción en caso de error
        mysqli_rollback($conexion);
        
        error_log("ERROR EN COMPRA: " . $e->getMessage());
        
        echo "<script>
                swal({
                    title: '¡Error!',
                    text: '" . addslashes($e->getMessage()) . "',
                    type: 'error',
                    confirmButtonText: 'Aceptar'
                });
              </script>";
        exit;
    }
}

if (isset($errors)) {
    echo "<div class='alert alert-danger'><strong>Error!</strong> " . implode('<br>', $errors) . "</div>";
}
?>