-- =============================================================
-- Dominó 2vs2 — Esquema MySQL
-- Charset utf8mb4 por consistencia con el resto de tus proyectos.
-- =============================================================

CREATE TABLE IF NOT EXISTS articulos_tienda (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  tipo ENUM('ficha_skin','avatar','marco') NOT NULL,
  codigo VARCHAR(40) NOT NULL UNIQUE, -- identifica el estilo CSS/SVG a aplicar en el frontend
  nombre VARCHAR(80) NOT NULL,
  descripcion VARCHAR(200) NULL,
  precio_monedas INT NOT NULL DEFAULT 0,
  disponible TINYINT(1) NOT NULL DEFAULT 1,
  orden TINYINT NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS usuario_articulos (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  usuario_id INT UNSIGNED NOT NULL,
  articulo_id INT UNSIGNED NOT NULL,
  comprado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (usuario_id) REFERENCES usuarios(id) ON DELETE CASCADE,
  FOREIGN KEY (articulo_id) REFERENCES articulos_tienda(id) ON DELETE CASCADE,
  UNIQUE KEY uniq_usuario_articulo (usuario_id, articulo_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS usuarios (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  nombre VARCHAR(80) NOT NULL,
  email VARCHAR(150) NULL,
  avatar_url VARCHAR(500) NULL,
  proveedor ENUM('google','facebook','invitado','bot') NOT NULL,
  proveedor_uid VARCHAR(191) NOT NULL,
  es_bot TINYINT(1) NOT NULL DEFAULT 0,
  elo INT NOT NULL DEFAULT 1000,
  monedas INT NOT NULL DEFAULT 100,
  experiencia INT UNSIGNED NOT NULL DEFAULT 0,
  ficha_equipada VARCHAR(40) NOT NULL DEFAULT 'clasica',
  avatar_equipado VARCHAR(40) NULL,
  marco_equipado VARCHAR(40) NULL,
  partidas_jugadas INT NOT NULL DEFAULT 0,
  partidas_ganadas INT NOT NULL DEFAULT 0,
  tiempo_promedio_jugada_ms INT NOT NULL DEFAULT 0,
  reportes_recibidos INT NOT NULL DEFAULT 0,
  revision_manual_pendiente TINYINT(1) NOT NULL DEFAULT 0,
  creado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  ultima_conexion DATETIME NULL,
  UNIQUE KEY uniq_proveedor (proveedor, proveedor_uid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Historial de dispositivos/IP por login, usado por el análisis anti-colusión.
CREATE TABLE IF NOT EXISTS recargas (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  usuario_id INT UNSIGNED NOT NULL,
  monedas INT NOT NULL,
  monto_cop INT NULL, -- NULL en recargas manuales sin cobro real
  referencia VARCHAR(100) NOT NULL UNIQUE,
  proveedor ENUM('manual','wompi') NOT NULL,
  estado ENUM('pendiente','aprobada','rechazada') NOT NULL DEFAULT 'pendiente',
  admin_id INT UNSIGNED NULL, -- quién la acreditó, si fue manual
  creado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  confirmado_en DATETIME NULL,
  FOREIGN KEY (usuario_id) REFERENCES usuarios(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS usuarios_dispositivos (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  usuario_id INT UNSIGNED NOT NULL,
  device_id VARCHAR(191) NULL,
  ip VARCHAR(45) NULL,
  creado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (usuario_id) REFERENCES usuarios(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Tokens de sesión propios (ver includes/Auth.php). Simple, sin dependencias
-- externas de JWT; se puede migrar a JWT firmado más adelante sin tocar el
-- resto del código si el proyecto crece.
CREATE TABLE IF NOT EXISTS sesiones (
  token VARCHAR(191) NOT NULL PRIMARY KEY,
  usuario_id INT UNSIGNED NOT NULL,
  expira_en DATETIME NOT NULL,
  creado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (usuario_id) REFERENCES usuarios(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS cola_matchmaking (
  usuario_id INT UNSIGNED NOT NULL PRIMARY KEY,
  creado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (usuario_id) REFERENCES usuarios(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS salas_privadas_espera (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  codigo CHAR(6) NOT NULL UNIQUE,
  creador_id INT UNSIGNED NOT NULL,
  jugadores_json TEXT NOT NULL, -- JSON array de usuario_id, ej: [12,45]
  partida_id INT UNSIGNED NULL, -- se llena cuando se completan los 4 y arranca la partida real
  creada_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (creador_id) REFERENCES usuarios(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS partidas (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  tipo ENUM('publica','privada','prueba') NOT NULL,
  codigo_privado CHAR(6) NULL,
  estado ENUM('esperando','en_curso','tranca','finalizada') NOT NULL DEFAULT 'esperando',
  extremo_izquierdo TINYINT NOT NULL DEFAULT -1,
  extremo_derecho TINYINT NOT NULL DEFAULT -1,
  turno_jugador_id INT UNSIGNED NULL,
  turno_iniciado_en BIGINT NOT NULL DEFAULT 0, -- epoch ms, autoridad del timer de 8s
  duracion_turno_segundos SMALLINT NOT NULL DEFAULT 8,
  -- Posición que abrió la MANO actual (la partida completa se juega a varias
  -- manos hasta llegar a los puntos_para_ganar). Solo la mano #1 se abre con
  -- doble-6; de ahí en adelante abre siempre el de la derecha del anterior,
  -- sin importar quién ganó la mano.
  posicion_abrio_mano ENUM('norte','este','sur','oeste') NULL,
  es_primera_mano TINYINT(1) NOT NULL DEFAULT 1,
  puntos_equipo_a INT NOT NULL DEFAULT 0,
  puntos_equipo_b INT NOT NULL DEFAULT 0,
  puntos_para_ganar INT NOT NULL DEFAULT 100,
  tema_tablero ENUM('madera','marmol','neon') NOT NULL DEFAULT 'madera',
  creada_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  KEY idx_codigo (codigo_privado)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS partida_jugadores (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  partida_id INT UNSIGNED NOT NULL,
  usuario_id INT UNSIGNED NOT NULL,
  posicion ENUM('norte','este','sur','oeste') NOT NULL,
  equipo ENUM('A','B') NOT NULL,
  cantidad_fichas TINYINT NOT NULL DEFAULT 7,
  es_bot TINYINT(1) NOT NULL DEFAULT 0,
  -- Heartbeat: se actualiza en CADA poll que hace este jugador. Es la base
  -- del sistema de detección de abandono sin necesitar websockets/cron.
  ultima_actividad BIGINT NOT NULL DEFAULT 0, -- epoch ms
  salida_notificada_en BIGINT NULL,           -- si mandó "me voy a background"
  UNIQUE KEY uniq_partida_usuario (partida_id, usuario_id),
  FOREIGN KEY (partida_id) REFERENCES partidas(id) ON DELETE CASCADE,
  FOREIGN KEY (usuario_id) REFERENCES usuarios(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Las 28 fichas de cada partida. `jugada = 1` cuando ya se colocó en mesa.
-- CLAVE ANTI-TRAMPA: la API nunca hace SELECT * de esta tabla sin filtrar
-- por usuario_id = sesión actual salvo en el propio motor de reglas del
-- servidor (validación interna).
CREATE TABLE IF NOT EXISTS partida_fichas (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  partida_id INT UNSIGNED NOT NULL,
  usuario_id INT UNSIGNED NOT NULL, -- dueño actual de la ficha (mientras no se juegue)
  lado_a TINYINT NOT NULL,
  lado_b TINYINT NOT NULL,
  jugada TINYINT(1) NOT NULL DEFAULT 0,
  extremo ENUM('izquierda','derecha') NULL,
  orden_en_mesa INT NULL,
  jugada_en DATETIME NULL,
  FOREIGN KEY (partida_id) REFERENCES partidas(id) ON DELETE CASCADE,
  KEY idx_partida_usuario (partida_id, usuario_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS partida_chat (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  partida_id INT UNSIGNED NOT NULL,
  usuario_id INT UNSIGNED NOT NULL,
  sticker VARCHAR(40) NOT NULL,
  creado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (partida_id) REFERENCES partidas(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS reportes (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  partida_id INT UNSIGNED NOT NULL,
  reportante_id INT UNSIGNED NOT NULL,
  reportado_id INT UNSIGNED NOT NULL,
  motivo VARCHAR(255) NULL,
  revisado TINYINT(1) NOT NULL DEFAULT 0,
  creado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (partida_id) REFERENCES partidas(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ---------- Artículos iniciales de la tienda ----------
-- SET NAMES evita que los acentos se guarden mal si el cliente mysql no
-- está usando utf8mb4 por defecto al correr este script.
SET NAMES utf8mb4;
INSERT IGNORE INTO articulos_tienda (tipo, codigo, nombre, descripcion, precio_monedas, orden) VALUES
  ('ficha_skin', 'clasica',   'Clásica Blanca',  'La ficha de siempre, blanca y sencilla.', 0,   1),
  ('ficha_skin', 'ebano',     'Ébano Negro',     'Fichas negras con puntos blancos.',       200, 2),
  ('ficha_skin', 'oro',       'Oro Real',        'Fichas doradas con puntos borgoña.',      500, 3),
  ('ficha_skin', 'neon',      'Neón Turquesa',   'Fichas oscuras con brillo turquesa.',     350, 4),

  ('avatar', 'guerrero', 'Guerrero Dorado', 'Avatar exclusivo dorado.',   150, 1),
  ('avatar', 'ninja',    'Ninja Turquesa',  'Avatar exclusivo turquesa.', 150, 2),
  ('avatar', 'robot',    'Robot Plateado',  'Avatar exclusivo plateado.', 200, 3),
  ('avatar', 'fantasma', 'Fantasma Dorado', 'Avatar exclusivo especial.', 300, 4),

  ('marco', 'anillo_oro',   'Anillo Dorado',   'Borde dorado alrededor de tu avatar.',        150, 1),
  ('marco', 'aura_turquesa','Aura Turquesa',   'Resplandor turquesa alrededor de tu avatar.', 250, 2),
  ('marco', 'corona',       'Corona Real',     'Una corona sobre tu avatar.',                 400, 3),
  ('marco', 'llamas',       'Llamas',          'Borde de fuego alrededor de tu avatar.',      600, 4);
