-- =============================================================
-- Esquema completo de base de datos - Mi Perfil
-- Sistema de Login Centralizado v2.0
-- =============================================================
--
-- Este archivo sirve para una instalacion limpia.
-- Crea la tabla de usuarios vacia y todas las tablas auxiliares.
-- No inserta usuarios de ejemplo.
--
-- Nota de compatibilidad:
-- La columna real del sistema es `Superuser` con S mayuscula.

CREATE TABLE IF NOT EXISTS `miperfil_usuarios` (
    `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `usuario` VARCHAR(50) NOT NULL UNIQUE,
    `nombre` VARCHAR(100) NOT NULL DEFAULT '',
    `email` VARCHAR(100) NOT NULL DEFAULT '',
    `password_hash` VARCHAR(255) NOT NULL,
    `es_admin` TINYINT(1) NOT NULL DEFAULT 0,
    `Superuser` TINYINT(1) NOT NULL DEFAULT 0,
    `bloqueado` TINYINT(1) NOT NULL DEFAULT 0,
    `cambio_pass_obligado` TINYINT(1) NOT NULL DEFAULT 0,
    `activo` TINYINT(1) NOT NULL DEFAULT 1,
    `creado_en` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `actualizado_en` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- La tabla `miperfil_usuarios` queda vacia intencionalmente.
-- Crear usuarios reales desde el panel admin o insertarlos manualmente
-- usando password_hash($password, PASSWORD_DEFAULT) en PHP.

CREATE TABLE IF NOT EXISTS `miperfil_miniapps` (
    `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `app_key` VARCHAR(50) NOT NULL UNIQUE,
    `nombre` VARCHAR(100) NOT NULL,
    `descripcion` VARCHAR(255) NOT NULL DEFAULT '',
    `url` VARCHAR(255) NOT NULL DEFAULT '',
    `icono` VARCHAR(50) NOT NULL DEFAULT '',
    `activo` TINYINT(1) NOT NULL DEFAULT 1,
    `creado_en` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS `miperfil_permisos` (
    `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `usuario_id` INT UNSIGNED NOT NULL,
    `miniapp_id` INT UNSIGNED NOT NULL,
    `creado_en` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    UNIQUE KEY `uq_usuario_miniapp` (`usuario_id`, `miniapp_id`),
    CONSTRAINT `fk_permiso_usuario` FOREIGN KEY (`usuario_id`)
        REFERENCES `miperfil_usuarios`(`id`) ON DELETE CASCADE,
    CONSTRAINT `fk_permiso_miniapp` FOREIGN KEY (`miniapp_id`)
        REFERENCES `miperfil_miniapps`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS `miperfil_intentos_login` (
    `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `ip` VARCHAR(45) NOT NULL,
    `usuario` VARCHAR(50) NOT NULL,
    `exitoso` TINYINT(1) NOT NULL DEFAULT 0,
    `creado_en` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    INDEX `idx_ip_usuario` (`ip`, `usuario`),
    INDEX `idx_creado_en` (`creado_en`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- =============================================================
-- Datos iniciales minimos
-- =============================================================

INSERT IGNORE INTO `miperfil_miniapps`
    (`app_key`, `nombre`, `descripcion`, `url`, `icono`, `activo`)
VALUES
    ('miperfil', 'Mi Perfil', 'Panel central de administracion', '/miperfil/', '', 1);

-- Cuando ya existan usuarios, dar acceso al panel central:
--
-- INSERT IGNORE INTO `miperfil_permisos` (`usuario_id`, `miniapp_id`)
-- SELECT u.id, ma.id
-- FROM `miperfil_usuarios` u
-- JOIN `miperfil_miniapps` ma ON ma.app_key = 'miperfil';

-- =============================================================
-- Migracion desde tabla 1.0 existente
-- =============================================================
-- Usar estos ALTER solo si se esta migrando una tabla existente.
-- Revisar primero que las columnas no existan antes de ejecutar.
--
-- ALTER TABLE miperfil_usuarios ADD COLUMN nombre VARCHAR(100) NOT NULL DEFAULT '' AFTER usuario;
-- ALTER TABLE miperfil_usuarios ADD COLUMN email VARCHAR(100) NOT NULL DEFAULT '' AFTER nombre;
-- ALTER TABLE miperfil_usuarios ADD COLUMN es_admin TINYINT(1) NOT NULL DEFAULT 0 AFTER password_hash;
-- ALTER TABLE miperfil_usuarios ADD COLUMN Superuser TINYINT(1) NOT NULL DEFAULT 0 AFTER es_admin;
-- ALTER TABLE miperfil_usuarios ADD COLUMN bloqueado TINYINT(1) NOT NULL DEFAULT 0 AFTER Superuser;
-- ALTER TABLE miperfil_usuarios ADD COLUMN cambio_pass_obligado TINYINT(1) NOT NULL DEFAULT 0 AFTER bloqueado;
-- ALTER TABLE miperfil_usuarios ADD COLUMN actualizado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP AFTER creado_en;
-- UPDATE miperfil_usuarios SET Superuser = 1 WHERE es_admin = 1;
