#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
看板趋势图改版：H1/H2 两张卡 → 全年 12 个月一张图（YEARTREND_V1）
  · 卡片标题：📅 月度目标/达成趋势 → 📅 全年目标/达成趋势
  · 去掉 H1/H2 分段按钮（state.h1h2）
  · 删除位于下方的「📊 H2月度目标 vs 实际」卡（已被全年图覆盖）
  · drawMonthlyChart 改为固定 12 个月；数据由 getKPI 提供 yearTargets / yearActuals
"""
import re
import sys

MARK = 'YEARTREND_V1'


def patch(path):
    s = open(path, encoding='utf-8').read()
    if MARK in s:
        return '⏭ 已改过：%s' % path
    n = 0

    # ① 标题 + 去分段按钮
    old_h = """    '<div class=\"chart-header\"><h4>📅 月度目标/达成趋势</h4>' +
    '<div class=\"seg-control\"><button class=\"' + (state.h1h2 === 'h1' ? 'active' : '') + '\" onclick=\"setH1H2(\\'h1\\')\">H1</button><button class=\"' + (state.h1h2 === 'h2' ? 'active' : '') + '\" onclick=\"setH1H2(\\'h2\\')\">H2</button></div>' +
    '</div>"""
    new_h = """    '<div class=\"chart-header\"><h4>📅 全年目标/达成趋势</h4></div>""" + "   /* " + MARK + " */"
    if old_h in s:
        s = s.replace(old_h, new_h, 1); n += 1
    else:
        print('   ⚠️ 标题段未命中（尝试宽松匹配）')
        s2 = re.sub(r"'<div class=\"chart-header\"><h4>📅 月度目标/达成趋势</h4>' \+\s*\n\s*'<div class=\"seg-control\">.*?</div>' \+\s*\n(\s*)'</div>",
                    "'<div class=\"chart-header\"><h4>📅 全年目标/达成趋势</h4></div>   /* " + MARK + " */", s, count=1, flags=re.S)
        if s2 != s:
            s = s2; n += 1

    # ② 删除 H2 对比卡
    i = s.find("'<div class=\"card chart-card\">' +\n    '<div class=\"chart-header\"><h4>📊 H2月度目标 vs 实际</h4></div>'")
    if i > 0:
        j = s.find("'<div class=\"card\">", i)
        if j > i:
            s = s[:i] + s[j:]; n += 1
        else:
            print('   ⚠️ H2 卡片结束位置未找到')
    else:
        m = re.search(r"'<div class=\"card chart-card\">'\s*\+\s*\n\s*'<div class=\"chart-header\"><h4>📊 H2月度目标 vs 实际</h4></div>'.*?\n(\s*)'<div class=\"card\">", s, re.S)
        if m:
            s = s[:m.start()] + s[m.end() - len("'<div class=\"card\">"):]; n += 1
        else:
            print('   ⚠️ H2 卡未命中（可能已被删）')

    # ③ 调用处：不再画 H2 对比图
    old_call = "drawMonthlyChart(kpi, h1Labels, h2Labels); drawH2CompareChart(kpi);"
    if old_call in s:
        s = s.replace(old_call, "drawMonthlyChart(kpi);", 1); n += 1
    else:
        s2 = s.replace("drawMonthlyChart(kpi, h1Labels, h2Labels);", "drawMonthlyChart(kpi);", 1)
        s2 = s2.replace(" drawH2CompareChart(kpi);", "", 1)
        if s2 != s: s = s2; n += 1

    # ④ drawMonthlyChart 固定 12 个月
    old_geo = """  var isH1 = state.h1h2 === 'h1';
  var labels = isH1 ? h1Labels : h2Labels;
  var targets = isH1 ? kpi.monthly.targets : kpi.h2Targets;
  var actuals = isH1 ? kpi.monthly.actuals : kpi.h2Actuals;
  var maxVal = Math.max(1, function() { var m = 0; for (var i = 0; i < 6; i++) { if ((targets[i] || 0) > m) m = targets[i]; if ((actuals[i] || 0) > m) m = actuals[i]; } return m; }());"""
    new_geo = """  // " + MARK + "：全年 12 个月一张图（不再分 H1/H2）
  var labels = ['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'];
  var targets = (kpi.yearTargets || []).slice(0, 12);
  var actuals = (kpi.yearActuals || []).slice(0, 12);
  while (targets.length < 12) targets.push(0);
  while (actuals.length < 12) actuals.push(0);
  var maxVal = Math.max(1, function() { var m = 0; for (var i = 0; i < 12; i++) { if ((targets[i] || 0) > m) m = targets[i]; if ((actuals[i] || 0) > m) m = actuals[i]; } return m; }());"""
    if old_geo in s:
        s = s.replace(old_geo, new_geo, 1); n += 1
    else:
        print('   ⚠️ drawMonthlyChart 几何段未命中')

    # ⑤ 函数签名简化
    s = s.replace('function drawMonthlyChart(kpi, h1Labels, h2Labels) {', 'function drawMonthlyChart(kpi) {', 1)

    # ⑥ getKPI 提供全年序列（admin / 个人 两处 return 前插入计算）
    #   admin 分支
    adm = "    var q3Actual = (h2Actuals[0] || 0) + (h2Actuals[1] || 0) + (h2Actuals[2] || 0);\n    return { label: '全公司',"
    if adm in s:
        inject = ("    var q3Actual = (h2Actuals[0] || 0) + (h2Actuals[1] || 0) + (h2Actuals[2] || 0);\n"
                  "    // " + MARK + "：全年 12 个月序列\n"
                  "    var _yearT = ((h1.total && h1.total.targets) || []).slice(0, 6).concat(h2TargetsArr.slice(0, 6));\n"
                  "    var _yearA = [];\n"
                  "    for (var _m = 1; _m <= 12; _m++) { _yearA.push(t2026[String(_m)] || 0); }\n"
                  "    if (curMon >= 1) { _yearA[curMon - 1] = current || _yearA[curMon - 1]; }\n"
                  "    return { label: '全公司',")
        s = s.replace(adm, inject, 1); n += 1
    #   在 admin 的 return 对象里加字段
    s = s.replace("h2Targets: h2TargetsArr, h2Actuals: h2Actuals, current: current, last: last,",
                  "h2Targets: h2TargetsArr, h2Actuals: h2Actuals, yearTargets: _yearT, yearActuals: _yearA, current: current, last: last,", 1)
    #   个人分支
    per = "  var splitInfo = null;\n  if (split) {"
    if per in s:
        inj2 = ("  // " + MARK + "：全年 12 个月序列（H1 实际 + H2 目标/实际）\n"
                "  var _yearT2 = [0, 0, 0, 0, 0, 0].concat((h2Targets || []).slice(0, 6));\n"
                "  var _yearA2 = (monthlyActuals || []).slice(0, 6).concat((h2Actuals || []).slice(0, 6));\n"
                "  while (_yearA2.length < 12) _yearA2.push(0);\n"
                "  if (current) { _yearA2[nowMonth - 1] = current; }\n"
                "  var splitInfo = null;\n  if (split) {")
        s = s.replace(per, inj2, 1); n += 1
    s = s.replace("h2Targets: h2Targets, h2Actuals: h2Actuals, current: current, last: last2,",
                  "h2Targets: h2Targets, h2Actuals: h2Actuals, yearTargets: _yearT2, yearActuals: _yearA2, current: current, last: last2,", 1)

    assert n >= 4, '改动过少（%d），可能锚点失效：%s' % (n, path)
    open(path, 'w', encoding='utf-8').write(s)
    return '✅ 已改：%s（%d 项改动，%d 字节）' % (path, n, len(s.encode()))


if __name__ == '__main__':
    for p in sys.argv[1:]:
        print(patch(p))
