-- Schema para sistema de usuarios y permisos
-- Ejecutar en PostgreSQL (base de datos CONTROLDESK)

-- Tabla de usuarios
CREATE TABLE IF NOT EXISTS usuarios (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    password_hash VARCHAR(255) NOT NULL,
    nombre_completo VARCHAR(100),
    activo BOOLEAN DEFAULT true,
    es_admin BOOLEAN DEFAULT false,
    fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    ultimo_acceso TIMESTAMP,
    CONSTRAINT chk_username_length CHECK (char_length(username) >= 3)
);

-- Tabla de permisos de usuario a bases de datos
CREATE TABLE IF NOT EXISTS usuario_base_datos (
    id SERIAL PRIMARY KEY,
    usuario_id INTEGER NOT NULL REFERENCES usuarios(id) ON DELETE CASCADE,
    base_datos_nombre VARCHAR(255) NOT NULL, -- Nombre de la base de datos (visible_name)
    puede_ver BOOLEAN DEFAULT true,
    puede_descargar_backup BOOLEAN DEFAULT false,
    puede_restaurar BOOLEAN DEFAULT false,
    fecha_asignacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    UNIQUE(usuario_id, base_datos_nombre)
);

-- Tabla de sesiones
CREATE TABLE IF NOT EXISTS sesiones (
    id SERIAL PRIMARY KEY,
    usuario_id INTEGER NOT NULL REFERENCES usuarios(id) ON DELETE CASCADE,
    token VARCHAR(255) UNIQUE NOT NULL,
    ip_address VARCHAR(50),
    user_agent TEXT,
    fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    fecha_expiracion TIMESTAMP NOT NULL,
    activa BOOLEAN DEFAULT true
);

-- Índices para mejor rendimiento
CREATE INDEX IF NOT EXISTS idx_usuario_base_datos_usuario ON usuario_base_datos(usuario_id);
CREATE INDEX IF NOT EXISTS idx_usuario_base_datos_nombre ON usuario_base_datos(base_datos_nombre);
CREATE INDEX IF NOT EXISTS idx_usuarios_activo ON usuarios(activo);
CREATE INDEX IF NOT EXISTS idx_sesiones_token ON sesiones(token);
CREATE INDEX IF NOT EXISTS idx_sesiones_usuario ON sesiones(usuario_id);

-- Insertar usuario admin por defecto
-- Password: Admin123!
-- Nota: Este hash es temporal, debes cambiarlo después del primer inicio de sesión
INSERT INTO usuarios (username, email, password_hash, nombre_completo, es_admin, activo)
VALUES (
    'admin',
    'admin@aduanasoft.com',
    '$2b$10$rKvvkYpNwF5J5K5J5J5J5uX5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X',
    'Administrador del Sistema',
    true,
    true
)
ON CONFLICT (username) DO NOTHING;

-- Comentarios en tablas
COMMENT ON TABLE usuarios IS 'Usuarios del sistema de gestión de bases de datos';
COMMENT ON TABLE usuario_base_datos IS 'Permisos de acceso de usuarios a bases de datos específicas';
COMMENT ON TABLE sesiones IS 'Sesiones activas de usuarios';
