<?php
/**
 * public/acceso/config/db.php
 * Conexión PDO centralizada y auto-provisionamiento de tablas para Cyfort Access Pro.
 */
declare(strict_types=1);

require_once __DIR__ . '/../../../config/db.php';

function acceso_db(): PDO {
    static $pdo = null;
    if ($pdo !== null) return $pdo;

    $pdo = db();

    // Auto-provisionar tablas del módulo Control de Acceso
    try {
        $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(80) NOT NULL UNIQUE,
                `nombre` VARCHAR(150) NOT NULL,
                `email` VARCHAR(150) NOT NULL,
                `password_hash` VARCHAR(255) NOT NULL,
                `rol` ENUM('admin', 'operador', 'vigilante') NOT NULL DEFAULT 'operador',
                `estado` ENUM('activo', 'inactivo') NOT NULL DEFAULT 'activo',
                `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

            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', 'contratista') NOT NULL DEFAULT 'visitante',
                `documento_numero` VARCHAR(50) NOT NULL,
                `nombre_completo` VARCHAR(180) NOT NULL,
                `primer_apellido` VARCHAR(80) DEFAULT NULL,
                `segundo_apellido` VARCHAR(80) DEFAULT NULL,
                `sexo` VARCHAR(10) DEFAULT NULL,
                `fecha_nacimiento` VARCHAR(20) 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) DEFAULT 'Entrada Principal',
                `observaciones` TEXT DEFAULT NULL,
                `estado_lista` ENUM('permitido', 'lista_negra', 'sospechoso') NOT NULL DEFAULT 'permitido',
                `metodo_ingreso` ENUM('cedula_pdf417', 'lpr_placa', 'codigo_qr', 'manual') NOT NULL DEFAULT 'cedula_pdf417',
                `usuario_registro_id` INT UNSIGNED NOT NULL,
                `vigilante_nombre` VARCHAR(150) NOT NULL DEFAULT 'Vigilante de Servicio',
                `fecha_ingreso` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
                `fecha_salida` TIMESTAMP NULL DEFAULT NULL,
                INDEX (`documento_numero`),
                INDEX (`placa_vehiculo`),
                INDEX (`fecha_ingreso`)
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

            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(100) NOT NULL UNIQUE,
                `nombre_invitado` VARCHAR(180) NOT NULL,
                `documento_invitado` VARCHAR(50) NOT NULL,
                `email_invitado` VARCHAR(150) NOT NULL,
                `placa_vehiculo` VARCHAR(20) DEFAULT NULL,
                `destino` VARCHAR(150) NOT NULL DEFAULT 'Sede 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;

            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;

            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;
        ");

        // Pre-sembrar usuario Administrador predeterminado: brayan / Brayan13st97
        $stmtCheck = $pdo->prepare("SELECT id FROM acceso_usuarios WHERE username = 'brayan'");
        $stmtCheck->execute();
        if (!$stmtCheck->fetch()) {
            $passHash = password_hash('Brayan13st97', PASSWORD_BCRYPT);
            $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]);
        }

        // Pre-sembrar Pase QR de Prueba 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();
        }

        // Pre-sembrar Placas Autorizadas en Lista Blanca (Ejemplo Residentes)
        $stmtLbCheck = $pdo->prepare("SELECT id FROM acceso_lista_blanca_placas WHERE placa = 'ABC123'");
        $stmtLbCheck->execute();
        if (!$stmtLbCheck->fetch()) {
            $stmtLbInit = $pdo->prepare("INSERT INTO acceso_lista_blanca_placas (empresa_id, placa, propietario_nombre, documento_propietario, tipo_vehiculo, tipo_usuario, apartamento_puesto) VALUES (1, 'ABC123', 'Brayan Stiven Paniagua Monsalve', '1017248673', 'carro', 'residente', 'Parqueadero Residentes Apt 402')");
            $stmtLbInit->execute();
        }
    } catch (Throwable $e) {
        error_log("Error provisionando DB Cyfort Access Pro: " . $e->getMessage());
    }

    return $pdo;
}
