-- =====================================================================
--  @CHaT Web 移植版: Blue Pass (ゲーム開催管理) 用データベース
--  原作参照:
--    client/Window/BluePassDlg.xojo_window  L1499 SELECT * FROM gametable
--    client/Window/BluePassDlg.xojo_window  L1575 INSERT INTO gametable
--    client/Window/BluePassDlg.xojo_window  L1694 SELECT * FROM gameparticipanttable
--  原作 DB:
--    DatabaseName = "blue"     / Host = "atchat.org"
--    UserName     = "atchatuser" / Password = "atchat"
--    SET NAMES sjis            ← 当移植版は utf8mb4 に変更
-- =====================================================================

-- ---- データベースとユーザー ----
CREATE DATABASE IF NOT EXISTS `blue`
  CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 原作互換のユーザー名で作成 (パスワードは実運用では変更推奨)
--   ※ 原作クライアントは DB 接続情報を埋め込んでいたが、Web 移植版では
--     サーバー側 (atchat/server/src) が DB アクセスを代行する設計にするため
--     クライアントに DB パスワードを露出させる必要はない。
CREATE USER IF NOT EXISTS 'atchatuser'@'localhost' IDENTIFIED BY 'atchat';
CREATE USER IF NOT EXISTS 'atchatuser'@'%'         IDENTIFIED BY 'atchat';
GRANT ALL PRIVILEGES ON `blue`.* TO 'atchatuser'@'localhost';
GRANT ALL PRIVILEGES ON `blue`.* TO 'atchatuser'@'%';
FLUSH PRIVILEGES;

USE `blue`;

-- ---------------------------------------------------------------------
-- gametable: ゲーム開催情報
--   MakeGameButt.Action (Blue L1575-):
--     INSERT INTO gametable(datetime,roomno,title,comment,GMid,GMname,capacity)
--     VALUES ('YYYY-MM-DD HH:MM:SS', <roomno>, '<title>', '', <mIdNo>, '<mName>', <capacity>)
--   getGametable (L1499):
--     SELECT * FROM gametable ORDER BY gameid DESC LIMIT 0,30
--   表示 (TicketList) は:
--     "<gameid> YYYY-MM-DD HH:MM:SS 第<roomno>遊戯場 <capacity>人 <GMname>"
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `gametable` (
  `gameid`    INT          NOT NULL AUTO_INCREMENT,
  `datetime`  DATETIME     NOT NULL,
  `roomno`    INT          NOT NULL,
  `title`     VARCHAR(255) NOT NULL DEFAULT '',
  `comment`   TEXT         NULL,
  `GMid`      VARCHAR(64)  NOT NULL,
  `GMname`    VARCHAR(255) NOT NULL,
  `capacity`  INT          NOT NULL,
  `created_at` TIMESTAMP   NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`gameid`),
  INDEX `idx_gametable_datetime` (`datetime`),
  INDEX `idx_gametable_gmid`     (`GMid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ---------------------------------------------------------------------
-- gameparticipanttable: 参加者 (予約 / 購入)
--   TicketList.Change (Blue L1694-):
--     SELECT * FROM gameparticipanttable WHERE gameid=<gameid>
--   列参照: playerid, playername, status
--     status 値: 0=予約 / 1=購入 (Blue L1669-1670 stat(0)/stat(1))
--   ListBox ヘッダには "開始" "終了" もあるが、原作では表示用の空列で、
--   クエリでも読み取っていない。しかし sales.php (PHP 経由) でゲーム開始・
--   終了タイムスタンプを記録している挙動があるため (bSocket.sale) フィールド
--   として `starttime` / `endtime` を用意しておく。
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `gameparticipanttable` (
  `id`         INT          NOT NULL AUTO_INCREMENT,
  `gameid`     INT          NOT NULL,
  `playerid`   VARCHAR(64)  NOT NULL,
  `playername` VARCHAR(255) NOT NULL,
  `status`     TINYINT      NOT NULL DEFAULT 0
               COMMENT '0=予約 / 1=購入',
  `starttime`  DATETIME     NULL,
  `endtime`    DATETIME     NULL,
  `reserved_at` TIMESTAMP   NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uniq_game_player` (`gameid`, `playerid`),
  INDEX `idx_gamepart_gameid`   (`gameid`),
  INDEX `idx_gamepart_playerid` (`playerid`),
  CONSTRAINT `fk_gamepart_gameid`
    FOREIGN KEY (`gameid`) REFERENCES `gametable`(`gameid`)
    ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ---------------------------------------------------------------------
-- 動作確認用クエリ
-- ---------------------------------------------------------------------
-- SHOW TABLES;
-- DESCRIBE gametable;
-- DESCRIBE gameparticipanttable;
-- SELECT * FROM gametable ORDER BY gameid DESC LIMIT 10;
