-- =============================================================
-- Full Dominoes — Módulo de Torneos (eventos presenciales)
-- Independiente de `usuarios` (login Google/Facebook del juego online):
-- un jugador de torneo se inscribe con cédula y puede o no tener cuenta
-- en la app. Se ejecuta con: mysql -u root -p domino_2v2 < schema_torneos.sql
-- =============================================================

-- ---------- Geografía (para organizar por país/depto/ciudad/club) ----------

CREATE TABLE IF NOT EXISTS paises (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  nombre VARCHAR(100) NOT NULL UNIQUE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS departamentos (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  pais_id INT UNSIGNED NOT NULL,
  nombre VARCHAR(100) NOT NULL,
  FOREIGN KEY (pais_id) REFERENCES paises(id) ON DELETE CASCADE,
  UNIQUE KEY uniq_depto (pais_id, nombre)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS ciudades (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  departamento_id INT UNSIGNED NOT NULL,
  nombre VARCHAR(100) NOT NULL,
  FOREIGN KEY (departamento_id) REFERENCES departamentos(id) ON DELETE CASCADE,
  UNIQUE KEY uniq_ciudad (departamento_id, nombre)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS clubes (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  ciudad_id INT UNSIGNED NOT NULL,
  nombre VARCHAR(150) NOT NULL,
  FOREIGN KEY (ciudad_id) REFERENCES ciudades(id) ON DELETE CASCADE,
  UNIQUE KEY uniq_club (ciudad_id, nombre)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ---------- Jugadores del torneo (registro del administrador) ----------

CREATE TABLE IF NOT EXISTS jugadores_torneo (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  nombres VARCHAR(100) NOT NULL,
  apellidos VARCHAR(100) NOT NULL,
  cedula VARCHAR(20) NOT NULL UNIQUE, -- es también su usuario de entrada al portal del jugador
  clave_hash VARCHAR(255) NOT NULL,   -- por defecto = hash de la cédula; el jugador puede cambiarla
  telefono VARCHAR(30) NULL,
  email VARCHAR(150) NULL,
  club_id INT UNSIGNED NULL,
  activo TINYINT(1) NOT NULL DEFAULT 1,
  creado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (club_id) REFERENCES clubes(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ---------- Torneos ----------

CREATE TABLE IF NOT EXISTS torneos (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  nombre VARCHAR(150) NOT NULL,
  modalidad ENUM('individual','grupal') NOT NULL,
  -- Tamaño de mesa = cuántas "entidades" (jugadores en individual, equipos en
  -- grupal) se enfrentan por mesa. "Depende del evento que se publique":
  -- el organizador lo define al crear el torneo (2, 3 o 4).
  tamano_mesa TINYINT NOT NULL DEFAULT 2,
  -- Solo aplica a modalidad grupal: tamaño fijo de cada equipo (2, 3 o 4 jugadores).
  tamano_equipo TINYINT NULL,
  numero_rondas TINYINT NOT NULL DEFAULT 7,
  -- Última ronda en la que TODAVÍA se exige evitar "misma zona" en una mesa.
  -- Por defecto numero_rondas - 2 (ej: con 7 rondas, se exige hasta la ronda 5,
  -- garantizando que la ronda 6 ya esté libre de conflictos de zona).
  ronda_limite_zonas TINYINT NULL,
  -- A partir de esta ronda arranca la fase final: ahí el cruce por zona SÍ se
  -- permite (se prioriza el nivel deportivo sobre la procedencia geográfica).
  ronda_inicio_fase_final TINYINT NULL,
  estado ENUM('inscripcion','en_curso','finalizado') NOT NULL DEFAULT 'inscripcion',
  ronda_actual TINYINT NOT NULL DEFAULT 0,
  creado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Equipos fijos (solo modalidad grupal)
CREATE TABLE IF NOT EXISTS equipos_torneo (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  torneo_id INT UNSIGNED NOT NULL,
  nombre VARCHAR(150) NOT NULL,
  creado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (torneo_id) REFERENCES torneos(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS equipo_miembros (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  equipo_id INT UNSIGNED NOT NULL,
  jugador_id INT UNSIGNED NOT NULL,
  FOREIGN KEY (equipo_id) REFERENCES equipos_torneo(id) ON DELETE CASCADE,
  FOREIGN KEY (jugador_id) REFERENCES jugadores_torneo(id) ON DELETE CASCADE,
  UNIQUE KEY uniq_miembro (equipo_id, jugador_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Inscripción al torneo: en individual apunta a jugador_id, en grupal a equipo_id.
CREATE TABLE IF NOT EXISTS torneo_inscritos (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  torneo_id INT UNSIGNED NOT NULL,
  jugador_id INT UNSIGNED NULL,
  equipo_id INT UNSIGNED NULL,
  creado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (torneo_id) REFERENCES torneos(id) ON DELETE CASCADE,
  FOREIGN KEY (jugador_id) REFERENCES jugadores_torneo(id) ON DELETE CASCADE,
  FOREIGN KEY (equipo_id) REFERENCES equipos_torneo(id) ON DELETE CASCADE,
  CHECK (jugador_id IS NOT NULL OR equipo_id IS NOT NULL)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ---------- Rondas, mesas y resultados ----------

CREATE TABLE IF NOT EXISTS torneo_rondas (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  torneo_id INT UNSIGNED NOT NULL,
  numero_ronda TINYINT NOT NULL,
  es_fase_final TINYINT(1) NOT NULL DEFAULT 0,
  generada_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (torneo_id) REFERENCES torneos(id) ON DELETE CASCADE,
  UNIQUE KEY uniq_ronda (torneo_id, numero_ronda)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS torneo_mesas (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  ronda_id INT UNSIGNED NOT NULL,
  numero_mesa TINYINT NOT NULL,
  FOREIGN KEY (ronda_id) REFERENCES torneo_rondas(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Una fila por cada entidad (jugador o equipo) sentada en una mesa, con el
-- resultado de esa ronda una vez el administrador lo captura.
CREATE TABLE IF NOT EXISTS torneo_mesa_entidades (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  mesa_id INT UNSIGNED NOT NULL,
  jugador_id INT UNSIGNED NULL,
  equipo_id INT UNSIGNED NULL,
  gano TINYINT(1) NULL,          -- NULL = aún no se captura el resultado
  pintas_favor INT NULL,
  pintas_contra INT NULL,
  FOREIGN KEY (mesa_id) REFERENCES torneo_mesas(id) ON DELETE CASCADE,
  FOREIGN KEY (jugador_id) REFERENCES jugadores_torneo(id) ON DELETE CASCADE,
  FOREIGN KEY (equipo_id) REFERENCES equipos_torneo(id) ON DELETE CASCADE,
  CHECK (jugador_id IS NOT NULL OR equipo_id IS NOT NULL)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Login del portal del jugador (cédula + clave), separado de `sesiones`
-- (que es para el login social del juego online).
CREATE TABLE IF NOT EXISTS sesiones_jugador_torneo (
  token VARCHAR(191) NOT NULL PRIMARY KEY,
  jugador_id INT UNSIGNED NOT NULL,
  expira_en DATETIME NOT NULL,
  creado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (jugador_id) REFERENCES jugadores_torneo(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Login del administrador del evento (separado de todo lo anterior)
CREATE TABLE IF NOT EXISTS admins_torneo (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  usuario VARCHAR(60) NOT NULL UNIQUE,
  clave_hash VARCHAR(255) NOT NULL,
  nombre VARCHAR(100) NOT NULL,
  creado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS sesiones_admin_torneo (
  token VARCHAR(191) NOT NULL PRIMARY KEY,
  admin_id INT UNSIGNED NOT NULL,
  expira_en DATETIME NOT NULL,
  creado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (admin_id) REFERENCES admins_torneo(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
