-- 轮询系统初始化配置脚本
-- 设计目标: 支持一亿张卡规模
-- 执行: psql -U user -d database -f scripts/init_polling_config.sql

-- ========================================
-- 1. 轮询配置初始化
-- 设计原则：
-- - 未实名卡：5分钟检查一次（避免过于频繁）
-- - 已实名卡：每天检查一次（状态稳定）
-- - 激活卡流量：每小时检查一次
-- ========================================

-- 删除已有配置（如果存在）
DELETE FROM tb_polling_config;

-- 优先级 10: 未实名卡（中频检查，每5分钟）
-- 预估：1000万未实名卡 × 12次/小时 = 1.2亿次/小时
INSERT INTO tb_polling_config (config_name, card_condition, card_category, carrier_id, priority, realname_check_interval, carddata_check_interval, package_check_interval, status, description)
VALUES
('未实名卡轮询', 'not_real_name', NULL, NULL, 10, 300, NULL, NULL, 1, '未实名卡每5分钟检查一次实名状态（一亿卡规模优化）');

-- 优先级 15: 行业卡（无需实名检查）
INSERT INTO tb_polling_config (config_name, card_condition, card_category, carrier_id, priority, realname_check_interval, carddata_check_interval, package_check_interval, status, description)
VALUES
('行业卡轮询', NULL, 'industry', NULL, 15, NULL, 3600, 3600, 1, '行业卡无需实名检查，每小时检查流量和套餐');

-- 优先级 20: 已实名卡（低频检查，每天一次）
-- 预估：3000万已实名卡 × 1次/天 = 很少
INSERT INTO tb_polling_config (config_name, card_condition, card_category, carrier_id, priority, realname_check_interval, carddata_check_interval, package_check_interval, status, description)
VALUES
('已实名卡轮询', 'real_name', NULL, NULL, 20, 86400, NULL, NULL, 1, '已实名卡每天检查一次实名状态（状态稳定，无需频繁检查）');

-- 优先级 30: 已激活卡（流量和套餐检查，每小时）
-- 预估：6000万激活卡 × 1次/小时 = 6000万次/小时
INSERT INTO tb_polling_config (config_name, card_condition, card_category, carrier_id, priority, realname_check_interval, carddata_check_interval, package_check_interval, status, description)
VALUES
('已激活卡轮询', 'activated', NULL, NULL, 30, NULL, 3600, 3600, 1, '已激活卡每小时检查流量和套餐（一亿卡规模优化）');

-- 优先级 100: 默认配置（兜底，保守策略）
INSERT INTO tb_polling_config (config_name, card_condition, card_category, carrier_id, priority, realname_check_interval, carddata_check_interval, package_check_interval, status, description)
VALUES
('默认轮询配置', NULL, NULL, NULL, 100, 86400, 86400, 86400, 1, '默认配置，每天检查一次（未匹配其他配置的卡）');

-- ========================================
-- 2. 并发控制配置初始化
-- 设计目标：支持 5 万 QPS 吞吐
-- 单 Worker 建议：500-1000 并发
-- 多 Worker 部署：8-16 个 Worker
-- ========================================

-- 删除已有配置（如果存在）
DELETE FROM tb_polling_concurrency_config;

-- 实名检查并发数（单 Worker）
INSERT INTO tb_polling_concurrency_config (task_type, max_concurrency, description)
VALUES
('realname', 500, '实名检查任务最大并发数（单 Worker，可部署多个 Worker 水平扩展）');

-- 卡流量检查并发数（单 Worker）
INSERT INTO tb_polling_concurrency_config (task_type, max_concurrency, description)
VALUES
('carddata', 1000, '流量检查任务最大并发数（单 Worker，流量检查占比最大）');

-- 套餐检查并发数（单 Worker）
INSERT INTO tb_polling_concurrency_config (task_type, max_concurrency, description)
VALUES
('package', 500, '套餐检查任务最大并发数（单 Worker）');

-- 停复机操作并发数（单 Worker）
INSERT INTO tb_polling_concurrency_config (task_type, max_concurrency, description)
VALUES
('stop_start', 100, '停复机操作最大并发数（需要谨慎控制）');

-- ========================================
-- 3. 数据清理配置初始化
-- 一亿卡规模每天产生大量数据，需要及时清理
-- ========================================

-- 删除已有配置（如果存在）
DELETE FROM tb_data_cleanup_config;

-- 流量历史记录清理配置（保留较短时间）
INSERT INTO tb_data_cleanup_config (table_name, retention_days, enabled, batch_size, description)
VALUES
('tb_data_usage_record', 30, 1, 50000, '保留30天流量历史，每批删除5万条（一亿卡每天产生大量数据）');

-- 操作日志清理配置
INSERT INTO tb_data_cleanup_config (table_name, retention_days, enabled, batch_size, description)
VALUES
('tb_account_operation_log', 90, 1, 50000, '保留90天操作日志，每批删除5万条');

-- 告警历史清理配置
INSERT INTO tb_data_cleanup_config (table_name, retention_days, enabled, batch_size, description)
VALUES
('tb_polling_alert_history', 14, 1, 50000, '保留14天告警历史，每批删除5万条');

-- 手动触发日志清理配置
INSERT INTO tb_data_cleanup_config (table_name, retention_days, enabled, batch_size, description)
VALUES
('tb_polling_manual_trigger_log', 30, 1, 50000, '保留30天手动触发日志，每批删除5万条');

-- 数据清理日志清理配置
INSERT INTO tb_data_cleanup_config (table_name, retention_days, enabled, batch_size, description)
VALUES
('tb_data_cleanup_log', 60, 1, 10000, '保留60天数据清理日志');

-- ========================================
-- 4. 告警规则初始化（一亿卡规模）
-- ========================================

-- 删除已有规则（如果存在）
DELETE FROM tb_polling_alert_rule;

-- 队列积压告警（阈值调高，适应大规模）
INSERT INTO tb_polling_alert_rule (rule_name, task_type, metric_type, operator, threshold, alert_level, cooldown_minutes, status, notify_channels, description)
VALUES
('实名检查队列积压', 'polling:realname', 'queue_size', '>', 500000, 'warning', 10, 1, 'log', '实名检查队列超过50万时告警'),
('流量检查队列积压', 'polling:carddata', 'queue_size', '>', 1000000, 'warning', 10, 1, 'log', '流量检查队列超过100万时告警'),
('实名检查队列严重积压', 'polling:realname', 'queue_size', '>', 2000000, 'critical', 5, 1, 'log', '实名检查队列超过200万时严重告警');

-- 失败率告警
INSERT INTO tb_polling_alert_rule (rule_name, task_type, metric_type, operator, threshold, alert_level, cooldown_minutes, status, notify_channels, description)
VALUES
('实名检查失败率过高', 'polling:realname', 'failure_rate', '>', 20, 'warning', 10, 1, 'log', '实名检查失败率超过20%时告警'),
('流量检查失败率过高', 'polling:carddata', 'failure_rate', '>', 20, 'warning', 10, 1, 'log', '流量检查失败率超过20%时告警');

-- ========================================
-- 初始化完成
-- ========================================

-- 验证初始化结果
SELECT '轮询配置初始化完成' AS message, COUNT(*) AS count FROM tb_polling_config;
SELECT '并发控制配置初始化完成' AS message, COUNT(*) AS count FROM tb_polling_concurrency_config;
SELECT '数据清理配置初始化完成' AS message, COUNT(*) AS count FROM tb_data_cleanup_config;
SELECT '告警规则初始化完成' AS message, COUNT(*) AS count FROM tb_polling_alert_rule;

-- ========================================
-- 容量规划参考（一亿卡）
-- ========================================
--
-- 检查次数估算（按上述配置）：
-- - 未实名卡（10%）：1000万 × 12次/小时 = 1.2亿次/小时
-- - 已实名卡（30%）：3000万 × 1次/天 ≈ 125万次/小时
-- - 激活卡流量（60%）：6000万 × 1次/小时 = 6000万次/小时
-- - 激活卡套餐（60%）：6000万 × 1次/小时 = 6000万次/小时
-- 总计：约 2.4 亿次/小时 = 6.7万次/秒
--
-- 推荐部署：
-- - Worker 数量：16 个（每个处理约 4000 QPS）
-- - Redis 内存：16GB+（缓存 + 队列）
-- - 数据库连接池：每 Worker 50 连接
-- - Asynq 队列：critical/default/low 三个队列
--
-- 初始化时间估算：
-- - 1000 万卡：约 50 秒（10万/批，500ms间隔）
-- - 1 亿卡：约 500 秒 ≈ 8 分钟
