<?php
// Mostrar errores (para depuración)
ini_set('display_errors', 1);
error_reporting(E_ALL);

// Forzar salida en UTF-8 (encabezado HTTP)
header('Content-Type: text/html; charset=UTF-8');

// Cargar variables de entorno
require_once __DIR__ . '/env_loader.php';

// Definir las constantes usando las variables del archivo .env
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', ''));

// Incluir el archivo de la clase de conexión y cargarla
require_once __DIR__ . '/app/models/conexion.php';
use app\models\conexion;

session_start();

// Variables para mostrar mensajes y controlar formularios
$quorum_error_message      = '';
$mostrarFormularioRegistro = false;
$nombre                    = '';
$cedula                    = '';

// ── SPRINT 429: variables de estado desbloqueo ───────────────────────
$esBloqueoZoom        = false;   // true cuando Zoom responde HTTP 429
$codigoParaDesbloqueo = '';      // código del delegado bloqueado
$csrfDesbloqueo       = '';      // token CSRF para el form de desbloqueo

/* ----------------------------------------------------------------
   FUNCIÓN: obtenerAccessTokenZoom
   (sin cambios respecto al original)
   ---------------------------------------------------------------- */
function obtenerAccessTokenZoom()
{
    $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] obtenerAccessTokenZoom cURL: $err\n", FILE_APPEND);
        return null;
    }

    file_put_contents(__DIR__.'/zoom_debug.log', date('c')." [INFO] obtenerAccessTokenZoom: HTTP $httpCode => $response\n", FILE_APPEND);

    $respData = json_decode($response, true);
    if (!empty($respData['access_token'])) {
        return $respData['access_token'];
    }

    file_put_contents(__DIR__.'/zoom_debug.log', date('c')." [ERROR] obtenerAccessTokenZoom: sin 'access_token' en resp\n", FILE_APPEND);
    return null;
}

/* ----------------------------------------------------------------
   FUNCIÓN: crearRegistranteZoom
   SPRINT 429: agrega detección de HTTP 429
   Retorna:
     ['join_url'=>..., 'registrant_id'=>...]  → éxito
     ['error'=>'rate_limit']                  → bloqueado por Zoom
     null                                      → otro error
   ---------------------------------------------------------------- */
function crearRegistranteZoom($meetingId, $email, $nombre, $zona = 'Participante')
{
    $accessToken = obtenerAccessTokenZoom();
    if (!$accessToken) {
        file_put_contents(__DIR__.'/zoom_debug.log', date('c')." [ERROR] -> Sin token. No se crea registrante.\n", FILE_APPEND);
        return null;
    }

    $postData = [
        'email'      => $email,
        'first_name' => $nombre ?: 'Usuario',
        'last_name'  => $zona   ?: 'Participante'
    ];

    $url = "https://api.zoom.us/v2/meetings/$meetingId/registrants";

    $ch = curl_init($url);
    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($postData));
    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] -> cURL error en crearRegistranteZoom: $err\n", FILE_APPEND);
        return null;
    }

    file_put_contents(__DIR__.'/zoom_debug.log', date('c')." [INFO] -> crearRegistranteZoom: HTTP $httpCode | email=$email | Resp: $response\n", FILE_APPEND);

    // ── SPRINT 429: detectar bloqueo por rate limit ──────────────────
    if ($httpCode === 429) {
        file_put_contents(__DIR__.'/zoom_debug.log', date('c')." [WARN] -> HTTP 429 rate_limit | email=$email\n", FILE_APPEND);
        return ['error' => 'rate_limit'];
    }

    $respObj = json_decode($response, true);

    if (isset($respObj['join_url'], $respObj['registrant_id'])) {
        return [
            'join_url'      => $respObj['join_url'],
            'registrant_id' => $respObj['registrant_id']
        ];
    }

    file_put_contents(__DIR__.'/zoom_debug.log', date('c')." [ERROR] -> No 'join_url'/'registrant_id' en crearRegistranteZoom resp.\n", FILE_APPEND);
    return null;
}

// ── Lógica principal ──────────────────────────────────────────────────
if (!empty($_POST['btnLogin'])) {
    $username  = trim($_POST['username']  ?? '');
    $username2 = trim($_POST['username2'] ?? '');

    $conn = new conexion();
    $db   = $conn->DB();
    $db->exec("SET NAMES utf8");

    if ($username === '' && $username2 === '') {
        $quorum_error_message = '¡El campo de código es obligatorio!';

    } elseif ($username !== '') {
        // ── Paso 1: validar código ────────────────────────────────────
        $sql  = "SELECT
                    email          AS tot,
                    fecha_ingreso  AS fechaI,
                    name           AS Nombre,
                    username       AS Cedula,
                    password       AS Clave,
                    quorum         AS quorumActual
                 FROM users
                 WHERE password = :pass AND activo = 1";
        $stmt = $db->prepare($sql);
        $stmt->bindValue(':pass', $username, PDO::PARAM_STR);
        $stmt->execute();
        $row = $stmt->fetch(PDO::FETCH_ASSOC);

        if (!$row) {
            $quorum_error_message = 'Estimad@, por favor verifique la clave o contacte a soporte <a href="https://api.whatsapp.com/send?phone=573195399454&text=Hola%2C%20necesito%20ayuda.%20pertenezco%20a%20FONDOENERGIA" target="_blank" style="color:#25D366;font-weight:bold;text-decoration:underline;">dando clic aquí</a>.';
        } else {
            $nombre       = $row['Nombre'];
            $cedula       = $row['Cedula'];
            $quorumActual = $row['quorumActual'] ?? null;

            if ((int)$quorumActual === 1) {
                $quorum_error_message = 'El usuario ya se encuentra registrado y activo en la reunión.';
            } else {
                $mostrarFormularioRegistro = true;
            }
        }

    } elseif ($username2 !== '') {
        // ── Paso 2: confirmar y registrar en Zoom ─────────────────────
        $sql2  = "SELECT email AS tot, name AS Nombre, zona
                  FROM users
                  WHERE password = :pass2 AND activo = 1
                  LIMIT 1";
        $stmt3 = $db->prepare($sql2);
        $stmt3->bindValue(':pass2', $username2, PDO::PARAM_STR);
        $stmt3->execute();
        $row2 = $stmt3->fetch(PDO::FETCH_ASSOC);

        $zoomData = null;
        if ($row2) {
            $zoomData = crearRegistranteZoom(
                REGISTRATION_MEETING_ID,
                $row2['tot']    ?? '',
                $row2['Nombre'] ?? '',
                $row2['zona']   ?? 'Participante'
            );
        } else {
            file_put_contents(__DIR__.'/zoom_debug.log', date('c')." [ERROR] -> No se halló email/nombre/zona en la BD.\n", FILE_APPEND);
        }

        if ($zoomData && isset($zoomData['join_url'], $zoomData['registrant_id'])) {
            // ── Éxito ──────────────────────────────────────────────────
            $stmtReg = $db->prepare("UPDATE users SET registrozoom = :regId WHERE password = :pass3 LIMIT 1");
            $stmtReg->bindValue(':regId', $zoomData['registrant_id'], PDO::PARAM_STR);
            $stmtReg->bindValue(':pass3', $username2, PDO::PARAM_STR);
            $stmtReg->execute();
            header("Location: " . $zoomData['join_url']);
            exit;

        } elseif (is_array($zoomData) && ($zoomData['error'] ?? '') === 'rate_limit') {
            // ── SPRINT 429: preparar UI de desbloqueo ─────────────────
            $esBloqueoZoom        = true;
            $codigoParaDesbloqueo = $username2;
            $csrfDesbloqueo       = bin2hex(random_bytes(16));
            $_SESSION['csrf_desbloqueo'] = $csrfDesbloqueo;

        } else {
            $quorum_error_message = 'Error al crear el registro en Zoom. Intente de nuevo o contacte a soporte <a href="https://api.whatsapp.com/send?phone=573195399454&text=Hola%2C%20necesito%20ayuda.%20pertenezco%20a%20FONDOENERGIA" target="_blank" style="color:#25D366;font-weight:bold;text-decoration:underline;">dando clic aquí</a>.';
        }
    }
}
?>
<!doctype html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <?php require '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-ingresar {
            width:100%; background:#17c1e8; border:none; border-radius:25px;
            color:#fff; font-weight:700; padding:10px; font-size:1em;
            margin-top:6px; cursor:pointer; transition:background .15s;
        }
        .btn-ingresar:hover { background:#0ea8cc; }
        /* SPRINT 429: botón naranja desbloqueo */
        .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;
        }
        .btn-desbloqueo:hover { background:#d96200; }
        .info-box {
            background:#f0f8ff; border-radius:10px;
            padding:12px 14px; text-align:left; font-size:.9em; margin-bottom:10px;
        }
    </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 ($esBloqueoZoom): ?>
                    <!-- ═══ SPRINT 429: UI desbloqueo automático ═══ -->
                    <div class="alert alert-warning" style="font-size:.88em; border-radius:10px; text-align:left;">
                        <strong>⚠ Acceso temporalmente bloqueado.</strong><br>
                        Zoom detectó varios intentos de ingreso durante el día.
                        Presiona el botón para desbloquearte automáticamente.
                    </div>
                    <form action="desbloquear_zoom.php" method="post" autocomplete="off">
                        <input type="hidden" name="codigo"
                               value="<?= htmlspecialchars($codigoParaDesbloqueo, ENT_QUOTES, 'UTF-8') ?>">
                        <input type="hidden" name="csrf_desbloqueo"
                               value="<?= htmlspecialchars($csrfDesbloqueo, 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>
                    <div style="margin-top:10px;">
                        <a href="https://api.whatsapp.com/send?phone=573195399454&text=Hola%2C%20necesito%20ayuda.%20pertenezco%20a%20FONDOENERGIA"
                           target="_blank" style="font-size:.85em; color:#25D366; text-decoration:none;">
                            💬 Contactar soporte
                        </a>
                    </div>

                    <?php else: ?>
                    <!-- ═══ Flujo normal ═══ -->
                    <?php if (!empty($quorum_error_message)): ?>
                        <div class="alert alert-danger" style="font-size:.9em; border-radius:10px;">
                            <strong>Atención: </strong><?= $quorum_error_message ?>
                        </div>
                    <?php endif; ?>

                    <form action="registro_quorum.php" method="post" autocomplete="off">
                        <?php if (!$mostrarFormularioRegistro): ?>
                            <div class="form-floating mb-3">
                                <input type="number" name="username" class="form-control"
                                       id="floatingCodigo" placeholder="codigo" autofocus>
                                <label for="floatingCodigo">Código</label>
                            </div>
                            <div class="d-grid">
                                <button type="submit" name="btnLogin" value="1" class="btn-ingresar">Ingresar</button>
                            </div>
                        <?php else: ?>
                            <div class="info-box mb-3">
                                <strong>Bienvenido:</strong> <?= htmlspecialchars($nombre, ENT_QUOTES, 'UTF-8') ?><br>
                                <strong>Identificación:</strong> <?= htmlspecialchars($cedula, ENT_QUOTES, 'UTF-8') ?><br>
                                <small style="color:#666;">Será dirigido a la Asamblea Virtual tras confirmar.</small>
                            </div>
                            <input type="hidden" name="username2"
                                   value="<?= htmlspecialchars($username, ENT_QUOTES, 'UTF-8') ?>">
                            <div class="d-grid">
                                <button type="submit" name="btnLogin" value="1" class="btn-ingresar">Confirmar Registro</button>
                            </div>
                        <?php endif; ?>
                    </form>
                    <?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>
