<?php
// El webhook es invocado directamente por los servidores de Payku (petición POST)
header("Content-Type: application/json; charset=UTF-8");

require_once __DIR__ . '/../../../termopaneles/config.php';

// 1. Capturar el cuerpo de la notificación
$inputJson = file_get_contents("php://input");
$notification = json_decode($inputJson, true);

if (!$notification) {
    error_log("Webhook Payku: Recibida petición sin datos o JSON inválido.");
    http_response_code(400);
    echo json_encode(["status" => "error", "message" => "Invalid payload"]);
    exit;
}

// Log de depuración técnica (puedes revisar esto en el error_log de tu cPanel)
error_log("Webhook Payku recibido: ID Transacción " . ($notification['id'] ?? 'N/A') . " - Estado: " . ($notification['status'] ?? 'N/A'));

try {
    $db = getDBConnection();

    // 2. Extraer parámetros clave enviados por Payku
    $idOrden        = isset($notification['idorder']) ? intval($notification['idorder']) : 0; // Folio de nuestra tabla
    $idTransaccion  = isset($notification['id']) ? trim($notification['id']) : '';          // ID único de Payku
    $estadoPago     = isset($notification['status']) ? strtoupper(trim($notification['status'])) : ''; // 'SUCCESS', 'PENDING', 'FAIL'
    $montoPagado    = isset($notification['amount']) ? intval($notification['amount']) : 0;
    
    // Hardening: Validación de firma o Token de verificación para asegurar que la petición viene de Payku
    // Payku comúnmente envía una firma/token o puedes verificar consultando directamente su API.
    // Para entornos de desarrollo robustos, validamos que la orden realmente exista en nuestra base de datos.
    
    if ($idOrden <= 0) {
        http_response_code(400);
        echo json_encode(["status" => "error", "message" => "ID de orden inválido"]);
        exit;
    }

    // 3. Buscar la cotización/orden en nuestra base de datos
    $stmt = $db->prepare("SELECT id, total_bruto, usuario_id, estado_pago FROM cotizaciones_encabezado WHERE id = ? LIMIT 1");
    $stmt->execute([$idOrden]);
    $orden = $stmt->fetch();

    if (!$orden) {
        error_log("Webhook Payku: No se encontró la orden local N° " . $idOrden);
        http_response_code(404);
        echo json_encode(["status" => "error", "message" => "Orden no encontrada"]);
        exit;
    }

    // 4. Si la orden ya fue procesada previamente, respondemos con éxito de inmediato para evitar bucles
    if ($orden['estado_pago'] === 'PAGADA') {
        http_response_code(200);
        echo json_encode(["status" => "success", "message" => "Orden ya procesada anteriormente"]);
        exit;
    }

    // 5. Validar que el monto pagado coincida estrictamente con el registrado en base de datos (Evita tampering)
    if ($montoPagado !== intval($orden['total_bruto'])) {
        error_log("ALERTA DE SEGURIDAD: Discrepancia de montos en Orden N° $idOrden. Esperado: " . $orden['total_bruto'] . " - Recibido: " . $montoPagado);
        
        $stmtUpdate = $db->prepare("UPDATE cotizaciones_encabezado SET estado_pago = 'RECHAZADA', token_pasarela = ? WHERE id = ?");
        $stmtUpdate->execute(["DISCREPANCIA_MONTOS_" . $idTransaccion, $idOrden]);
        
        http_response_code(400);
        echo json_encode(["status" => "error", "message" => "Discrepancia en el monto de transacción"]);
        exit;
    }

    // 6. Evaluar el estado del pago e impactar la BD
    if ($estadoPago === 'SUCCESS') {
        $db->beginTransaction();

        // A) Actualizar el encabezado de la cotización a PAGADA
        $stmtUpdate = $db->prepare("UPDATE cotizaciones_encabezado SET estado_pago = 'PAGADA', token_pasarela = ? WHERE id = ?");
        $stmtUpdate->execute([$idTransaccion, $idOrden]);

        // B) Vaciar el carrito temporal del cliente para que no se le dupliquen los productos en su próxima sesión
        $stmtDelCart = $db->prepare("DELETE FROM carritos WHERE usuario_id = ?");
        $stmtDelCart->execute([$orden['usuario_id']]);

        $db->commit();
        error_log("Webhook Payku: Orden N° $idOrden marcada como PAGADA con éxito.");
        
        // Responder 200 OK a Payku para confirmar que recibimos la notificación correctamente
        http_response_code(200);
        echo json_encode(["status" => "success", "message" => "Pago procesado y orden confirmada"]);
        
    } else {
        // Si el pago falló o fue rechazado
        $stmtUpdate = $db->prepare("UPDATE cotizaciones_encabezado SET estado_pago = 'RECHAZADA', token_pasarela = ? WHERE id = ?");
        $stmtUpdate->execute([$idTransaccion, $idOrden]);
        
        error_log("Webhook Payku: El pago para la orden N° $idOrden fue rechazado o fallido.");
        http_response_code(200); // Se responde 200 para que Payku no intente re-enviar la notificación de fallo infinitamente
        echo json_encode(["status" => "success", "message" => "Orden marcada como rechazada"]);
    }

} catch (Exception $e) {
    if (isset($db) && $db->inTransaction()) {
        $db->rollBack();
    }
    error_log("Error crítico en Webhook Payku: " . $e->getMessage());
    http_response_code(500);
    echo json_encode(["status" => "error", "message" => "Internal server error"]);
}