-- SPDX-License-Identifier: GPL-3.0-or-later

-- 用户基本信息

CREATE TABLE IF NOT EXISTS userinfo (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  name VARCHAR(255),
  password CHAR(64),
  salt CHAR(8),
  avatar VARCHAR(64),
  lastLoginIp VARCHAR(64),
  banned BOOLEAN
);

CREATE TABLE IF NOT EXISTS banip (
  ip VARCHAR(64)
);

CREATE TABLE IF NOT EXISTS uuidinfo (
  id INTEGER PRIMARY KEY,
  uuid VARCHAR(32)
);

CREATE TABLE IF NOT EXISTS banuuid (
  uuid VARCHAR(32)
);

CREATE TABLE IF NOT EXISTS usergameinfo (
  id INTEGER PRIMARY KEY,
  registerTime INTEGER,  -- 时间戳
  lastLoginTime INTEGER, -- 时间戳
  totalGameTime INTEGER  -- 单位：秒
);

CREATE TABLE IF NOT EXISTS friendinfo (
  id1 INTEGER,
  id2 INTEGER,
  reltype INTEGER   -- 1=好友 2=黑名单
);

-- 胜率相关

/*
CREATE TABLE IF NOT EXISTS winRate (
  id INTEGER,
  general VARCHAR(20),
  mode VARCHAR(16),
  win INTEGER,
  lose INTEGER,
  draw INTEGER,
  PRIMARY KEY (id, general, mode)
);

CREATE VIEW IF NOT EXISTS playerWinRate AS
  SELECT winRate.id, name, mode,
    SUM(win) AS 'win',
    SUM(lose) AS 'lose',
    SUM(draw) AS 'draw',
    SUM(win + lose + draw) AS 'total',
    ROUND(SUM(win) * 1.0 / (SUM(win + lose + draw) * 1.0) * 100, 2)
      AS 'winRate'
  FROM winRate, userinfo
  WHERE winRate.id = userinfo.id
  GROUP BY winRate.id, mode;

CREATE VIEW IF NOT EXISTS generalWinRate AS
  SELECT general, mode,
    SUM(win) AS 'win',
    SUM(lose) AS 'lose',
    SUM(draw) AS 'draw',
    SUM(win + lose + draw) AS 'total',
    ROUND(SUM(win) * 1.0 / (SUM(win + lose + draw) * 1.0) * 100, 2)
      AS 'winRate'
  FROM winRate GROUP BY general, mode;
*/

CREATE TABLE IF NOT EXISTS runRate (
  id INTEGER,
  mode VARCHAR(16),
  run INTEGER,
  PRIMARY KEY (id, mode)
);

CREATE TABLE IF NOT EXISTS pWinRate (
  id INTEGER,
  mode VARCHAR(16),
  role VARCHAR(16),
  win INTEGER,
  lose INTEGER,
  draw INTEGER,
  PRIMARY KEY (id, mode, role)
);

CREATE TABLE IF NOT EXISTS gWinRate (
  general VARCHAR(16),
  mode VARCHAR(16),
  role VARCHAR(16),
  win INTEGER,
  lose INTEGER,
  draw INTEGER,
  PRIMARY KEY (general, mode, role)
);

CREATE VIEW IF NOT EXISTS pWinRateView AS
  SELECT pWinRate.id, name, mode,
    SUM(win) AS 'win',
    SUM(lose) AS 'lose',
    SUM(draw) AS 'draw',
    SUM(win + lose + draw) AS 'total',
    ROUND(SUM(win) * 1.0 / (SUM(win + lose + draw) * 1.0) * 100, 2)
      AS 'winRate'
  FROM pWinRate, userinfo
  WHERE pWinRate.id = userinfo.id
  GROUP BY pWinRate.id, mode;

CREATE VIEW IF NOT EXISTS gWinRateView AS
  SELECT general, mode,
    SUM(win) AS 'win',
    SUM(lose) AS 'lose',
    SUM(draw) AS 'draw',
    SUM(win + lose + draw) AS 'total',
    ROUND(SUM(win) * 1.0 / (SUM(win + lose + draw) * 1.0) * 100, 2)
      AS 'winRate'
  FROM gWinRate GROUP BY general, mode;
