-- Ticketera independiente - MySQL 8 / MariaDB compatible
-- Importar en una BASE NUEVA, vacía. Valores monetarios expresados en centavos
-- para evitar errores de redondeo. Ejemplo: ARS 12500,00 = 1250000.

SET NAMES utf8mb4;
SET time_zone = '+00:00';

CREATE TABLE IF NOT EXISTS usuarios (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  nombre VARCHAR(120) NOT NULL,
  email VARCHAR(190) NOT NULL,
  password_hash VARCHAR(255) NULL,
  google_sub VARCHAR(255) NULL,
  email_verificado_at DATETIME NULL,
  rol ENUM('cliente','admin','puerta') NOT NULL DEFAULT 'cliente',
  activo TINYINT(1) NOT NULL DEFAULT 1,
  creado_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  actualizado_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  UNIQUE KEY uq_usuarios_email (email),
  UNIQUE KEY uq_usuarios_google_sub (google_sub)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS espectaculos (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  organizador_id BIGINT UNSIGNED NULL,
  titulo VARCHAR(180) NOT NULL,
  slug VARCHAR(200) NOT NULL,
  descripcion TEXT NULL,
  imagen VARCHAR(500) NULL,
  estado ENUM('borrador','publicado','cancelado','finalizado') NOT NULL DEFAULT 'borrador',
  creado_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  UNIQUE KEY uq_espectaculos_slug (slug),
  KEY ix_espectaculos_estado (estado),
  CONSTRAINT fk_espectaculos_organizador FOREIGN KEY (organizador_id) REFERENCES usuarios(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS funciones (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  espectaculo_id BIGINT UNSIGNED NOT NULL,
  nombre_sala VARCHAR(180) NOT NULL,
  fecha_hora DATETIME NOT NULL,
  moneda CHAR(3) NOT NULL DEFAULT 'ARS',
  estado ENUM('programada','agotada','cancelada','finalizada') NOT NULL DEFAULT 'programada',
  creado_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  KEY ix_funciones_espectaculo_fecha (espectaculo_id, fecha_hora),
  CONSTRAINT fk_funciones_espectaculo FOREIGN KEY (espectaculo_id) REFERENCES espectaculos(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS sectores (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  funcion_id BIGINT UNSIGNED NOT NULL,
  nombre VARCHAR(100) NOT NULL,
  precio_centavos BIGINT UNSIGNED NOT NULL,
  color VARCHAR(7) NULL,
  PRIMARY KEY (id),
  UNIQUE KEY uq_sector_funcion_nombre (funcion_id, nombre),
  CONSTRAINT fk_sectores_funcion FOREIGN KEY (funcion_id) REFERENCES funciones(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS butacas (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  funcion_id BIGINT UNSIGNED NOT NULL,
  sector_id BIGINT UNSIGNED NOT NULL,
  codigo VARCHAR(40) NOT NULL,
  fila VARCHAR(20) NULL,
  numero VARCHAR(20) NULL,
  coordenada_x DECIMAL(10,3) NULL,
  coordenada_y DECIMAL(10,3) NULL,
  activa TINYINT(1) NOT NULL DEFAULT 1,
  PRIMARY KEY (id),
  UNIQUE KEY uq_butaca_funcion_codigo (funcion_id, codigo),
  KEY ix_butacas_funcion_sector (funcion_id, sector_id),
  CONSTRAINT fk_butacas_funcion FOREIGN KEY (funcion_id) REFERENCES funciones(id) ON DELETE CASCADE,
  CONSTRAINT fk_butacas_sector FOREIGN KEY (sector_id) REFERENCES sectores(id) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS pedidos (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  usuario_id BIGINT UNSIGNED NOT NULL,
  funcion_id BIGINT UNSIGNED NOT NULL,
  referencia CHAR(32) NOT NULL,
  estado ENUM('pendiente_pago','pago_aprobado','pago_rechazado','cancelado','reembolsado','expirado') NOT NULL DEFAULT 'pendiente_pago',
  moneda CHAR(3) NOT NULL DEFAULT 'ARS',
  subtotal_centavos BIGINT UNSIGNED NOT NULL,
  cargo_centavos BIGINT UNSIGNED NOT NULL DEFAULT 0,
  total_centavos BIGINT UNSIGNED NOT NULL,
  vence_reserva_at DATETIME NULL,
  creado_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  actualizado_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  UNIQUE KEY uq_pedidos_referencia (referencia),
  KEY ix_pedidos_usuario_fecha (usuario_id, creado_at),
  KEY ix_pedidos_estado_vence (estado, vence_reserva_at),
  CONSTRAINT fk_pedidos_usuario FOREIGN KEY (usuario_id) REFERENCES usuarios(id) ON DELETE RESTRICT,
  CONSTRAINT fk_pedidos_funcion FOREIGN KEY (funcion_id) REFERENCES funciones(id) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS reservas (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  butaca_id BIGINT UNSIGNED NOT NULL,
  pedido_id BIGINT UNSIGNED NOT NULL,
  estado ENUM('activa','confirmada','liberada') NOT NULL DEFAULT 'activa',
  vence_at DATETIME NULL,
  creado_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  actualizado_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  UNIQUE KEY uq_reservas_butaca (butaca_id),
  KEY ix_reservas_pedido (pedido_id),
  KEY ix_reservas_estado_vence (estado, vence_at),
  CONSTRAINT fk_reservas_butaca FOREIGN KEY (butaca_id) REFERENCES butacas(id) ON DELETE RESTRICT,
  CONSTRAINT fk_reservas_pedido FOREIGN KEY (pedido_id) REFERENCES pedidos(id) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS pagos (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  pedido_id BIGINT UNSIGNED NOT NULL,
  proveedor ENUM('mercadopago') NOT NULL DEFAULT 'mercadopago',
  proveedor_pago_id VARCHAR(100) NULL,
  preferencia_id VARCHAR(100) NULL,
  estado ENUM('creado','pendiente','aprobado','rechazado','cancelado','reembolsado','en_revision') NOT NULL DEFAULT 'creado',
  monto_centavos BIGINT UNSIGNED NOT NULL,
  moneda CHAR(3) NOT NULL DEFAULT 'ARS',
  idempotencia_key VARCHAR(100) NOT NULL,
  payload_resumen JSON NULL,
  creado_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  actualizado_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  UNIQUE KEY uq_pago_idempotencia (idempotencia_key),
  UNIQUE KEY uq_pago_proveedor_id (proveedor, proveedor_pago_id),
  KEY ix_pagos_pedido (pedido_id),
  CONSTRAINT fk_pagos_pedido FOREIGN KEY (pedido_id) REFERENCES pedidos(id) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS entradas (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  pedido_id BIGINT UNSIGNED NOT NULL,
  reserva_id BIGINT UNSIGNED NOT NULL,
  codigo_publico CHAR(32) NOT NULL,
  qr_token_hash CHAR(64) NOT NULL,
  estado ENUM('valida','utilizada','anulada','reembolsada') NOT NULL DEFAULT 'valida',
  emitida_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  utilizada_at DATETIME NULL,
  utilizada_por BIGINT UNSIGNED NULL,
  PRIMARY KEY (id),
  UNIQUE KEY uq_entrada_codigo (codigo_publico),
  UNIQUE KEY uq_entrada_qr_hash (qr_token_hash),
  UNIQUE KEY uq_entrada_reserva (reserva_id),
  KEY ix_entradas_pedido (pedido_id),
  CONSTRAINT fk_entradas_pedido FOREIGN KEY (pedido_id) REFERENCES pedidos(id) ON DELETE RESTRICT,
  CONSTRAINT fk_entradas_reserva FOREIGN KEY (reserva_id) REFERENCES reservas(id) ON DELETE RESTRICT,
  CONSTRAINT fk_entradas_validador FOREIGN KEY (utilizada_por) REFERENCES usuarios(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS webhook_eventos (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  proveedor VARCHAR(40) NOT NULL,
  evento_id VARCHAR(190) NOT NULL,
  tipo VARCHAR(100) NULL,
  procesado_at DATETIME NULL,
  resultado VARCHAR(40) NOT NULL DEFAULT 'recibido',
  creado_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  UNIQUE KEY uq_webhook_evento (proveedor, evento_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
