-- Seleccionar la base de datos
USE rifas;

-- Tabla principal de usuarios con sistema jerárquico de roles
CREATE TABLE IF NOT EXISTS usuarios (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(100) NOT NULL,
    apellido VARCHAR(100) NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    password VARCHAR(255) NOT NULL,
    cedula VARCHAR(20) UNIQUE NOT NULL,
    telefono VARCHAR(20),
    fecha_nacimiento DATE,
    
    -- Sistema de roles jerárquico
    rol TINYINT NOT NULL DEFAULT 1 COMMENT '5=JEFE, 4=SUPERVISOR, 3=ADMINISTRADOR, 2=VENDEDOR, 1=USUARIO',
    estado TINYINT NOT NULL DEFAULT 1 COMMENT '1=ACTIVO, 0=INACTIVO, 2=SUSPENDIDO, 3=ELIMINADO',
    
    -- Relación jerárquica - supervisor_id apunta al usuario supervisor
    supervisor_id INT NULL,
    
    -- Datos financieros
    saldo DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    comision_vendedor DECIMAL(5,2) NOT NULL DEFAULT 0.00 COMMENT 'Porcentaje de comisión para vendedores',
    limite_credito DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    
    -- Fechas de control
    fecha_registro TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    ultimo_acceso TIMESTAMP NULL,
    fecha_actualizacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    -- Índices y relaciones
    INDEX idx_email (email),
    INDEX idx_cedula (cedula),
    INDEX idx_rol (rol),
    INDEX idx_estado (estado),
    INDEX idx_supervisor (supervisor_id),
    
    -- Relación padre-hijo para jerarquía
    FOREIGN KEY (supervisor_id) REFERENCES usuarios(id) ON DELETE SET NULL ON UPDATE CASCADE
);

-- Tabla para historial de movimientos de saldo
CREATE TABLE IF NOT EXISTS historial_saldo (
    id INT AUTO_INCREMENT PRIMARY KEY,
    usuario_id INT NOT NULL,
    vendedor_id INT NOT NULL,
    monto DECIMAL(12,2) NOT NULL,
    tipo ENUM('AGREGAR', 'QUITAR') NOT NULL,
    saldo_anterior DECIMAL(12,2) NOT NULL,
    saldo_nuevo DECIMAL(12,2) NOT NULL,
    concepto VARCHAR(255),
    fecha TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    INDEX idx_usuario (usuario_id),
    INDEX idx_vendedor (vendedor_id),
    INDEX idx_fecha (fecha),
    
    FOREIGN KEY (usuario_id) REFERENCES usuarios(id) ON DELETE CASCADE,
    FOREIGN KEY (vendedor_id) REFERENCES usuarios(id) ON DELETE CASCADE
);

-- Tabla para sesiones de usuario (opcional para mejor seguridad)
CREATE TABLE IF NOT EXISTS sesiones_usuario (
    id INT AUTO_INCREMENT PRIMARY KEY,
    usuario_id INT NOT NULL,
    token VARCHAR(255) NOT NULL,
    ip_address VARCHAR(45),
    user_agent TEXT,
    fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    fecha_expiracion TIMESTAMP NOT NULL,
    activa BOOLEAN DEFAULT TRUE,
    
    INDEX idx_usuario (usuario_id),
    INDEX idx_token (token),
    INDEX idx_activa (activa),
    
    FOREIGN KEY (usuario_id) REFERENCES usuarios(id) ON DELETE CASCADE
);

-- Insertar usuario jefe por defecto (cambiar contraseña en producción)
INSERT INTO usuarios (
    nombre, apellido, email, password, cedula, rol, estado
) VALUES (
    'Jefe', 'Principal', 'jefe@sistema.com', 
    '$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/lewR8wR4FK.T.KGuq', -- password: 123456
    '0000000000', 5, 1
) ON DUPLICATE KEY UPDATE id=id;

-- Insertar usuarios de ejemplo para testing
INSERT INTO usuarios (
    nombre, apellido, email, password, cedula, rol, estado, supervisor_id
) VALUES 
    ('Supervisor', 'Uno', 'supervisor@sistema.com', 
     '$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/lewR8wR4FK.T.KGuq', -- password: 123456
     '1111111111', 4, 1, 1),
    ('Admin', 'Uno', 'admin@sistema.com', 
     '$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/lewR8wR4FK.T.KGuq', -- password: 123456
     '2222222222', 3, 1, 2),
    ('Vendedor', 'Uno', 'vendedor@sistema.com', 
     '$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/lewR8wR4FK.T.KGuq', -- password: 123456
     '3333333333', 2, 1, 3),
    ('Usuario', 'Final', 'usuario@sistema.com', 
     '$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/lewR8wR4FK.T.KGuq', -- password: 123456
     '4444444444', 1, 1, 4)
ON DUPLICATE KEY UPDATE id=id;
