<?php
session_start();
require_once 'includes/db.php';

// Cargar configuración de Pagopar
$pagoparConfig = require 'pagopar_config.php';

// Verificar que hay productos en el carrito
if (empty($_SESSION['carrito'])) {
    header('Location: https://' . $_SERVER['HTTP_HOST'] . '/carrito.php');
    exit();
}

$db = new Database();
$configQuery = $db->query("SELECT * FROM configuracion")->fetch(PDO::FETCH_ASSOC);

// Obtener productos del carrito
$ids = array_keys($_SESSION['carrito']);
$placeholders = str_repeat('?,', count($ids) - 1) . '?';
$productos = $db->query("
    SELECT p.*, pr.nombre as proveedor 
    FROM productos p
    LEFT JOIN proveedores pr ON p.id_proveedor = pr.id
    WHERE p.id IN ($placeholders)
", $ids)->fetchAll(PDO::FETCH_ASSOC);

// Calcular el total
$monto_total = 0;
$compras_items = [];

foreach ($productos as $producto) {
    $cantidad = isset($_SESSION['carrito'][$producto['id']]['cantidad']) ? 
                $_SESSION['carrito'][$producto['id']]['cantidad'] : 1;
    
    // Obtener el precio correcto (oferta o normal)
    $precio_unitario = 0;
    if (isset($_SESSION['carrito'][$producto['id']]['tiene_oferta']) && 
        $_SESSION['carrito'][$producto['id']]['tiene_oferta'] && 
        isset($_SESSION['carrito'][$producto['id']]['precio_oferta'])) {
        $precio_unitario = $_SESSION['carrito'][$producto['id']]['precio_oferta'];
    } else {
        $precioSeleccionado = $_SESSION['carrito'][$producto['id']]['precio_seleccionado'] ?? 'precio_venta1';
        $precio_unitario = $producto[$precioSeleccionado];
    }
    
    $precio_total = $precio_unitario * $cantidad;
    $monto_total += $precio_total;
    
    // Obtener imagen del producto
    $imagenes = json_decode($producto['imagenes'], true);
    
    // Obtener la URL base dinámicamente
    $protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https' : 'http';
    $host = $_SERVER['HTTP_HOST'];
    $script_dir = dirname($_SERVER['SCRIPT_NAME']);
    $base_url = $protocol . '://' . $host . $script_dir;
    
    // Asegurarse de que termine con / y usar barras normales
    $base_url = str_replace('\\', '/', $base_url);
    if (substr($base_url, -1) !== '/') {
        $base_url .= '/';
    }
    
    // Construir URL de imagen de forma más directa y limpia
    $url_imagen = '';
    if (!empty($imagenes) && !empty($imagenes[0])) {
        $url_imagen = $protocol . '://' . $host . '/uploads/productos/' . $imagenes[0];
    } else {
        // Usar el logo como imagen por defecto si no hay imagen del producto
        $logo_file = $configQuery['logo'] ?? 'JKlogo.png';
        $url_imagen = $protocol . '://' . $host . '/uploads/config/' . $logo_file;
    }
    
    // Limpiar título
    $titulo = strtoupper(trim($producto['titulo']));
    $unwanted_array = array(
        'Á'=>'A', 'É'=>'E', 'Í'=>'I', 'Ó'=>'O', 'Ú'=>'U',
        'á'=>'A', 'é'=>'E', 'í'=>'I', 'ó'=>'O', 'ú'=>'U',
        'Ä'=>'A', 'Ë'=>'E', 'Ï'=>'I', 'Ö'=>'O', 'Ü'=>'U',
        'ä'=>'A', 'ë'=>'E', 'ï'=>'I', 'ö'=>'O', 'ü'=>'U',
        'ñ'=>'Ñ'
    );
    $titulo = strtr($titulo, $unwanted_array);
    
    // Agregar item al array
    $compras_items[] = [
        'ciudad' => $pagoparConfig['ciudad_default'],
        'nombre' => $titulo,
        'cantidad' => $cantidad,
        'categoria' => $pagoparConfig['categoria_default'],
        'public_key' => $pagoparConfig['public_key'],
        'url_imagen' => $url_imagen,
        'descripcion' => $titulo,
        'id_producto' => $producto['id'],
        'precio_total' => intval($precio_total),
        'vendedor_telefono' => '',
        'vendedor_direccion' => '',
        'vendedor_direccion_referencia' => '',
        'vendedor_direccion_coordenadas' => ''
    ];
}

// Generar ID de pedido único
$id_pedido_comercio = 'PED-' . time() . '-' . rand(1000, 9999);

// Generar token de seguridad
$token = sha1($pagoparConfig['private_key'] . $id_pedido_comercio . strval(floatval($monto_total)));

// Fecha máxima de pago
$fecha_maxima_pago = date('Y-m-d H:i:s', strtotime('+' . $pagoparConfig['dias_maximos_pago'] . ' days'));

// Obtener datos del comprador (si existen en sesión)
$comprador = [
    'ruc' => $_SESSION['cliente_ruc'] ?? '',
    'email' => $_SESSION['cliente_email'] ?? '',
    'ciudad' => $pagoparConfig['ciudad_default'],
    'nombre' => $_SESSION['cliente_nombre'] ?? 'Cliente',
    'telefono' => $_SESSION['cliente_telefono'] ?? '',
    'direccion' => $_SESSION['cliente_direccion'] ?? '',
    'documento' => $_SESSION['cliente_documento'] ?? '',
    'coordenadas' => '',
    'razon_social' => $_SESSION['cliente_nombre'] ?? 'Cliente',
    'tipo_documento' => 'CI',
    'direccion_referencia' => ''
];

// Si no hay datos del comprador en sesión, solicitarlos
if (empty($comprador['email']) || empty($comprador['nombre']) || empty($comprador['documento'])) {
    $_SESSION['pagopar_pending'] = true;
    header('Location: https://' . $_SERVER['HTTP_HOST'] . '/form_datos_comprador.php');
    exit();
}

// Preparar datos para enviar a Pagopar
$datos_pagopar = [
    'token' => $token,
    'comprador' => $comprador,
    'public_key' => $pagoparConfig['public_key'],
    'monto_total' => intval($monto_total),
    'tipo_pedido' => 'VENTA-COMERCIO',
    'compras_items' => $compras_items,
    'fecha_maxima_pago' => $fecha_maxima_pago,
    'id_pedido_comercio' => $id_pedido_comercio,
    'descripcion_resumen' => 'Pedido de ' . $configQuery['nombre_sitio'],
    'forma_pago' => 9 // 9 = Todos los medios de pago disponibles
];

// Enviar solicitud a Pagopar
$ch = curl_init($pagoparConfig['api_url']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($datos_pagopar));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/json',
    'Accept: application/json'
]);

$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

// Procesar respuesta
$resultado = json_decode($response, true);

if (isset($resultado['respuesta']) && $resultado['respuesta'] === true) {
    // Éxito: Guardar datos en la base de datos
    $hash_pagopar = $resultado['resultado'][0]['data'];
    $pedido_pagopar_id = $resultado['resultado'][0]['pedido'] ?? '';
    
    try {
        // Guardar pedido en la base de datos
        $stmt = $db->prepare("
            INSERT INTO pedidos_pagopar 
            (id_pedido_comercio, hash_pagopar, pedido_pagopar_id, monto_total, estado, datos_comprador, datos_productos, fecha_creacion, fecha_maxima_pago)
            VALUES (?, ?, ?, ?, 'pendiente', ?, ?, NOW(), ?)
        ");
        
        $stmt->execute([
            $id_pedido_comercio,
            $hash_pagopar,
            $pedido_pagopar_id,
            $monto_total,
            json_encode($comprador),
            json_encode($compras_items),
            $fecha_maxima_pago
        ]);
        
        // Guardar hash en sesión para validación posterior
        $_SESSION['pagopar_hash'] = $hash_pagopar;
        $_SESSION['pagopar_id_pedido'] = $id_pedido_comercio;
        
        // Redireccionar a Pagopar
        $url_pagopar = $pagoparConfig['checkout_url'] . $hash_pagopar;
        header('Location: ' . $url_pagopar);
        exit();
        
    } catch (Exception $e) {
        error_log("Error al guardar pedido Pagopar: " . $e->getMessage());
        $_SESSION['error_pagopar'] = "Error al procesar el pedido. Por favor, intente nuevamente.";
        header('Location: https://' . $_SERVER['HTTP_HOST'] . '/carrito.php');
        exit();
    }
    
} else {
    // Error en la respuesta de Pagopar
    $error_msg = $resultado['resultado'] ?? 'Error desconocido al comunicarse con Pagopar';
    error_log("Error de Pagopar: " . $error_msg);
    
    $_SESSION['error_pagopar'] = "Error al iniciar el pago: " . $error_msg;
    header('Location: https://' . $_SERVER['HTTP_HOST'] . '/carrito.php');
    exit();
}
