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

require_once 'db_connection.php';
require_once 'response_helper.php';

$input = file_get_contents("php://input");
$_POST = json_decode($input, true);

// Parámetros requeridos
$clave = $_GET['clave'] ?? $_POST['clave'] ?? null;
$sucursal = $_GET['sucursal'] ?? $_POST['sucursal'] ?? null;
$metodo = $_GET['metodo'] ?? $_POST['metodo'] ?? null; // OPENPAY, MERCADOPAGO, PAYPAL

if (!$clave || !$sucursal || !$metodo) {
    jsonError("Parámetros 'clave', 'sucursal' y 'metodo' requeridos.");
}

// Validar metodo
$metodo = strtoupper($metodo);
if (!in_array($metodo, ['OPENPAY', 'MERCADOPAGO', 'PAYPAL'])) {
    jsonError("El parámetro 'metodo' debe ser: OPENPAY, MERCADOPAGO o PAYPAL");
}

// Conexión a base central
$conn = getDatabaseConnection("direct18_ProGymCloud");

if (!$conn) {
    jsonError("Error de conexión a la base de datos.");
}

// Obtener idGimnasio por clave
$stmt = $conn->prepare("SELECT idGimnasio FROM gimnasios WHERE clave = ?");
if (!$stmt) {
    jsonError("Error en consulta gimnasios: " . $conn->error);
}

$stmt->bind_param("s", $clave);
$stmt->execute();
$result = $stmt->get_result();
$gymData = $result->fetch_assoc();

if (!$gymData) {
    jsonError("Gimnasio no encontrado con esa clave.");
}

$idGimnasio = $gymData['idGimnasio'];
$stmt->close();

// ===============================================
// OPENPAY
// ===============================================
if ($metodo === 'OPENPAY') {
    $stmt = $conn->prepare("
        SELECT 
            openpay_id,
            public_key,
            private_key,
            activo,
            secure3d
        FROM info_openpay
        WHERE gimnasio_idGimnasio = ? 
          AND sucursal_idSucursal = ?
        LIMIT 1
    ");

    if (!$stmt) {
        jsonError("Error en consulta info_openpay: " . $conn->error);
    }

    $stmt->bind_param("ii", $idGimnasio, $sucursal);
    $stmt->execute();
    $result = $stmt->get_result();
    $credenciales = $result->fetch_assoc();

    if (!$credenciales) {
        jsonError("No se encontraron credenciales de OpenPay para esta sucursal.");
    }

    $stmt->close();

    if (!$credenciales['activo']) {
        jsonError("OpenPay no está activo para esta sucursal.");
    }

    $merchantId = $credenciales['openpay_id'];
    $privateKey = $credenciales['private_key'];
    $publicKey = $credenciales['public_key'];
    $secure3d = $credenciales['secure3d'];

    if (empty($merchantId) || empty($privateKey)) {
        jsonError("Las credenciales de OpenPay están incompletas.");
    }

    // Función para validar OpenPay
    function validarOpenPay($merchantId, $privateKey, $url) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url . "/v1/" . $merchantId);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HTTPGET, 1);
        curl_setopt($ch, CURLOPT_USERPWD, $privateKey . ":");
        curl_setopt($ch, CURLOPT_TIMEOUT, 10);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
        
        $headers = ["Content-Type: application/json"];
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        
        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        
        return ($httpCode == 200 || $httpCode == 201);
    }

    // Validar en producción
    $esProduccion = validarOpenPay($merchantId, $privateKey, "https://api.openpay.mx");

    if ($esProduccion) {
        jsonResponse([
            "success" => true,
            "openpay" => [
                "merchant_id" => $merchantId,
                "public_key" => $publicKey,
                "private_key" => $privateKey,
                "sandbox" => false,
                "produccion" => true,
                "secure3d" => (bool) $secure3d
            ]
        ]);
    }

    // Validar en sandbox
    $esSandbox = validarOpenPay($merchantId, $privateKey, "https://sandbox-api.openpay.mx");

    if ($esSandbox) {
        jsonResponse([
            "success" => true,
            "openpay" => [
                "merchant_id" => $merchantId,
                "public_key" => $publicKey,
                "private_key" => $privateKey,
                "sandbox" => true,
                "produccion" => false,
                "secure3d" => (bool) $secure3d
            ]
        ]);
    }

    jsonError("Las credenciales de OpenPay no son válidas.");
}


// ===============================================
// PAYPAL
// ===============================================
if ($metodo === 'PAYPAL') {
    $stmt = $conn->prepare("
        SELECT 
            client_id,
            secret_id,
            activo
        FROM info_paypal
        WHERE gimnasio_idGimnasio = ? 
          AND sucursal_idSucursal = ?
        LIMIT 1
    ");

    if (!$stmt) {
        jsonError("Error en consulta info_paypal: " . $conn->error);
    }

    $stmt->bind_param("ii", $idGimnasio, $sucursal);
    $stmt->execute();
    $result = $stmt->get_result();
    $credenciales = $result->fetch_assoc();

    if (!$credenciales) {
        jsonError("No se encontraron credenciales de PayPal para esta sucursal.");
    }

    $stmt->close();

    if (!$credenciales['activo']) {
        jsonError("PayPal no está activo para esta sucursal.");
    }

    $clientId = $credenciales['client_id'];
    $secret = $credenciales['secret_id'];

    if (empty($clientId) || empty($secret)) {
        jsonError("Las credenciales de PayPal están incompletas.");
    }

    // Función para validar PayPal
    function validarPayPal($clientId, $secret, $url) {
        $basicAuth = base64_encode("$clientId:$secret");
        
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, "grant_type=client_credentials");
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 10);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
        
        $headers = [
            "Accept: application/json",
            "Accept-Language: en_US",
            "Authorization: Basic $basicAuth"
        ];
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        
        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        
        return ($httpCode == 200);
    }

    // Validar en producción
    $esProduccion = validarPayPal($clientId, $secret, "https://api.paypal.com/v1/oauth2/token");

    if ($esProduccion) {
        jsonResponse([
            "success" => true,
            "paypal" => [
                "client_id" => $clientId,
                "secret" => $secret,
                "sandbox" => false,
                "produccion" => true
            ]
        ]);
    }

    // Validar en sandbox
    $esSandbox = validarPayPal($clientId, $secret, "https://api.sandbox.paypal.com/v1/oauth2/token");

    if ($esSandbox) {
        jsonResponse([
            "success" => true,
            "paypal" => [
                "client_id" => $clientId,
                "secret" => $secret,
                "sandbox" => true,
                "produccion" => false
            ]
        ]);
    }

    jsonError("Las credenciales de PayPal no son válidas.");
}

$conn->close();
?>