<?php
/**
 * desbloquear_zoom.php — Sprint 429 (fix CSRF sesión)
 * Seguridad: valida que el código exista en BD activo=1
 * No depende de sesión para evitar conflicto con .user.ini
 */
ini_set('display_errors', 1);
error_reporting(E_ALL);
header('Content-Type: text/html; charset=UTF-8');

require_once __DIR__ . '/env_loader.php';
require_once __DIR__ . '/app/models/conexion.php';
require_once __DIR__ . '/app/models/user.php';

use app\models\user;
use app\models\conexion;

if (!defined('REGISTRATION_MEETING_ID')) {
    define('REGISTRATION_MEETING_ID', env('ZOOM_MEETING_ID', ''));
    define('ZOOM_S2S_CLIENT_ID',     env('ZOOM_S2S_CLIENT_ID', ''));
    define('ZOOM_S2S_CLIENT_SECRET', env('ZOOM_S2S_CLIENT_SECRET', ''));
    define('ZOOM_S2S_ACCOUNT_ID',    env('ZOOM_S2S_ACCOUNT_ID', ''));
}

$codigo = trim($_POST['codigo'] ?? '');

file_put_contents(__DIR__.'/zoom_debug.log',
    date('c')." [DEBUG] desbloquear_zoom.php | codigo=".($codigo ?: 'vacio')."\n", FILE_APPEND);

// Validar que el código exista en BD (sin sesión)
if (empty($codigo)) {
    header('Location: registro_quorum.php');
    exit;
}

$connCheck = new conexion();
$dbCheck   = $connCheck->DB();
$chk = $dbCheck->prepare("SELECT user_id FROM users WHERE password = :pass AND activo = 1 LIMIT 1");
$chk->execute([':pass' => $codigo]);
if (!$chk->fetch()) {
    file_put_contents(__DIR__.'/zoom_debug.log',
        date('c')." [WARN] desbloquear_zoom.php | codigo no válido en BD\n", FILE_APPEND);
    header('Location: registro_quorum.php');
    exit;
}

// Funciones Zoom inline
function obtenerAccessTokenZoom_d()
{
    $tokenUrl   = 'https://zoom.us/oauth/token?grant_type=account_credentials&account_id=' . ZOOM_S2S_ACCOUNT_ID;
    $authHeader = 'Authorization: Basic ' . base64_encode(ZOOM_S2S_CLIENT_ID . ':' . ZOOM_S2S_CLIENT_SECRET);
    $ch = curl_init($tokenUrl);
    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json', $authHeader]);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    $err      = curl_error($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    if ($err) {
        file_put_contents(__DIR__.'/zoom_debug.log', date('c')." [ERROR] desbloqueo obtenerToken cURL: $err\n", FILE_APPEND);
        return null;
    }
    file_put_contents(__DIR__.'/zoom_debug.log', date('c')." [INFO] desbloqueo obtenerToken: HTTP $httpCode\n", FILE_APPEND);
    $data = json_decode($response, true);
    return $data['access_token'] ?? null;
}

function crearRegistranteZoom_d($meetingId, $email, $nombre, $zona = 'Participante')
{
    $accessToken = obtenerAccessTokenZoom_d();
    if (!$accessToken) return null;
    $ch = curl_init("https://api.zoom.us/v2/meetings/$meetingId/registrants");
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Content-Type: application/json',
        'Authorization: Bearer ' . $accessToken
    ]);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
        'email'      => $email,
        'first_name' => $nombre ?: 'Usuario',
        'last_name'  => $zona   ?: 'Participante'
    ]));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    $err      = curl_error($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    if ($err) {
        file_put_contents(__DIR__.'/zoom_debug.log', date('c')." [ERROR] desbloqueo crearRegistrante cURL: $err\n", FILE_APPEND);
        return null;
    }
    file_put_contents(__DIR__.'/zoom_debug.log',
        date('c')." [INFO] desbloqueo crearRegistrante: HTTP $httpCode | email=$email | Resp: $response\n", FILE_APPEND);
    if ($httpCode === 429) return ['error' => 'rate_limit'];
    $resp = json_decode($response, true);
    if (isset($resp['join_url'], $resp['registrant_id'])) {
        return ['join_url' => $resp['join_url'], 'registrant_id' => $resp['registrant_id']];
    }
    return null;
}

// Estado
$resultado = 'error';
$csrfNuevo = '';

// 1. Rotar email
$userModel  = new user();
$nuevoEmail = $userModel->mutarEmailZoom($codigo);

file_put_contents(__DIR__.'/zoom_debug.log',
    date('c')." [DEBUG] mutarEmailZoom resultado: ".($nuevoEmail === false ? 'FALSE/limite' : $nuevoEmail)."\n", FILE_APPEND);

if ($nuevoEmail === false) {
    $resultado = 'limite';
} else {
    // 2. Obtener datos del delegado
    $conn = new conexion();
    $db   = $conn->DB();
    $stmt = $db->prepare("SELECT name, zona FROM users WHERE password = :pass AND activo = 1 LIMIT 1");
    $stmt->execute([':pass' => $codigo]);
    $row  = $stmt->fetch(PDO::FETCH_ASSOC);

    if (!$row) {
        header('Location: registro_quorum.php');
        exit;
    }

    // 3. Reintentar en Zoom con nuevo email
    $zoomData = crearRegistranteZoom_d(
        REGISTRATION_MEETING_ID,
        $nuevoEmail,
        $row['name'],
        $row['zona'] ?: 'Participante'
    );

    if ($zoomData && isset($zoomData['join_url'], $zoomData['registrant_id'])) {
        $upd = $db->prepare("UPDATE users SET registrozoom = :regId WHERE password = :pass LIMIT 1");
        $upd->execute([':regId' => $zoomData['registrant_id'], ':pass' => $codigo]);
        file_put_contents(__DIR__.'/zoom_debug.log',
            date('c')." [OK] desbloqueo exitoso | email=$nuevoEmail | redirect Zoom\n", FILE_APPEND);
        header('Location: ' . $zoomData['join_url']);
        exit;

    } elseif (is_array($zoomData) && ($zoomData['error'] ?? '') === 'rate_limit') {
        $resultado = 'rate_limit';
    } else {
        $resultado = 'error';
    }
}
?>
<!doctype html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <?php require __DIR__ . '/head.php'; ?>
    <link href="assets/css/estilos.css" rel="stylesheet">
    <style>
        body { display:flex; align-items:center; justify-content:center; min-height:100vh; }
        .container { display:flex; align-items:center; justify-content:center; min-height:100vh; max-width:100% !important; }
        .row { justify-content:center; width:100%; margin:0; }
        .col-md-4:not(.well) { display:none !important; }
        .col-md-4.well { flex:0 0 auto !important; width:auto !important; padding:0 16px; }
        .card { width:390px; max-width:92vw; margin:-8vh auto 0 auto !important; border-radius:22px !important; background:#ffffff !important; box-shadow:0 4px 24px rgba(0,0,0,.10) !important; border:none !important; overflow:hidden !important; }
        .btn-desbloqueo { width:100%; background:#f67707; border:none; border-radius:25px; color:#fff; font-weight:700; padding:10px; font-size:1em; margin-top:8px; cursor:pointer; transition:background .15s; display:block; text-align:center; text-decoration:none; }
        .btn-desbloqueo:hover { background:#d96200; color:#fff; }
        .btn-ws { width:100%; background:#25D366; border:none; border-radius:25px; color:#fff; font-weight:700; padding:10px; font-size:1em; margin-top:8px; display:block; text-align:center; text-decoration:none; }
        .btn-ws:hover { background:#1da851; color:#fff; }
        .btn-volver { width:100%; background:#6c757d; border:none; border-radius:25px; color:#fff; font-weight:600; padding:9px; font-size:.9em; margin-top:8px; display:block; text-align:center; text-decoration:none; }
        .btn-volver:hover { background:#565e64; color:#fff; }
    </style>
</head>
<body>
<div class="container">
    <div class="row">
        <div class="col-md-4"></div>
        <div class="col-md-4 well">
            <div class="card">
                <div class="card-body text-center" style="padding:32px 28px 28px;">
                    <img src="assets/images/logo.png" style="width:55%; margin-bottom:10px;">
                    <h4 class="my-2" style="font-weight:600; color:#04548c; letter-spacing:.3px;">REGISTRO QUÓRUM</h4>

                    <?php if ($resultado === 'rate_limit'): ?>
                    <div class="alert alert-warning" style="font-size:.88em; border-radius:10px; text-align:left;">
                        <strong>⚠ El bloqueo persiste.</strong><br>
                        Zoom aún no acepta el registro. Puedes intentar desbloquear de nuevo.
                    </div>
                    <form action="desbloquear_zoom.php" method="post" autocomplete="off">
                        <input type="hidden" name="codigo"
                               value="<?= htmlspecialchars($codigo, ENT_QUOTES, 'UTF-8') ?>">
                        <button type="submit" class="btn-desbloqueo"
                                onclick="var b=this; b.innerHTML='⏳ Desbloqueando...'; setTimeout(function(){b.disabled=true;},300);">
                            🔓 Desbloquear y reintentar
                        </button>
                    </form>
                    <a href="https://api.whatsapp.com/send?phone=573195399454&text=Hola%2C%20necesito%20ayuda.%20pertenezco%20a%20FONDOENERGIA"
                       target="_blank" class="btn-ws">💬 Contactar soporte</a>

                    <?php elseif ($resultado === 'limite'): ?>
                    <div class="alert alert-danger" style="font-size:.88em; border-radius:10px; text-align:left;">
                        <strong>⛔ No es posible desbloquear automáticamente.</strong><br>
                        Se alcanzó el límite de intentos del día. Contacte al equipo de soporte.
                    </div>
                    <a href="https://api.whatsapp.com/send?phone=573195399454&text=Hola%2C%20necesito%20ayuda.%20pertenezco%20a%20FONDOENERGIA"
                       target="_blank" class="btn-ws">💬 Contactar soporte</a>
                    <a href="registro_quorum.php" class="btn-volver">← Volver al inicio</a>

                    <?php else: ?>
                    <div class="alert alert-danger" style="font-size:.88em; border-radius:10px; text-align:left;">
                        <strong>⚠ Error inesperado.</strong><br>
                        No fue posible completar el registro. Intenta de nuevo o contacta soporte.
                    </div>
                    <a href="registro_quorum.php" class="btn-volver">← Intentar de nuevo</a>
                    <a href="https://api.whatsapp.com/send?phone=573195399454&text=Hola%2C%20necesito%20ayuda.%20pertenezco%20a%20FONDOENERGIA"
                       target="_blank" class="btn-ws">💬 Contactar soporte</a>
                    <?php endif; ?>

                    <p style="font-size:.9em; color:#666; margin-top:14px; margin-bottom:0;">
                        ASAMBLEA FONDOENERGIA 2026
                    </p>
                </div>
            </div>
        </div>
    </div>
</div>
</body>
</html>
