<?php
/**
 * public/acceso/install_local.php
 * Sistema de Instalación, Auto-Provisionamiento y Verificación de Entorno para Cyfort Access Pro.
 * Compatible 100% con Servidores en Nube (Hostinger / segur.biz) y Entornos Locales.
 */
declare(strict_types=1);

ob_start();
require_once __DIR__ . '/config/db.php';

$isPost = ($_SERVER['REQUEST_METHOD'] === 'POST');
$installed = false;
$errorMsg = '';
$logs = [];

// Diagnóstico de dependencias
$phpVersion = PHP_VERSION;
$pdoOk = extension_loaded('pdo') && extension_loaded('pdo_mysql');
$curlOk = extension_loaded('curl');
$jsonOk = extension_loaded('json');
$opensslOk = extension_loaded('openssl');
$allReqsOk = version_compare(PHP_VERSION, '8.0.0', '>=') && $pdoOk && $curlOk && $jsonOk && $opensslOk;

if ($isPost && isset($_POST['run_install'])) {
    $dbHost = trim($_POST['db_host'] ?? 'localhost');
    $dbPort = trim($_POST['db_port'] ?? '3306');
    $dbName = trim($_POST['db_name'] ?? 'u258126604_login');
    $dbUser = trim($_POST['db_user'] ?? 'root');
    $dbPass = (string)($_POST['db_pass'] ?? '');

    try {
        $pdo = null;

        // 1. Intentar primero con la conexión del servidor (Hostinger segur.biz / db.php)
        try {
            $pdo = acceso_db();
            $logs[] = "✅ Conexión exitosa a la base de datos con las credenciales del servidor (Hostinger / segur.biz).";
        } catch (Throwable $e1) {
            // 2. Si falla (por ejemplo en local XAMPP/WAMP fresco), conectar con formulario
            $logs[] = "🔍 Intentando conexión personalizada con MySQL ({$dbHost}:{$dbPort})...";
            $dsnNoDb = "mysql:host={$dbHost};port={$dbPort};charset=utf8mb4";
            $pdoServer = new PDO($dsnNoDb, $dbUser, $dbPass, [
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
            ]);

            $logs[] = "📁 Verificando/Creando base de datos '{$dbName}'...";
            $pdoServer->exec("CREATE DATABASE IF NOT EXISTS `{$dbName}` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");

            $dsnDb = "mysql:host={$dbHost};port={$dbPort};dbname={$dbName};charset=utf8mb4";
            $pdo = new PDO($dsnDb, $dbUser, $dbPass, [
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
            ]);
        }

        $logs[] = "⚙️ Creando y verificando tablas del esquema Cyfort Access Pro...";

        // 1. Tabla Usuarios
        $pdo->exec("
            CREATE TABLE IF NOT EXISTS `acceso_usuarios` (
                `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
                `empresa_id` INT UNSIGNED NOT NULL DEFAULT 1,
                `username` VARCHAR(60) NOT NULL UNIQUE,
                `nombre` VARCHAR(150) NOT NULL,
                `email` VARCHAR(150) NOT NULL,
                `password_hash` VARCHAR(255) NOT NULL,
                `rol` ENUM('superadmin', 'admin', 'vigilante', 'operador') NOT NULL DEFAULT 'vigilante',
                `estado` ENUM('activo', 'inactivo', 'bloqueado') NOT NULL DEFAULT 'activo',
                `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
        ");
        $logs[] = " &bull; Tabla 'acceso_usuarios' configurada.";

        // 2. Tabla Registros
        $pdo->exec("
            CREATE TABLE IF NOT EXISTS `acceso_registros` (
                `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
                `empresa_id` INT UNSIGNED NOT NULL DEFAULT 1,
                `tipo_acceso` ENUM('peatonal', 'vehicular') NOT NULL DEFAULT 'peatonal',
                `tipo_persona` ENUM('visitante', 'residente', 'empleado', 'proveedor', 'contratista') NOT NULL DEFAULT 'visitante',
                `documento_numero` VARCHAR(50) NOT NULL,
                `nombre_completo` VARCHAR(150) NOT NULL,
                `primer_apellido` VARCHAR(80) DEFAULT NULL,
                `segundo_apellido` VARCHAR(80) DEFAULT NULL,
                `sexo` VARCHAR(10) DEFAULT NULL,
                `fecha_nacimiento` VARCHAR(30) DEFAULT NULL,
                `rh` VARCHAR(10) DEFAULT NULL,
                `placa_vehiculo` VARCHAR(20) DEFAULT NULL,
                `tipo_vehiculo` ENUM('carro', 'moto', 'camion', 'ninguno') NOT NULL DEFAULT 'ninguno',
                `destino_puesto` VARCHAR(150) NOT NULL DEFAULT 'Entrada Principal',
                `observaciones` TEXT DEFAULT NULL,
                `estado_lista` ENUM('permitido', 'lista_negra', 'autorizado', 'no_registrado') NOT NULL DEFAULT 'permitido',
                `metodo_ingreso` VARCHAR(50) NOT NULL DEFAULT 'cedula_pdf417',
                `usuario_registro_id` INT UNSIGNED NOT NULL DEFAULT 1,
                `vigilante_nombre` VARCHAR(150) DEFAULT 'Vigilante de Servicio',
                `fecha_ingreso` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
                `fecha_salida` DATETIME DEFAULT NULL,
                `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
        ");
        $logs[] = " &bull; Tabla 'acceso_registros' configurada.";

        // 3. Tabla Pases QR
        $pdo->exec("
            CREATE TABLE IF NOT EXISTS `acceso_pases_qr` (
                `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
                `empresa_id` INT UNSIGNED NOT NULL DEFAULT 1,
                `codigo_pass` VARCHAR(80) NOT NULL UNIQUE,
                `nombre_invitado` VARCHAR(150) NOT NULL,
                `documento_invitado` VARCHAR(50) NOT NULL,
                `email_invitado` VARCHAR(150) DEFAULT NULL,
                `placa_vehiculo` VARCHAR(20) DEFAULT NULL,
                `destino` VARCHAR(150) NOT NULL DEFAULT 'Entrada Principal',
                `fecha_validez_inicio` DATETIME NOT NULL,
                `fecha_validez_fin` DATETIME NOT NULL,
                `estado` ENUM('activo', 'usado', 'expirado', 'cancelado') NOT NULL DEFAULT 'activo',
                `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
        ");
        $logs[] = " &bull; Tabla 'acceso_pases_qr' configurada.";

        // 4. Tabla Lista Negra Placas
        $pdo->exec("
            CREATE TABLE IF NOT EXISTS `acceso_lista_negra_placas` (
                `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
                `empresa_id` INT UNSIGNED NOT NULL DEFAULT 1,
                `placa` VARCHAR(20) NOT NULL UNIQUE,
                `tipo_vehiculo` ENUM('carro', 'moto', 'camion') NOT NULL DEFAULT 'carro',
                `motivo` TEXT NOT NULL,
                `nivel_riesgo` ENUM('medio', 'alto', 'critico') NOT NULL DEFAULT 'alto',
                `registrado_por` VARCHAR(150) NOT NULL,
                `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
        ");
        $logs[] = " &bull; Tabla 'acceso_lista_negra_placas' configurada.";

        // 5. Tabla Lista Blanca Placas
        $pdo->exec("
            CREATE TABLE IF NOT EXISTS `acceso_lista_blanca_placas` (
                `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
                `empresa_id` INT UNSIGNED NOT NULL DEFAULT 1,
                `placa` VARCHAR(20) NOT NULL UNIQUE,
                `propietario_nombre` VARCHAR(150) NOT NULL,
                `documento_propietario` VARCHAR(50) DEFAULT NULL,
                `tipo_vehiculo` ENUM('carro', 'moto', 'camion') NOT NULL DEFAULT 'carro',
                `tipo_usuario` ENUM('residente', 'empleado', 'autorizado', 'vip') NOT NULL DEFAULT 'residente',
                `apartamento_puesto` VARCHAR(100) DEFAULT 'Parqueadero Residentes',
                `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
        ");
        $logs[] = " &bull; Tabla 'acceso_lista_blanca_placas' configurada.";

        // Pre-sembrar Administrador brayan / Brayan13st97
        $passHash = password_hash('Brayan13st97', PASSWORD_BCRYPT);
        $stmtCheck = $pdo->prepare("SELECT id FROM acceso_usuarios WHERE username = 'brayan'");
        $stmtCheck->execute();
        if (!$stmtCheck->fetch()) {
            $stmtInit = $pdo->prepare("INSERT INTO acceso_usuarios (empresa_id, username, nombre, email, password_hash, rol, estado) VALUES (1, 'brayan', 'Brayan Stiven Monsalve', 'cyfortbj@segur.biz', ?, 'admin', 'activo')");
            $stmtInit->execute([$passHash]);
            $logs[] = "👤 Usuario Administrador pre-sembrado: 'brayan' / 'Brayan13st97'.";
        }

        // Pre-sembrar Pase QR Demo 1-Clic
        $stmtQrCheck = $pdo->prepare("SELECT id FROM acceso_pases_qr WHERE codigo_pass = 'CYF-QR-DEMO123'");
        $stmtQrCheck->execute();
        if (!$stmtQrCheck->fetch()) {
            $stmtQrInit = $pdo->prepare("INSERT INTO acceso_pases_qr (empresa_id, codigo_pass, nombre_invitado, documento_invitado, email_invitado, placa_vehiculo, destino, fecha_validez_inicio, fecha_validez_fin, estado) VALUES (1, 'CYF-QR-DEMO123', 'Visitante Demo Internacional', '1017248673', 'demo@segur.biz', 'ABC123', 'Sede Principal Cyfort', '2024-01-01 00:00:00', '2030-12-31 23:59:59', 'activo')");
            $stmtQrInit->execute();
            $logs[] = "🎟️ Pase QR Demo pre-sembrado: 'CYF-QR-DEMO123'.";
        }

        // Generar archivo ejecutable .bat para Windows
        $batPath = __DIR__ . '/Cyfort_Access_Pro_Installer.bat';
        $batContent = "@echo off\r\ntitle Lanzador Cyfort Access Pro\r\necho Iniciando Cyfort Access Pro...\r\nstart http://localhost/proyecto/public/acceso/\r\nexit\r\n";
        @file_put_contents($batPath, $batContent);

        $installed = true;
    } catch (Throwable $e) {
        $errorMsg = $e->getMessage();
    }
}
?>
<!DOCTYPE html>
<html lang="es">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Instalador & Provisionamiento — Cyfort Access Pro</title>
  <style>
    body {
      background: #090d16;
      color: #f8fafc;
      font-family: system-ui, -apple-system, sans-serif;
      display: flex;
      justify-content: center;
      align-items: center;
      min-height: 100vh;
      margin: 0;
      padding: 20px;
    }
    .install-box {
      width: 100%;
      max-width: 640px;
      background: #0f172a;
      border: 1px solid #1e293b;
      border-radius: 20px;
      padding: 36px;
      box-shadow: 0 20px 50px rgba(0,0,0,0.6);
    }
    .header {
      text-align: center;
      margin-bottom: 24px;
    }
    .header h1 {
      font-size: 1.8rem;
      margin: 0;
      color: #38bdf8;
      font-weight: 900;
    }
    .header p {
      color: #94a3b8;
      font-size: 0.9rem;
      margin-top: 6px;
    }
    .req-grid {
      display: grid;
      grid-template-columns: 1fr 1fr;
      gap: 10px;
      margin-bottom: 24px;
    }
    .req-item {
      background: rgba(255,255,255,0.03);
      border: 1px solid #1e293b;
      padding: 10px 14px;
      border-radius: 10px;
      font-size: 0.82rem;
      display: flex;
      align-items: center;
      justify-content: space-between;
    }
    .req-ok { color: #10b981; font-weight: bold; }
    .req-err { color: #ef4444; font-weight: bold; }
    .form-group { margin-bottom: 14px; }
    .form-group label { display: block; font-size: 0.8rem; color: #cbd5e1; margin-bottom: 4px; font-weight: 600; }
    .form-group input { width: 100%; background: #1e293b; border: 1px solid #334155; color: #fff; padding: 10px 14px; border-radius: 10px; font-size: 0.9rem; box-sizing: border-box; }
    .btn-install { width: 100%; background: linear-gradient(135deg, #6366f1, #38bdf8); color: #fff; border: none; padding: 14px; border-radius: 12px; font-weight: 800; font-size: 1rem; cursor: pointer; margin-top: 10px; }
    .btn-launch { display: block; text-align: center; width: 100%; background: #10b981; color: #fff; text-decoration: none; padding: 14px; border-radius: 12px; font-weight: 800; font-size: 1rem; margin-top: 16px; box-sizing: border-box; }
    .log-box { background: #020617; border: 1px solid #1e293b; padding: 14px; border-radius: 10px; font-family: monospace; font-size: 0.8rem; color: #34d399; margin-top: 16px; max-height: 180px; overflow-y: auto; text-align: left; }
    .alert-danger { background: rgba(239,68,68,0.15); border: 1px solid #ef4444; color: #f87171; padding: 12px; border-radius: 10px; margin-bottom: 16px; font-size: 0.85rem; }
  </style>
</head>
<body>

  <div class="install-box">
    <div class="header">
      <h1>🪪 Cyfort Access Pro</h1>
      <p>Sistema de Instalación & Auto-Provisionamiento MySQL (1-Clic)</p>
    </div>

    <?php if ($errorMsg): ?>
      <div class="alert-danger">⚠️ <strong>Error en Instalación:</strong> <?= htmlspecialchars($errorMsg) ?></div>
    <?php endif; ?>

    <?php if ($installed): ?>
      <div style="text-align:center; padding:10px 0;">
        <span style="font-size:50px;">✅</span>
        <h2 style="color:#10b981; margin:10px 0 6px 0;">¡INSTALACIÓN COMPLETADA!</h2>
        <p style="color:#cbd5e1; font-size:0.9rem;">El esquema de base de datos y usuario administrador (<strong>brayan</strong> / <strong>Brayan13st97</strong>) han sido provisionados con éxito.</p>
        
        <div class="log-box">
          <?php foreach ($logs as $log): ?>
            <div><?= htmlspecialchars($log) ?></div>
          <?php endforeach; ?>
        </div>

        <a href="index.php" class="btn-launch">🚀 INICIAR CYFORT ACCESS PRO</a>
      </div>
    <?php else: ?>

      <h4 style="color:#818cf8; margin-bottom:10px; font-size:0.9rem;">📋 Verificación de Entorno PHP</h4>
      <div class="req-grid">
        <div class="req-item"><span>Versión PHP (>= 8.0)</span><span class="<?= version_compare(PHP_VERSION, '8.0.0', '>=') ? 'req-ok' : 'req-err' ?>"><?= PHP_VERSION ?></span></div>
        <div class="req-item"><span>Módulo PDO MySQL</span><span class="<?= $pdoOk ? 'req-ok' : 'req-err' ?>"><?= $pdoOk ? 'OK' : 'NO' ?></span></div>
        <div class="req-item"><span>Extensión cURL</span><span class="<?= $curlOk ? 'req-ok' : 'req-err' ?>"><?= $curlOk ? 'OK' : 'NO' ?></span></div>
        <div class="req-item"><span>Cifrado OpenSSL</span><span class="<?= $opensslOk ? 'req-ok' : 'req-err' ?>"><?= $opensslOk ? 'OK' : 'NO' ?></span></div>
      </div>

      <form method="POST">
        <div style="background:rgba(56,189,248,0.1); border:1px solid rgba(56,189,248,0.3); padding:12px; border-radius:10px; margin-bottom:14px; font-size:0.8rem; color:#38bdf8;">
          ℹ️ Se utilizarán automáticamente las credenciales de base de datos del servidor segur.biz.
        </div>

        <button type="submit" name="run_install" class="btn-install">⚡ EJECUTAR INSTALACIÓN Y AUTO-PROVISIONAMIENTO EN 1-CLIC</button>
      </form>

    <?php endif; ?>
  </div>

</body>
</html>
