CREATE TABLE IF NOT EXISTS puzzle_catalog (
  puzzle_id VARCHAR(96) PRIMARY KEY,
  season_id VARCHAR(48) NOT NULL,
  grid_size TINYINT UNSIGNED NOT NULL,
  UNIQUE KEY season_puzzle (season_id, puzzle_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS auth_nonces (
  nonce CHAR(64) PRIMARY KEY,
  wallet VARCHAR(64) NOT NULL,
  expires_at DATETIME NOT NULL,
  used_at DATETIME NULL,
  created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  KEY wallet_expires (wallet, expires_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS season_scores (
  season_id VARCHAR(48) NOT NULL,
  wallet VARCHAR(64) NOT NULL,
  score INT UNSIGNED NOT NULL DEFAULT 0,
  completed_count SMALLINT UNSIGNED NOT NULL DEFAULT 0,
  best_puzzle_score INT UNSIGNED NOT NULL DEFAULT 0,
  updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (season_id, wallet),
  KEY leaderboard (season_id, score DESC, updated_at ASC)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS completed_puzzles (
  season_id VARCHAR(48) NOT NULL,
  puzzle_id VARCHAR(96) NOT NULL,
  wallet VARCHAR(64) NOT NULL,
  score INT UNSIGNED NOT NULL,
  duration_seconds SMALLINT UNSIGNED NOT NULL,
  mistakes TINYINT UNSIGNED NOT NULL,
  completed_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (season_id, puzzle_id, wallet),
  KEY wallet_season (wallet, season_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
