-- ==================================================================================
-- MIGRACIÓN 026: SISTEMA DE MESAS DINÁMICAS PARA FULL DOMINOES
-- ==================================================================================

-- Agregar columna a tabla usuarios (mesa actualmente seleccionada)
ALTER TABLE usuarios ADD COLUMN mesa_actual_id INT DEFAULT 1;

-- Tabla principal de mesas disponibles
CREATE TABLE IF NOT EXISTS mesas_personalizadas (
  id INT PRIMARY KEY AUTO_INCREMENT,
  nombre VARCHAR(100) NOT NULL,
  color_fondo VARCHAR(7) NOT NULL,      -- Ej: #1a0033
  color_borde VARCHAR(50) NOT NULL,     -- Ej: rgba(6,182,212,0.8)
  precio_diamantes INT NOT NULL,        -- 0 = gratis (mesa inicial)
  descripcion VARCHAR(200),
  disponible TINYINT DEFAULT 1,
  fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Tabla de compras por usuario (auditoría + control de propiedad)
CREATE TABLE IF NOT EXISTS usuario_mesas_compradas (
  id INT PRIMARY KEY AUTO_INCREMENT,
  usuario_id INT NOT NULL,
  mesa_id INT NOT NULL,
  fecha_compra TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (usuario_id) REFERENCES usuarios(id) ON DELETE CASCADE,
  FOREIGN KEY (mesa_id) REFERENCES mesas_personalizadas(id) ON DELETE RESTRICT,
  UNIQUE KEY unique_compra (usuario_id, mesa_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Auditoría de cambios de mesa (opcional pero útil para analytics)
CREATE TABLE IF NOT EXISTS mesa_cambios_auditoria (
  id INT PRIMARY KEY AUTO_INCREMENT,
  usuario_id INT NOT NULL,
  mesa_anterior_id INT,
  mesa_nueva_id INT NOT NULL,
  fecha_cambio TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (usuario_id) REFERENCES usuarios(id) ON DELETE CASCADE,
  FOREIGN KEY (mesa_anterior_id) REFERENCES mesas_personalizadas(id) ON DELETE SET NULL,
  FOREIGN KEY (mesa_nueva_id) REFERENCES mesas_personalizadas(id) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ==================================================================================
-- DATOS INICIALES: 4 MESAS TEMÁTICAS
-- ==================================================================================

INSERT INTO mesas_personalizadas (nombre, color_fondo, color_borde, precio_diamantes, descripcion, disponible)
VALUES
  -- Mesa 1: Azul Marino (GRATIS - Mesa inicial)
  ('Clásica Azul', '#0F1B2E', 'rgba(6,182,212,0.8)', 0, 
   'Mesa profesional de casino - Azul marino clásico', 1),
  
  -- Mesa 2: Púrpura Elegante (150◆)
  ('Púrpura Oscura', '#1a0033', 'rgba(6,182,212,0.8)', 150, 
   'Mesa elegante y sofisticada - Púrpura profundo', 1),
  
  -- Mesa 3: Gris Minimalista (150◆)
  ('Gris Minimalista', '#1a1a1f', 'rgba(6,182,212,0.8)', 150, 
   'Diseño moderno y limpio - Gris oscuro neutralo', 1),
  
  -- Mesa 4: Rojo Clásico (150◆)
  ('Rojo Clásico', '#2b1515', 'rgba(6,182,212,0.8)', 150, 
   'Mesa de casino tradicional - Rojo oscuro/Burgundy', 1);

-- ==================================================================================
-- ÍNDICES PARA RENDIMIENTO
-- ==================================================================================

CREATE INDEX idx_usuarios_mesa_actual ON usuarios(mesa_actual_id);
CREATE INDEX idx_usuario_mesas_usuario ON usuario_mesas_compradas(usuario_id);
CREATE INDEX idx_usuario_mesas_mesa ON usuario_mesas_compradas(mesa_id);
CREATE INDEX idx_auditoria_usuario ON mesa_cambios_auditoria(usuario_id);
CREATE INDEX idx_auditoria_fecha ON mesa_cambios_auditoria(fecha_cambio DESC);

-- ==================================================================================
-- TRIGGER: Auto-registrar mesa inicial (Azul) cuando usuario se crea
-- ==================================================================================

DELIMITER //
CREATE TRIGGER trigger_nuevo_usuario_mesa_inicial
AFTER INSERT ON usuarios
FOR EACH ROW
BEGIN
  -- Registrar que el usuario "compró" (gratis) la mesa inicial azul
  INSERT IGNORE INTO usuario_mesas_compradas (usuario_id, mesa_id)
  VALUES (NEW.id, 1);

  -- OJO: aquí NO se puede hacer "UPDATE usuarios SET mesa_actual_id = 1".
  -- MySQL prohíbe que un trigger modifique la MISMA tabla que lo disparó
  -- (error 1442), y eso rompía TODA creación de usuario: invitado, email,
  -- Google y Facebook. Tampoco hace falta: la columna mesa_actual_id se
  -- declara arriba con DEFAULT 1, así que el usuario ya nace con la mesa
  -- inicial asignada.
END //
DELIMITER ;

-- ==================================================================================
-- VISTAS ÚTILES PARA CONSULTAS
-- ==================================================================================

-- Vista: Información de mesa actual del usuario
CREATE OR REPLACE VIEW v_usuario_mesa_actual AS
SELECT 
  u.id as usuario_id,
  u.nombre,
  m.id as mesa_id,
  m.nombre as mesa_nombre,
  m.color_fondo,
  m.color_borde,
  m.descripcion
FROM usuarios u
LEFT JOIN mesas_personalizadas m ON u.mesa_actual_id = m.id;

-- Vista: Mesas compradas por usuario
CREATE OR REPLACE VIEW v_usuario_mesas_compradas AS
SELECT 
  umc.usuario_id,
  m.id as mesa_id,
  m.nombre,
  m.color_fondo,
  m.descripcion,
  umc.fecha_compra,
  (u.mesa_actual_id = m.id) as es_mesa_actual
FROM usuario_mesas_compradas umc
JOIN mesas_personalizadas m ON umc.mesa_id = m.id
JOIN usuarios u ON umc.usuario_id = u.id;

-- Vista: Mesas disponibles para comprar por usuario
CREATE OR REPLACE VIEW v_mesas_por_comprar AS
SELECT 
  m.id,
  m.nombre,
  m.color_fondo,
  m.descripcion,
  m.precio_diamantes,
  (SELECT COUNT(*) FROM usuario_mesas_compradas umc 
   WHERE umc.mesa_id = m.id) as total_propietarios
FROM mesas_personalizadas m
WHERE m.disponible = 1 
  AND m.id NOT IN (
    SELECT mesa_id FROM usuario_mesas_compradas WHERE usuario_id = ?
  );

-- ==================================================================================
-- END MIGRATION 026
-- ==================================================================================
