-- Esquema base de Mi Hogar
-- Ejecuta este script en una base vacía (ajusta el nombre de BD según tu entorno).
-- Incluye tablas de usuarios/roles, permisos, auditoría, finanzas e inventario.

CREATE TABLE roles (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(50) NOT NULL UNIQUE,        -- ADMIN, USUARIO, etc.
    descripcion VARCHAR(255) NULL,
    creado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE usuarios (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(100) NOT NULL,
    apellidos VARCHAR(150) NULL,
    email VARCHAR(150) NOT NULL UNIQUE,
    usuario VARCHAR(80) NOT NULL UNIQUE,
    password_hash VARCHAR(255) NOT NULL,
    rol_id INT NOT NULL,
    activo TINYINT(1) NOT NULL DEFAULT 1,
    ultimo_login DATETIME NULL,
    creado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_usuario_rol FOREIGN KEY (rol_id) REFERENCES roles(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE modulos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    clave VARCHAR(80) NOT NULL UNIQUE,          -- FINANZAS, ALMACEN, ADMIN_USUARIOS, etc.
    nombre VARCHAR(150) NOT NULL,
    activo TINYINT(1) NOT NULL DEFAULT 1,
    creado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE permisos_modulos_rol (
    id INT AUTO_INCREMENT PRIMARY KEY,
    rol_id INT NOT NULL,
    modulo_id INT NOT NULL,
    puede_ver TINYINT(1) NOT NULL DEFAULT 0,
    puede_crear TINYINT(1) NOT NULL DEFAULT 0,
    puede_editar TINYINT(1) NOT NULL DEFAULT 0,
    puede_borrar TINYINT(1) NOT NULL DEFAULT 0,
    puede_exportar TINYINT(1) NOT NULL DEFAULT 0,
    UNIQUE KEY uk_perm_rol_mod (rol_id, modulo_id),
    CONSTRAINT fk_perm_rol FOREIGN KEY (rol_id) REFERENCES roles(id),
    CONSTRAINT fk_perm_mod FOREIGN KEY (modulo_id) REFERENCES modulos(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Permisos opcionales a nivel de usuario (sobrescriben a los de rol si existen)
CREATE TABLE permisos_usuario_modulo (
    id INT AUTO_INCREMENT PRIMARY KEY,
    usuario_id INT NOT NULL,
    modulo_id INT NOT NULL,
    puede_ver TINYINT(1) NOT NULL DEFAULT 0,
    puede_crear TINYINT(1) NOT NULL DEFAULT 0,
    puede_editar TINYINT(1) NOT NULL DEFAULT 0,
    puede_borrar TINYINT(1) NOT NULL DEFAULT 0,
    puede_exportar TINYINT(1) NOT NULL DEFAULT 0,
    UNIQUE KEY uk_perm_user_mod (usuario_id, modulo_id),
    CONSTRAINT fk_perm_user FOREIGN KEY (usuario_id) REFERENCES usuarios(id),
    CONSTRAINT fk_perm_user_mod FOREIGN KEY (modulo_id) REFERENCES modulos(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE auditoria (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    usuario_id INT NULL,
    modulo VARCHAR(80) NOT NULL,
    accion VARCHAR(80) NOT NULL,
    descripcion TEXT NULL,
    ip VARCHAR(45) NULL,
    user_agent VARCHAR(255) NULL,
    fecha_hora TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_auditoria_modulo (modulo),
    INDEX idx_auditoria_accion (accion),
    INDEX idx_auditoria_fecha (fecha_hora),
    CONSTRAINT fk_auditoria_usuario FOREIGN KEY (usuario_id) REFERENCES usuarios(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE categorias_financieras (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(150) NOT NULL,
    tipo ENUM('GASTO','INGRESO') NOT NULL,
    padre_id INT NULL,
    orden INT NOT NULL DEFAULT 0,
    activo TINYINT(1) NOT NULL DEFAULT 1,
    creado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_catfin_padre FOREIGN KEY (padre_id) REFERENCES categorias_financieras(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE movimientos_financieros (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    fecha DATE NOT NULL,
    tipo ENUM('GASTO','INGRESO') NOT NULL,
    categoria_id INT NULL,
    importe DECIMAL(12,2) NOT NULL DEFAULT 0,
    descripcion TEXT NULL,
    usuario_id INT NOT NULL,
    creado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_movfin_fecha (fecha),
    CONSTRAINT fk_movfin_cat FOREIGN KEY (categoria_id) REFERENCES categorias_financieras(id),
    CONSTRAINT fk_movfin_user FOREIGN KEY (usuario_id) REFERENCES usuarios(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE categorias_articulos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(150) NOT NULL,
    activo TINYINT(1) NOT NULL DEFAULT 1,
    creado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE almacenes (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(150) NOT NULL,
    descripcion TEXT NULL,
    ubicacion_general VARCHAR(255) NULL,
    creado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE contenedores (
    id INT AUTO_INCREMENT PRIMARY KEY,
    almacen_id INT NOT NULL,
    nombre VARCHAR(150) NOT NULL,
    alias VARCHAR(100) NULL,
    ubicacion_general VARCHAR(255) NULL,
    ubicacion_detallada VARCHAR(255) NULL,
    contenedor_padre_id INT NULL,
    notas TEXT NULL,
    codigo_barra VARCHAR(50) NULL,
    creado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_cont_alm FOREIGN KEY (almacen_id) REFERENCES almacenes(id),
    CONSTRAINT fk_cont_padre FOREIGN KEY (contenedor_padre_id) REFERENCES contenedores(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE articulos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(200) NOT NULL,
    descripcion TEXT NULL,
    categoria_id INT NULL,
    contenedor_id INT NULL,
    codigo_barra VARCHAR(50) NULL,
    unidad_medida VARCHAR(20) NOT NULL DEFAULT 'uds',
    stock_minimo DECIMAL(12,2) NOT NULL DEFAULT 0,
    activo TINYINT(1) NOT NULL DEFAULT 1,
    creado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_art_categoria FOREIGN KEY (categoria_id) REFERENCES categorias_articulos(id),
    CONSTRAINT fk_art_contenedor FOREIGN KEY (contenedor_id) REFERENCES contenedores(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE movimientos_almacen (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    fecha DATETIME NOT NULL,
    articulo_id INT NOT NULL,
    contenedor_id INT NOT NULL,
    tipo ENUM('ENTRADA','SALIDA','AJUSTE') NOT NULL,
    cantidad DECIMAL(14,4) NOT NULL,
    usuario_id INT NOT NULL,
    descripcion TEXT NULL,
    creado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_movalm_fecha (fecha),
    CONSTRAINT fk_movalm_art FOREIGN KEY (articulo_id) REFERENCES articulos(id),
    CONSTRAINT fk_movalm_cont FOREIGN KEY (contenedor_id) REFERENCES contenedores(id),
    CONSTRAINT fk_movalm_user FOREIGN KEY (usuario_id) REFERENCES usuarios(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE backups_registros (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    usuario_id INT NULL,
    tipo ENUM('BD','WEB') NOT NULL,
    archivo VARCHAR(255) NOT NULL,
    tamano_bytes BIGINT NOT NULL DEFAULT 0,
    estado ENUM('OK','ERROR') NOT NULL,
    mensaje TEXT NULL,
    fecha_hora TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_backup_user FOREIGN KEY (usuario_id) REFERENCES usuarios(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Semillas básicas
INSERT INTO roles (nombre, descripcion) VALUES
('ADMIN', 'Administrador con permisos completos'),
('USUARIO', 'Usuario estándar');

INSERT INTO modulos (clave, nombre) VALUES
('FINANZAS', 'Finanzas'),
('FINANZAS_INFORMES', 'Informes de finanzas'),
('ALMACEN', 'Almacén e inventario'),
('ADMIN_USUARIOS', 'Administración de usuarios'),
('ADMIN_BACKUPS', 'Backups'),
('ADMIN_AUDITORIA', 'Auditoría');

-- Permisos por rol (ajusta según tus reglas)
INSERT INTO permisos_modulos_rol (rol_id, modulo_id, puede_ver, puede_crear, puede_editar, puede_borrar, puede_exportar)
SELECT r.id, m.id,
       CASE WHEN r.nombre = 'ADMIN' THEN 1 ELSE 1 END AS puede_ver,
       CASE WHEN r.nombre = 'ADMIN' THEN 1 ELSE 1 END AS puede_crear,
       CASE WHEN r.nombre = 'ADMIN' THEN 1 ELSE 1 END AS puede_editar,
       CASE WHEN r.nombre = 'ADMIN' THEN 1 ELSE 0 END AS puede_borrar,
       CASE WHEN r.nombre = 'ADMIN' THEN 1 ELSE 1 END AS puede_exportar
FROM roles r CROSS JOIN modulos m;

-- Crea un usuario admin inicial (cambia el hash por uno generado con password_hash en tu entorno)
-- INSERT INTO usuarios (nombre, apellidos, email, usuario, password_hash, rol_id, activo)
-- VALUES ('Admin', 'Principal', 'admin@example.com', 'admin', '<PON_AQUI_UN_HASH>', (SELECT id FROM roles WHERE nombre='ADMIN'), 1);
