-- ============================================================
-- addon/mqttbroker/install.sql  —— mqttbroker 插件数据表
-- 框架约定：插件安装时由 ywxapp\service\AddonService 执行本文件
--           （仅允许 CREATE TABLE / INSERT，见 importsql 白名单）。
-- 表名须为 __PREFIX__<插件名>_*，与 __PREFIX__addon 等核心表命名一致。
-- 时间字段统一约定：create_at / update_at / delete_at
-- ============================================================
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

CREATE TABLE IF NOT EXISTS `__PREFIX__mqttbroker_connection` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `client_id` varchar(191) NOT NULL DEFAULT '' COMMENT 'MQTT客户端标识',
  `username` varchar(191) DEFAULT NULL COMMENT '用户名',
  `ip` varchar(64) DEFAULT NULL COMMENT '客户端IP',
  `status` tinyint(1) DEFAULT '1' COMMENT '1在线 0离线',
  `create_at` int DEFAULT NULL COMMENT '连接时间',
  `update_at` int DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_client_id` (`client_id`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MQTT客户端连接表';

CREATE TABLE IF NOT EXISTS `__PREFIX__mqttbroker_message` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `client_id` varchar(191) DEFAULT NULL COMMENT '发布者client_id',
  `topic` varchar(255) NOT NULL DEFAULT '' COMMENT '主题',
  `payload` longtext COMMENT '消息内容',
  `qos` tinyint(1) DEFAULT '0' COMMENT 'QoS等级',
  `retain` tinyint(1) DEFAULT '0' COMMENT '是否保留消息',
  `source` varchar(32) DEFAULT 'client' COMMENT '来源：client 客户端 / manual 后台手动',
  `create_at` int DEFAULT NULL COMMENT '时间',
  PRIMARY KEY (`id`),
  KEY `idx_topic` (`topic`),
  KEY `idx_create_at` (`create_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MQTT消息日志表';

CREATE TABLE IF NOT EXISTS `__PREFIX__mqttbroker_topic` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `client_id` varchar(191) NOT NULL DEFAULT '' COMMENT '订阅者client_id',
  `topic` varchar(255) NOT NULL DEFAULT '' COMMENT '订阅主题（支持通配符）',
  `qos` tinyint(1) DEFAULT '0' COMMENT 'QoS等级',
  `create_at` int DEFAULT NULL COMMENT '订阅时间',
  PRIMARY KEY (`id`),
  KEY `idx_client_id` (`client_id`),
  KEY `idx_topic` (`topic`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MQTT订阅关系表';

-- 认证账号表（allow_anonymous=0 或提供用户名时校验密码）
CREATE TABLE IF NOT EXISTS `__PREFIX__mqttbroker_auth` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(191) NOT NULL DEFAULT '' COMMENT '用户名',
  `password` varchar(191) NOT NULL DEFAULT '' COMMENT '密码（bcrypt哈希，兼容明文）',
  `is_superuser` tinyint(1) NOT NULL DEFAULT '0' COMMENT '超级用户跳过ACL',
  `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1启用 0禁用',
  `remark` varchar(255) DEFAULT NULL COMMENT '备注',
  `create_at` int DEFAULT NULL,
  `update_at` int DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MQTT认证账号表';

-- ACL 主题权限表（按 sort 顺序匹配，命中即决定 allow/deny）
CREATE TABLE IF NOT EXISTS `__PREFIX__mqttbroker_acl` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `target_type` varchar(16) NOT NULL DEFAULT 'all' COMMENT 'all/user/client',
  `target` varchar(191) NOT NULL DEFAULT '' COMMENT '匹配值：用户名/clientid，all时忽略',
  `topic` varchar(255) NOT NULL DEFAULT '' COMMENT '主题过滤器，支持通配符与占位符%u %c',
  `access` tinyint(1) NOT NULL DEFAULT '3' COMMENT '1订阅 2发布 3两者',
  `allow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1允许 0拒绝',
  `sort` int NOT NULL DEFAULT '0' COMMENT '匹配优先级，越小越先',
  `remark` varchar(255) DEFAULT NULL COMMENT '备注',
  `create_at` int DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_sort` (`sort`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MQTT ACL权限表';

-- 保留消息持久化表（重启后恢复 retained）
CREATE TABLE IF NOT EXISTS `__PREFIX__mqttbroker_retain` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `topic` varchar(255) NOT NULL DEFAULT '' COMMENT '主题',
  `payload` longblob COMMENT '消息内容（二进制安全）',
  `qos` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'QoS等级',
  `update_at` int DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_topic` (`topic`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MQTT保留消息表';

-- 离线消息队列表（clean=false 会话离线期间的 QoS1/2 消息）
CREATE TABLE IF NOT EXISTS `__PREFIX__mqttbroker_offline` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `client_id` varchar(191) NOT NULL DEFAULT '' COMMENT '目标订阅者client_id',
  `topic` varchar(255) NOT NULL DEFAULT '' COMMENT '主题',
  `payload` longblob COMMENT '消息内容（二进制安全）',
  `qos` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'QoS等级',
  `create_at` int DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_client_id` (`client_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MQTT离线消息队列表';

-- 实时运行指标快照（Broker 周期写入单行 id=1，后台仪表盘轮询读取，跨进程安全）
CREATE TABLE IF NOT EXISTS `__PREFIX__mqttbroker_stats` (
  `id` int unsigned NOT NULL,
  `uptime` int DEFAULT '0' COMMENT '运行时长(秒)',
  `clients_online` int DEFAULT '0' COMMENT '在线连接数',
  `clients_total` int DEFAULT '0' COMMENT '累计会话数',
  `subscriptions` int DEFAULT '0' COMMENT '订阅关系数',
  `messages_received` int DEFAULT '0' COMMENT '累计接收消息数',
  `messages_sent` int DEFAULT '0' COMMENT '累计发送消息数',
  `retained` int DEFAULT '0' COMMENT '保留消息数',
  `timestamp` int DEFAULT '0' COMMENT '快照时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT实时运行指标快照';

-- 转发规则表（规则引擎：匹配源主题后转发到外部 Broker，如 EMQX）
CREATE TABLE IF NOT EXISTS `__PREFIX__mqttbroker_rule` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(191) NOT NULL DEFAULT '' COMMENT '规则名称',
  `source_filter` varchar(255) NOT NULL DEFAULT '' COMMENT '源主题过滤器(支持通配符 + #)',
  `target_type` varchar(16) NOT NULL DEFAULT 'mqtt' COMMENT '转发目标类型：mqtt',
  `target_broker` varchar(255) NOT NULL DEFAULT '' COMMENT '外部Broker地址 host:port',
  `target_clientid` varchar(191) DEFAULT '' COMMENT '连接外部Broker的clientId(可选)',
  `target_username` varchar(191) DEFAULT '' COMMENT '外部Broker用户名(可选)',
  `target_password` varchar(191) DEFAULT '' COMMENT '外部Broker密码(可选)',
  `target_topic` varchar(255) NOT NULL DEFAULT '' COMMENT '转发目标主题,支持 ${topic} 变量',
  `target_qos` tinyint(1) NOT NULL DEFAULT '0' COMMENT '转发QoS',
  `enabled` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1启用 0停用',
  `remark` varchar(255) DEFAULT NULL COMMENT '备注',
  `create_at` int DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_enabled` (`enabled`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT转发规则(规则引擎)';

-- 手动发布出站队列（后台/API 发布经 DB 出栈，Broker 消费后内部路由，零外部依赖）
CREATE TABLE IF NOT EXISTS `__PREFIX__mqttbroker_outbox` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `topic` varchar(255) NOT NULL DEFAULT '' COMMENT '主题',
  `payload` longblob COMMENT '消息内容(二进制安全)',
  `qos` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'QoS等级',
  `retain` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否保留',
  `source` varchar(32) DEFAULT 'manual' COMMENT '来源: manual/api/admin',
  `create_at` int DEFAULT NULL,
  `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '0待投递 1已投递',
  PRIMARY KEY (`id`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MQTT手动发布出站队列(跨进程内部路由)';
