-- M003 登录权限底座：本系统用户账号表，密码只保存单向哈希。
CREATE TABLE platform_user (
    id BIGINT NOT NULL COMMENT '用户内部 ID',
    username VARCHAR(128) NOT NULL COMMENT '登录用户名，全局唯一',
    password_hash VARCHAR(128) NOT NULL COMMENT '密码单向哈希，禁止保存明文密码',
    display_name VARCHAR(128) NOT NULL COMMENT '用户展示名称',
    email VARCHAR(256) NULL COMMENT '用户邮箱，第一版可为空',
    phone VARCHAR(64) NULL COMMENT '用户手机号，第一版可为空',
    user_status VARCHAR(32) NOT NULL COMMENT '用户状态：ACTIVE、DISABLED',
    super_admin TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否超级管理员，超级管理员默认可访问全部启用酒店',
    password_changed_at DATETIME(6) NULL COMMENT '最近密码变更 UTC 时间',
    last_login_at DATETIME(6) NULL COMMENT '最近登录 UTC 时间',
    created_at DATETIME(6) NOT NULL COMMENT '记录创建 UTC 时间',
    updated_at DATETIME(6) NOT NULL COMMENT '记录更新 UTC 时间',
    PRIMARY KEY (id),
    UNIQUE KEY uk_platform_user_username (username),
    KEY idx_platform_user_status (user_status)
) COMMENT='平台用户账号表，保存本系统登录用户基础信息';

-- M003 登录权限底座：数据库 session 表，只保存 token_hash。
CREATE TABLE platform_user_session (
    id BIGINT NOT NULL COMMENT '用户 session 内部 ID',
    user_id BIGINT NOT NULL COMMENT '所属用户 ID',
    token_hash CHAR(64) NOT NULL COMMENT 'access token 的 SHA-256 哈希，数据库不保存明文 token',
    session_status VARCHAR(32) NOT NULL COMMENT 'session 状态：ACTIVE、REVOKED、EXPIRED',
    issued_at DATETIME(6) NOT NULL COMMENT 'token 签发 UTC 时间',
    expires_at DATETIME(6) NOT NULL COMMENT 'token 过期 UTC 时间',
    revoked_at DATETIME(6) NULL COMMENT '注销或撤销 UTC 时间',
    last_seen_at DATETIME(6) NULL COMMENT '最近使用 UTC 时间',
    client_ip VARCHAR(64) NULL COMMENT '登录或最近请求 IP，第一版可为空',
    user_agent_summary VARCHAR(256) NULL COMMENT 'User-Agent 摘要，第一版可为空',
    created_at DATETIME(6) NOT NULL COMMENT '记录创建 UTC 时间',
    updated_at DATETIME(6) NOT NULL COMMENT '记录更新 UTC 时间',
    PRIMARY KEY (id),
    UNIQUE KEY uk_platform_user_session_token_hash (token_hash),
    KEY idx_platform_user_session_user_status (user_id, session_status),
    KEY idx_platform_user_session_expires_at (expires_at)
) COMMENT='平台用户登录 session 表，用于数据库 session token 登录态';

-- M003 登录权限底座：角色表。
CREATE TABLE platform_role (
    id BIGINT NOT NULL COMMENT '角色内部 ID',
    role_code VARCHAR(128) NOT NULL COMMENT '稳定角色代码，例如 SYSTEM_ADMIN',
    role_name VARCHAR(128) NOT NULL COMMENT '角色展示名称',
    role_status VARCHAR(32) NOT NULL COMMENT '角色状态：ACTIVE、DISABLED',
    system_builtin TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否系统内置角色',
    created_at DATETIME(6) NOT NULL COMMENT '记录创建 UTC 时间',
    updated_at DATETIME(6) NOT NULL COMMENT '记录更新 UTC 时间',
    PRIMARY KEY (id),
    UNIQUE KEY uk_platform_role_code (role_code),
    KEY idx_platform_role_status (role_status)
) COMMENT='平台角色表，保存本系统稳定角色定义';

-- M003 登录权限底座：权限码表。
CREATE TABLE platform_permission (
    id BIGINT NOT NULL COMMENT '权限内部 ID',
    permission_code VARCHAR(128) NOT NULL COMMENT '稳定权限代码，业务判断只能使用该字段',
    permission_name VARCHAR(128) NOT NULL COMMENT '权限展示名称',
    permission_group VARCHAR(64) NOT NULL COMMENT '权限分组，例如 RESERVATION、SOURCE_MESSAGE、SYSTEM',
    permission_status VARCHAR(32) NOT NULL COMMENT '权限状态：ACTIVE、DISABLED',
    system_builtin TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否系统内置权限',
    created_at DATETIME(6) NOT NULL COMMENT '记录创建 UTC 时间',
    updated_at DATETIME(6) NOT NULL COMMENT '记录更新 UTC 时间',
    PRIMARY KEY (id),
    UNIQUE KEY uk_platform_permission_code (permission_code),
    KEY idx_platform_permission_group (permission_group, permission_status)
) COMMENT='平台权限码表，保存后端和前端共同使用的稳定权限代码';

-- M003 登录权限底座：用户角色关系。
CREATE TABLE platform_user_role (
    id BIGINT NOT NULL COMMENT '用户角色关系 ID',
    user_id BIGINT NOT NULL COMMENT '用户 ID',
    role_id BIGINT NOT NULL COMMENT '角色 ID',
    created_at DATETIME(6) NOT NULL COMMENT '记录创建 UTC 时间',
    PRIMARY KEY (id),
    UNIQUE KEY uk_platform_user_role_user_role (user_id, role_id),
    KEY idx_platform_user_role_role (role_id)
) COMMENT='平台用户角色关系表';

-- M003 登录权限底座：角色权限关系。
CREATE TABLE platform_role_permission (
    id BIGINT NOT NULL COMMENT '角色权限关系 ID',
    role_id BIGINT NOT NULL COMMENT '角色 ID',
    permission_id BIGINT NOT NULL COMMENT '权限 ID',
    created_at DATETIME(6) NOT NULL COMMENT '记录创建 UTC 时间',
    PRIMARY KEY (id),
    UNIQUE KEY uk_platform_role_permission_role_perm (role_id, permission_id),
    KEY idx_platform_role_permission_perm (permission_id)
) COMMENT='平台角色权限关系表';

-- M003 登录权限底座：酒店基础信息。
CREATE TABLE platform_hotel (
    id BIGINT NOT NULL COMMENT '酒店内部 ID',
    hotel_id VARCHAR(64) NOT NULL COMMENT '业务酒店 ID，例如 HOTEL-TEST',
    hotel_name VARCHAR(128) NOT NULL COMMENT '酒店展示名称',
    hotel_status VARCHAR(32) NOT NULL COMMENT '酒店状态：ACTIVE、DISABLED',
    time_zone VARCHAR(64) NOT NULL COMMENT '酒店本地时区，例如 Asia/Bangkok',
    sort_order INT NOT NULL DEFAULT 0 COMMENT '菜单或选择器排序号',
    created_at DATETIME(6) NOT NULL COMMENT '记录创建 UTC 时间',
    updated_at DATETIME(6) NOT NULL COMMENT '记录更新 UTC 时间',
    PRIMARY KEY (id),
    UNIQUE KEY uk_platform_hotel_business_id (hotel_id),
    KEY idx_platform_hotel_status_sort (hotel_status, sort_order)
) COMMENT='平台酒店基础信息表，用于登录态和业务酒店上下文授权';

-- M003 登录权限底座：普通用户酒店授权关系。
CREATE TABLE platform_user_hotel (
    id BIGINT NOT NULL COMMENT '用户酒店授权关系 ID',
    user_id BIGINT NOT NULL COMMENT '用户 ID',
    hotel_id VARCHAR(64) NOT NULL COMMENT '酒店业务 ID',
    default_hotel TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否该用户默认酒店',
    created_at DATETIME(6) NOT NULL COMMENT '记录创建 UTC 时间',
    PRIMARY KEY (id),
    UNIQUE KEY uk_platform_user_hotel_user_hotel (user_id, hotel_id),
    KEY idx_platform_user_hotel_default (user_id, default_hotel)
) COMMENT='平台用户酒店授权关系表，普通用户只可访问授权酒店';

-- M003 登录权限底座：菜单定义表。
CREATE TABLE platform_menu (
    id BIGINT NOT NULL COMMENT '菜单内部 ID',
    parent_id BIGINT NULL COMMENT '父菜单 ID，根菜单为空',
    menu_code VARCHAR(128) NOT NULL COMMENT '稳定菜单代码',
    menu_name VARCHAR(128) NOT NULL COMMENT '菜单展示名称',
    menu_type VARCHAR(32) NOT NULL COMMENT '菜单类型：GROUP、PAGE、ACTION',
    route_path VARCHAR(256) NULL COMMENT '前端路由路径',
    component_key VARCHAR(128) NULL COMMENT '前端组件标识，第一版可为空',
    icon_key VARCHAR(128) NULL COMMENT '前端图标标识，第一版兼容 PrimeIcons class',
    permission_code VARCHAR(128) NULL COMMENT '访问该菜单需要的权限码，可为空',
    sort_order INT NOT NULL DEFAULT 0 COMMENT '菜单排序号',
    visible TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否作为菜单入口可见',
    menu_status VARCHAR(32) NOT NULL COMMENT '菜单状态：ACTIVE、DISABLED',
    created_at DATETIME(6) NOT NULL COMMENT '记录创建 UTC 时间',
    updated_at DATETIME(6) NOT NULL COMMENT '记录更新 UTC 时间',
    PRIMARY KEY (id),
    UNIQUE KEY uk_platform_menu_code (menu_code),
    KEY idx_platform_menu_parent_sort (parent_id, sort_order),
    KEY idx_platform_menu_visible_status (visible, menu_status)
) COMMENT='平台菜单定义表，决定当前用户可见导航入口';
