-- ============================================
-- SISTEMA DE RIFAS/LOTERÍA - BASE DE DATOS COMPLETA
-- ============================================

-- Crear la base de datos
CREATE DATABASE IF NOT EXISTS rifas CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- Usar la base de datos
USE rifas;

-- Tabla Local
CREATE TABLE IF NOT EXISTS Local (
    id INT PRIMARY KEY AUTO_INCREMENT,
    Nombre VARCHAR(50) NOT NULL,
    Direccion VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

-- Tabla Sucursal
CREATE TABLE IF NOT EXISTS Sucursal (
    id INT PRIMARY KEY AUTO_INCREMENT,
    id_Local INT NOT NULL,
    Nombre VARCHAR(50) NOT NULL,
    Direccion VARCHAR(255),
    Perfil VARCHAR(100),
    Saldo_02 DECIMAL(10,2) DEFAULT 0.00,
    Saldo_03 DECIMAL(10,2) DEFAULT 0.00,
    Saldo_04 DECIMAL(10,2) DEFAULT 0.00,
    Saldo_05 DECIMAL(10,2) DEFAULT 0.00,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (id_Local) REFERENCES Local(id)
);

-- Tabla Usuario
CREATE TABLE IF NOT EXISTS Usuario (
    id INT PRIMARY KEY AUTO_INCREMENT,
    Nombre VARCHAR(50) NOT NULL,
    Correo VARCHAR(100) UNIQUE,
    Clave VARCHAR(255) NOT NULL,
    Foto VARCHAR(255),
    Estado ENUM('activo', 'inactivo', 'suspendido') DEFAULT 'activo',
    Rol ENUM('administrador', 'supervisor', 'vendedor') DEFAULT 'vendedor',
    id_Responsable INT,
    Configuracion JSON,
    id_Sucursal INT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (id_Responsable) REFERENCES Usuario(id),
    FOREIGN KEY (id_Sucursal) REFERENCES Sucursal(id)
);

-- Tabla Juego_Dia
CREATE TABLE IF NOT EXISTS Juego_Dia (
    id INT PRIMARY KEY AUTO_INCREMENT,
    id_local INT NOT NULL,
    Tipo ENUM('LTRIA', 'LTT') NOT NULL,
    Fecha DATE NOT NULL,
    Hora_Cierre TIME DEFAULT '19:45:00',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (id_local) REFERENCES Local(id),
    UNIQUE KEY uk_local_fecha (id_local, Fecha)
);

-- Tabla Numeros_Ganadores
CREATE TABLE IF NOT EXISTS Numeros_Ganadores (
    id INT PRIMARY KEY AUTO_INCREMENT,
    id_local INT NOT NULL,
    Tipo ENUM('LTRIA', 'LTT') NOT NULL,
    Fecha DATE NOT NULL,
    Premio1 VARCHAR(10),
    Premio2 VARCHAR(10),
    Premio3 VARCHAR(10),
    Premio4 VARCHAR(10),
    Premio5 VARCHAR(10),
    Premio6 VARCHAR(10),
    Premio7 VARCHAR(10),
    Premio8 VARCHAR(10),
    Premio9 VARCHAR(10),
    Premio10 VARCHAR(10),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (id_local) REFERENCES Local(id),
    UNIQUE KEY uk_local_tipo_fecha (id_local, Tipo, Fecha)
);

-- Tabla Factura
CREATE TABLE IF NOT EXISTS Factura (
    id INT PRIMARY KEY AUTO_INCREMENT,
    id_usuario INT NOT NULL,
    Factura VARCHAR(30) UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (id_usuario) REFERENCES Usuario(id)
);

-- Tabla Premios
CREATE TABLE IF NOT EXISTS Premios (
    id INT PRIMARY KEY AUTO_INCREMENT,
    Digitos INT NOT NULL,
    Valor DECIMAL(8,2) NOT NULL,
    Tipo VARCHAR(50) NOT NULL,
    Premio1 DECIMAL(8,2) DEFAULT 0,
    Premio2 DECIMAL(8,2) DEFAULT 0,
    Premio3 DECIMAL(8,2) DEFAULT 0,
    Premio4 DECIMAL(8,2) DEFAULT 0,
    Premio5 DECIMAL(8,2) DEFAULT 0,
    Premio6 DECIMAL(8,2) DEFAULT 0,
    Premio7 DECIMAL(8,2) DEFAULT 0,
    Premio8 DECIMAL(8,2) DEFAULT 0,
    Premio9 DECIMAL(8,2) DEFAULT 0,
    Premio10 DECIMAL(8,2) DEFAULT 0,
    id_Sucursal INT NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (id_Sucursal) REFERENCES Sucursal(id)
);

-- Tabla Venta_Diaria
CREATE TABLE IF NOT EXISTS Venta_Diaria (
    id INT PRIMARY KEY AUTO_INCREMENT,
    id_Factura INT NOT NULL,
    id_Usuario INT NOT NULL,
    Factura VARCHAR(30) NOT NULL,
    Fecha DATE NOT NULL,
    Numero VARCHAR(10) NOT NULL,
    Cantidad INT NOT NULL,
    Valor DECIMAL(8,2) NOT NULL,
    Tipo VARCHAR(50) NOT NULL,
    Premio1 DECIMAL(8,2) DEFAULT 0,
    Premio2 DECIMAL(8,2) DEFAULT 0,
    Premio3 DECIMAL(8,2) DEFAULT 0,
    Premio4 DECIMAL(8,2) DEFAULT 0,
    Premio5 DECIMAL(8,2) DEFAULT 0,
    Premio6 DECIMAL(8,2) DEFAULT 0,
    Premio7 DECIMAL(8,2) DEFAULT 0,
    Premio8 DECIMAL(8,2) DEFAULT 0,
    Premio9 DECIMAL(8,2) DEFAULT 0,
    Premio10 DECIMAL(8,2) DEFAULT 0,
    creada TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    pagada TIMESTAMP NULL,
    eliminada TIMESTAMP NULL,
    id_Sucursal INT NOT NULL,
    Total DECIMAL(10,2) AS (Cantidad * Valor) STORED,
    FOREIGN KEY (id_Factura) REFERENCES Factura(id),
    FOREIGN KEY (id_Usuario) REFERENCES Usuario(id),
    FOREIGN KEY (id_Sucursal) REFERENCES Sucursal(id),
    INDEX idx_fecha_numero (Fecha, Numero),
    INDEX idx_factura (Factura),
    INDEX idx_usuario_fecha (id_Usuario, Fecha)
);

-- Tabla Venta_Archivo
CREATE TABLE IF NOT EXISTS Venta_Archivo (
    id INT PRIMARY KEY AUTO_INCREMENT,
    id_Factura INT NOT NULL,
    id_Usuario INT NOT NULL,
    Factura VARCHAR(30) NOT NULL,
    Fecha DATE NOT NULL,
    Numero VARCHAR(10) NOT NULL,
    Cantidad INT NOT NULL,
    Valor DECIMAL(8,2) NOT NULL,
    Tipo VARCHAR(50) NOT NULL,
    Premio1 DECIMAL(8,2) DEFAULT 0,
    Premio2 DECIMAL(8,2) DEFAULT 0,
    Premio3 DECIMAL(8,2) DEFAULT 0,
    Premio4 DECIMAL(8,2) DEFAULT 0,
    Premio5 DECIMAL(8,2) DEFAULT 0,
    Premio6 DECIMAL(8,2) DEFAULT 0,
    Premio7 DECIMAL(8,2) DEFAULT 0,
    Premio8 DECIMAL(8,2) DEFAULT 0,
    Premio9 DECIMAL(8,2) DEFAULT 0,
    Premio10 DECIMAL(8,2) DEFAULT 0,
    creada TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    pagada TIMESTAMP NULL,
    eliminada TIMESTAMP NULL,
    id_Sucursal INT NOT NULL,
    Total DECIMAL(10,2) AS (Cantidad * Valor) STORED,
    FOREIGN KEY (id_Factura) REFERENCES Factura(id),
    FOREIGN KEY (id_Usuario) REFERENCES Usuario(id),
    FOREIGN KEY (id_Sucursal) REFERENCES Sucursal(id),
    INDEX idx_archivo_fecha_numero (Fecha, Numero),
    INDEX idx_archivo_factura (Factura),
    INDEX idx_archivo_usuario_fecha (id_Usuario, Fecha)
);

-- Tabla Venta_Semanal
CREATE TABLE IF NOT EXISTS Venta_Semanal (
    id INT PRIMARY KEY AUTO_INCREMENT,
    id_Factura INT NOT NULL,
    id_Usuario INT NOT NULL,
    Factura VARCHAR(30) NOT NULL,
    Fecha DATE NOT NULL,
    Numero VARCHAR(10) NOT NULL,
    Cantidad INT NOT NULL,
    Valor DECIMAL(8,2) NOT NULL,
    Tipo VARCHAR(50) NOT NULL,
    Premio1 DECIMAL(8,2) DEFAULT 0,
    Premio2 DECIMAL(8,2) DEFAULT 0,
    Premio3 DECIMAL(8,2) DEFAULT 0,
    Premio4 DECIMAL(8,2) DEFAULT 0,
    Premio5 DECIMAL(8,2) DEFAULT 0,
    Premio6 DECIMAL(8,2) DEFAULT 0,
    Premio7 DECIMAL(8,2) DEFAULT 0,
    Premio8 DECIMAL(8,2) DEFAULT 0,
    Premio9 DECIMAL(8,2) DEFAULT 0,
    Premio10 DECIMAL(8,2) DEFAULT 0,
    creada TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    pagada TIMESTAMP NULL,
    eliminada TIMESTAMP NULL,
    id_Sucursal INT NOT NULL,
    Total DECIMAL(10,2) AS (Cantidad * Valor) STORED,
    FOREIGN KEY (id_Factura) REFERENCES Factura(id),
    FOREIGN KEY (id_Usuario) REFERENCES Usuario(id),
    FOREIGN KEY (id_Sucursal) REFERENCES Sucursal(id),
    INDEX idx_semanal_fecha_numero (Fecha, Numero),
    INDEX idx_semanal_factura (Factura),
    INDEX idx_semanal_usuario_fecha (id_Usuario, Fecha)
);

-- Tabla Invitaciones
CREATE TABLE IF NOT EXISTS Invitaciones (
    id INT AUTO_INCREMENT PRIMARY KEY,
    codigo_invitacion VARCHAR(32) NOT NULL UNIQUE,
    rol_asignado ENUM('administrador', 'supervisor', 'vendedor') NOT NULL DEFAULT 'vendedor',
    id_sucursal_asignada INT NOT NULL,
    id_responsable INT NULL,
    estado_inicial VARCHAR(20) DEFAULT 'activo',
    configuracion_inicial JSON NULL,
    fecha_expiracion DATETIME NOT NULL,
    usos_permitidos INT DEFAULT 1,
    usos_realizados INT DEFAULT 0,
    estado_invitacion ENUM('activa', 'usada', 'expirada', 'cancelada') DEFAULT 'activa',
    fecha_uso DATETIME NULL,
    ip_registro VARCHAR(45) NULL,
    user_agent TEXT NULL,
    id_usuario_creado INT NULL,
    creado_por INT NOT NULL,
    descripcion VARCHAR(255) NULL,
    fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    fecha_actualizacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_codigo (codigo_invitacion),
    INDEX idx_estado (estado_invitacion),
    INDEX idx_fecha_exp (fecha_expiracion),
    INDEX idx_sucursal (id_sucursal_asignada),
    INDEX idx_creado_por (creado_por),
    FOREIGN KEY (id_sucursal_asignada) REFERENCES Sucursal(id) ON DELETE CASCADE,
    FOREIGN KEY (id_responsable) REFERENCES Usuario(id) ON DELETE SET NULL,
    FOREIGN KEY (creado_por) REFERENCES Usuario(id) ON DELETE CASCADE,
    FOREIGN KEY (id_usuario_creado) REFERENCES Usuario(id) ON DELETE SET NULL
);

-- Tabla log_eventos
CREATE TABLE IF NOT EXISTS log_eventos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    evento VARCHAR(50) NOT NULL,
    fecha DATETIME NOT NULL,
    descripcion TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_evento_fecha (evento, fecha)
);

-- ============================================
-- DATOS DE EJEMPLO
-- ============================================

-- Insertar locales de ejemplo
INSERT IGNORE INTO Local (Nombre, Direccion) VALUES 
('Local Central', 'Av. Principal 123, Centro'),
('Local Norte', 'Calle Norte 456, Zona Norte'),
('Local Sur', 'Av. Sur 789, Zona Sur');

-- Insertar sucursales de ejemplo
INSERT IGNORE INTO Sucursal (id_Local, Nombre, Direccion, Perfil, Saldo_02, Saldo_03, Saldo_04, Saldo_05) VALUES 
(1, 'Sucursal Central - Matriz', 'Av. Principal 123', 'Sucursal principal', 10000.00, 15000.00, 20000.00, 25000.00),
(1, 'Sucursal Central - Secundaria', 'Av. Principal 200', 'Sucursal secundaria', 5000.00, 7500.00, 10000.00, 12500.00),
(2, 'Sucursal Norte - Plaza', 'Calle Norte 456', 'Centro comercial', 8000.00, 12000.00, 16000.00, 20000.00),
(3, 'Sucursal Sur - Mercado', 'Av. Sur 789', 'Zona de mercado', 6000.00, 9000.00, 12000.00, 15000.00);

-- Insertar usuarios de ejemplo (contraseña: "123456" encriptada con bcrypt)
INSERT IGNORE INTO Usuario (Nombre, Correo, Clave, Estado, Rol, id_Sucursal) VALUES 
('Administrador Sistema', 'admin@rifas.com', '$2b$10$K7L/VJ.RqNXOL5x5rjOaU.wY8QKJQRwKnGjOGJ8QKbKJQRwKnGjOG', 'activo', 'administrador', 1),
('Supervisor Norte', 'supervisor@rifas.com', '$2b$10$K7L/VJ.RqNXOL5x5rjOaU.wY8QKJQRwKnGjOGJ8QKbKJQRwKnGjOG', 'activo', 'supervisor', 3),
('Vendedor Central', 'vendedor1@rifas.com', '$2b$10$K7L/VJ.RqNXOL5x5rjOaU.wY8QKJQRwKnGjOGJ8QKbKJQRwKnGjOG', 'activo', 'vendedor', 1),
('Vendedor Norte', 'vendedor2@rifas.com', '$2b$10$K7L/VJ.RqNXOL5x5rjOaU.wY8QKJQRwKnGjOGJ8QKbKJQRwKnGjOG', 'activo', 'vendedor', 3),
('Vendedor Sur', 'vendedor3@rifas.com', '$2b$10$K7L/VJ.RqNXOL5x5rjOaU.wY8QKJQRwKnGjOGJ8QKbKJQRwKnGjOG', 'activo', 'vendedor', 4);

-- ============================================
-- ÍNDICES ADICIONALES
-- ============================================

CREATE INDEX IF NOT EXISTS idx_usuario_estado ON Usuario(Estado);
CREATE INDEX IF NOT EXISTS idx_venta_fecha_tipo ON Venta_Diaria(Fecha, Tipo);
CREATE INDEX IF NOT EXISTS idx_venta_archivo_fecha_tipo ON Venta_Archivo(Fecha, Tipo);
CREATE INDEX IF NOT EXISTS idx_venta_semanal_fecha_tipo ON Venta_Semanal(Fecha, Tipo);
CREATE INDEX IF NOT EXISTS idx_juego_fecha_tipo ON Juego_Dia(Fecha, Tipo);
CREATE INDEX IF NOT EXISTS idx_premios_digitos_tipo ON Premios(Digitos, Tipo);

-- Mostrar las tablas creadas
SHOW TABLES;
