SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;

USE hyapp_user;

-- 用户在房时长服务端事实：消费 room outbox 的 RoomUserJoined/RoomUserLeft/RoomUserKicked，
-- 替代只靠客户端 room_stay 埋点的口径（杀进程丢时长导致进房时长偏低甚至小于上麦时长）。
CREATE TABLE IF NOT EXISTS user_room_sessions (
  app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码，用于多租户隔离',
  room_session_id VARCHAR(128) NOT NULL COMMENT '在房会话 ID，取 RoomUserJoined 事件 ID',
  user_id BIGINT NOT NULL COMMENT '用户 ID',
  room_id VARCHAR(64) NOT NULL COMMENT '房间 ID',
  status VARCHAR(32) NOT NULL COMMENT '业务状态 open/ended',
  is_robot TINYINT(1) NOT NULL DEFAULT 0 COMMENT '进房时固化的机器人标记，机器人会话不产生统计事实',
  joined_at_ms BIGINT NOT NULL COMMENT '进房时间，UTC epoch ms',
  ended_at_ms BIGINT NULL COMMENT '离房时间，UTC epoch ms',
  end_reason VARCHAR(64) NOT NULL DEFAULT '' COMMENT '结束原因',
  room_online_ms BIGINT NOT NULL DEFAULT 0 COMMENT '在房毫秒值',
  opened_event_id VARCHAR(128) NOT NULL COMMENT '进房事件 ID',
  closed_event_id VARCHAR(128) NOT NULL DEFAULT '' COMMENT '闭合事件 ID',
  last_event_id VARCHAR(128) NOT NULL COMMENT '最后事件 ID',
  last_room_version BIGINT NOT NULL DEFAULT 0 COMMENT '最后房间版本',
  created_at_ms BIGINT NOT NULL COMMENT '创建时间，UTC epoch ms',
  updated_at_ms BIGINT NOT NULL COMMENT '更新时间，UTC epoch ms',
  PRIMARY KEY (app_code, room_session_id),
  KEY idx_user_room_sessions_user_status (app_code, user_id, status, joined_at_ms),
  KEY idx_user_room_sessions_room_user (app_code, room_id, user_id, status),
  KEY idx_user_room_sessions_open_timeout (app_code, status, joined_at_ms)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户在房会话表';

CREATE TABLE IF NOT EXISTS user_room_daily_stats (
  app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码，用于多租户隔离',
  user_id BIGINT NOT NULL COMMENT '用户 ID',
  stat_date CHAR(10) NOT NULL COMMENT '统计日期，UTC',
  room_online_ms BIGINT NOT NULL DEFAULT 0 COMMENT '在房毫秒值',
  session_count BIGINT NOT NULL DEFAULT 0 COMMENT '会话数量',
  first_room_at_ms BIGINT NOT NULL DEFAULT 0 COMMENT '首次在房时间，UTC epoch ms',
  last_room_at_ms BIGINT NOT NULL DEFAULT 0 COMMENT '最后在房时间，UTC epoch ms',
  updated_at_ms BIGINT NOT NULL COMMENT '更新时间，UTC epoch ms',
  PRIMARY KEY (app_code, user_id, stat_date),
  KEY idx_user_room_daily_date (app_code, stat_date, room_online_ms)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户在房每日统计表';

CREATE TABLE IF NOT EXISTS user_room_orphan_leaves (
  app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码，用于多租户隔离',
  event_id VARCHAR(128) NOT NULL COMMENT '离房事件 ID',
  room_id VARCHAR(64) NOT NULL COMMENT '房间 ID',
  user_id BIGINT NOT NULL COMMENT '用户 ID',
  left_at_ms BIGINT NOT NULL COMMENT '离房时间，UTC epoch ms',
  reason VARCHAR(64) NOT NULL DEFAULT '' COMMENT '离房原因',
  created_at_ms BIGINT NOT NULL COMMENT '创建时间，UTC epoch ms',
  PRIMARY KEY (app_code, event_id),
  KEY idx_user_room_orphan_room_user (app_code, room_id, user_id, left_at_ms),
  KEY idx_user_room_orphan_left_at (app_code, left_at_ms)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='先于进房事实到达的离房事件暂存表';

CREATE TABLE IF NOT EXISTS user_room_event_consumption (
  app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码，用于多租户隔离',
  event_id VARCHAR(128) NOT NULL COMMENT '事件幂等 ID',
  event_type VARCHAR(64) NOT NULL COMMENT '事件类型',
  room_id VARCHAR(64) NOT NULL COMMENT '房间 ID',
  user_id BIGINT NOT NULL COMMENT '用户 ID',
  status VARCHAR(32) NOT NULL COMMENT '业务状态',
  skip_reason VARCHAR(128) NOT NULL DEFAULT '' COMMENT '跳过原因',
  created_at_ms BIGINT NOT NULL COMMENT '创建时间，UTC epoch ms',
  consumed_at_ms BIGINT NULL COMMENT '消费时间，UTC epoch ms',
  updated_at_ms BIGINT NOT NULL COMMENT '更新时间，UTC epoch ms',
  PRIMARY KEY (app_code, event_id),
  KEY idx_user_room_event_user (app_code, user_id, created_at_ms)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户在房事件消费位点表';
