-- =============================================================================
-- 指数算法参数初始化脚本
-- 版本: v1.0
-- 创建日期: 2026-02-03
-- 描述: 为客户召回指数和客户-助教亲密指数插入默认参数
-- =============================================================================

-- 清空旧数据（如果需要重新初始化）
-- DELETE FROM billiards_dws.cfg_index_parameters WHERE index_type IN ('RECALL', 'INTIMACY');

-- =============================================================================
-- 客户召回指数（RECALL）参数
-- =============================================================================

INSERT INTO billiards_dws.cfg_index_parameters 
    (index_type, param_name, param_value, description, effective_from)
VALUES
    -- 基础参数
    ('RECALL', 'lookback_days', 60, '回溯窗口（天）：分析近60天的数据', CURRENT_DATE),
    ('RECALL', 'sigma_min', 2.0, '波动下限（天）：避免σ过小导致超期过敏', CURRENT_DATE),
    
    -- 半衰期参数
    ('RECALL', 'halflife_new', 7, '新客户半衰期（天）：7天后新客户加分衰减到一半', CURRENT_DATE),
    ('RECALL', 'halflife_recharge', 10, '刚充值半衰期（天）：10天后充值加分衰减到一半', CURRENT_DATE),
    
    -- 权重参数
    ('RECALL', 'weight_overdue', 3.0, '超期紧急性权重：主导因子，建议3.0', CURRENT_DATE),
    ('RECALL', 'weight_new', 1.0, '新客户权重：建议1.0', CURRENT_DATE),
    ('RECALL', 'weight_recharge', 1.0, '刚充值权重：建议1.0', CURRENT_DATE),
    ('RECALL', 'weight_hot', 1.0, '热度断档权重：建议1.0', CURRENT_DATE),
    
    -- 映射参数
    ('RECALL', 'percentile_lower', 5, '下锚分位数：5分位', CURRENT_DATE),
    ('RECALL', 'percentile_upper', 95, '上锚分位数：95分位', CURRENT_DATE),
    ('RECALL', 'ewma_alpha', 0.2, 'EWMA平滑系数：越小越平滑，建议0.2', CURRENT_DATE)
ON CONFLICT (index_type, param_name, effective_from) DO UPDATE SET
    param_value = EXCLUDED.param_value,
    description = EXCLUDED.description,
    updated_at = NOW();


-- =============================================================================
-- 客户-助教亲密指数（INTIMACY）参数
-- =============================================================================

INSERT INTO billiards_dws.cfg_index_parameters 
    (index_type, param_name, param_value, description, effective_from)
VALUES
    -- 基础参数
    ('INTIMACY', 'lookback_days', 60, '回溯窗口（天）：分析近60天的数据', CURRENT_DATE),
    ('INTIMACY', 'session_merge_hours', 4, '会话合并间隔（小时）：4小时内的服务算同次', CURRENT_DATE),
    ('INTIMACY', 'recharge_attribute_hours', 1, '充值归因窗口（小时）：服务结束后1小时内', CURRENT_DATE),
    ('INTIMACY', 'amount_base', 500, '金额压缩基准（元）：选门店常见充值档位', CURRENT_DATE),
    ('INTIMACY', 'incentive_weight', 1.5, '附加课权重倍数：附加课=基础课的1.5倍', CURRENT_DATE),
    
    -- 半衰期参数
    ('INTIMACY', 'halflife_session', 14, '会话衰减半衰期（天）：14天后权重衰减到一半', CURRENT_DATE),
    ('INTIMACY', 'halflife_last', 10, '最近一次半衰期（天）：10天后温度衰减到一半', CURRENT_DATE),
    ('INTIMACY', 'halflife_recharge', 21, '充值衰减半衰期（天）：21天后充值贡献衰减到一半', CURRENT_DATE),
    ('INTIMACY', 'halflife_short', 7, '短期激增检测半衰期（天）：用于Burst检测', CURRENT_DATE),
    ('INTIMACY', 'halflife_long', 30, '长期激增检测半衰期（天）：用于Burst检测', CURRENT_DATE),
    
    -- 权重参数
    ('INTIMACY', 'weight_frequency', 2.0, '频次权重：建议2.0', CURRENT_DATE),
    ('INTIMACY', 'weight_recency', 1.5, '最近一次权重：建议1.5', CURRENT_DATE),
    ('INTIMACY', 'weight_recharge', 2.0, '归因充值权重：建议2.0', CURRENT_DATE),
    ('INTIMACY', 'weight_duration', 0.5, '时长权重：次要因素，建议0.5', CURRENT_DATE),
    ('INTIMACY', 'burst_gamma', 0.6, '激增放大系数γ：建议0.6', CURRENT_DATE),
    
    -- 映射参数
    ('INTIMACY', 'percentile_lower', 5, '下锚分位数：5分位', CURRENT_DATE),
    ('INTIMACY', 'percentile_upper', 95, '上锚分位数：95分位', CURRENT_DATE),
    ('INTIMACY', 'ewma_alpha', 0.2, 'EWMA平滑系数：越小越平滑，建议0.2', CURRENT_DATE)
ON CONFLICT (index_type, param_name, effective_from) DO UPDATE SET
    param_value = EXCLUDED.param_value,
    description = EXCLUDED.description,
    updated_at = NOW();


-- =============================================================================
-- 验证
-- =============================================================================

-- 检查参数数量
DO $$
DECLARE
    recall_count INTEGER;
    intimacy_count INTEGER;
BEGIN
    SELECT COUNT(*) INTO recall_count 
    FROM billiards_dws.cfg_index_parameters 
    WHERE index_type = 'RECALL';
    
    SELECT COUNT(*) INTO intimacy_count 
    FROM billiards_dws.cfg_index_parameters 
    WHERE index_type = 'INTIMACY';
    
    RAISE NOTICE '召回指数参数数量: %', recall_count;
    RAISE NOTICE '亲密指数参数数量: %', intimacy_count;
    
    IF recall_count < 10 THEN
        RAISE WARNING '召回指数参数不完整，期望至少10个';
    END IF;
    
    IF intimacy_count < 15 THEN
        RAISE WARNING '亲密指数参数不完整，期望至少15个';
    END IF;
END $$;

-- 显示所有参数
SELECT 
    index_type,
    param_name,
    param_value,
    description,
    effective_from
FROM billiards_dws.cfg_index_parameters
ORDER BY index_type, param_name;
