"""CampusMetric 可在线更新页展示的版本历史。

每次发布更新包前，先在 CHANGELOG 顶部新增对应版本。
scripts/build_update_package.py 会校验版本号并自动使用这里的说明。
"""


CHANGELOG = [
    {
        'version': '0.4.0',
        'date': '2026-07-17',
        'title': '管理员批量录入与品牌升级',
        'summary': '管理员可一次为多名教师批量录入同一指标，系统更名为「校园全域智评系统」。',
        'items': [
            '管理员录入新增「批量录入」模式，与单条录入一键切换，原有单条流程完整保留。',
            '批量模式可多选被考评教师（支持搜索、全选、清空），表格逐行录入并实时显示每行预计得分。',
            '「首行值填充全部」按钮快速复制相同数据到所有行，逐行核对后一次性提交。',
            '「暂存」把未提交内容保存在本机浏览器，下次打开同一指标自动恢复；全部提交成功后自动清除。',
            '需材料指标在批量表格中逐行选择 1 张图片，提交时自动逐条上传并压缩；失败行可单独修改后重新提交。',
            '品牌名称统一为「校园全域智评系统」，覆盖系统界面、登录页与产品主页。',
        ],
    },
    {
        'version': '0.3.7',
        'date': '2026-07-16',
        'title': '查重附件与教师记录详情',
        'summary': '快速查重可并排核验新旧附件，教师端所有状态的申报记录均可打开完整详情。',
        'items': [
            '查重接口同时返回本次申请和相似已通过记录的附件名称与安全访问地址。',
            '左右对比卡片新增证明材料缩略图、文件名和查看大图入口。',
            '动态生成的附件按钮支持页内浮窗预览，无需跳转新标签页。',
            '教师端分项明细整行及查看详情按钮均可打开页内浮窗，审核通过后仍能查看完整申报内容。',
            '教师详情集中展示方案、学年、状态、得分、全部填报字段、班级、说明、审核意见和材料。',
            '调整浮窗层级与页面滚动锁定，保证桌面端和手机端连续查看体验。',
        ],
    },
    {
        'version': '0.3.6',
        'date': '2026-07-16',
        'title': '考评规则图形化编辑器',
        'summary': '手动配置字典不再要求管理员直接编写 JSON，常用计分规则和跟踪字段可视化编辑。',
        'items': [
            '新增和编辑考评明细时，按积分类型动态显示数字、档次、区间、级别×奖次和年限分档控件。',
            '支持图形化添加、删除和调整补充填报字段，包括文本、数字、日期、下拉选项及必填设置。',
            '二级跟踪字段支持开关、名称、必填、自由填写或下拉选择，以及选项列表可视化维护。',
            '高级 JSON 编辑区继续保留；图形修改即时生成 JSON，合法 JSON 修改也会反向刷新图形控件。',
            '已经产生考评数据的指标显示锁定说明并禁用计分口径修改，继续保护历史分数。',
        ],
    },
    {
        'version': '0.3.5',
        'date': '2026-07-16',
        'title': '学校品牌与双模型配置',
        'summary': '系统设置支持学校自定义 Logo，AI 按文字推理和图像识别两类任务自动选用模型。',
        'items': [
            '原“在线更新”菜单升级为“系统设置”，统一承载学校品牌和在线更新功能。',
            '超级管理员可上传学校 Logo 替换桌面侧栏和手机端默认图标，并可一键恢复默认。',
            'AI 配置拆分为文本思考模型与视觉识别模型，两套厂商、接口、Key 和模型 ID 可独立维护。',
            '评价方案 PDF / Markdown 转 JSON 自动调用文本思考模型，证书与材料识别自动调用视觉模型。',
            '旧版单模型配置升级时自动复制为两类配置，保持原有 AI 功能连续可用。',
            '移除侧边栏重复的“手机快捷访问”卡片，保留“移动访问”菜单和手机端二维码入口。',
        ],
    },
    {
        'version': '0.3.4',
        'date': '2026-07-15',
        'title': '申报作废、审核查重与更新日志',
        'summary': '完善申报记录的纠错和审核复核能力，并建立可持续维护的版本日志。',
        'items': [
            '教师可作废待审核或已退回申报；作废后仅本人可见，且只能在作废后删除。',
            '审核人可对已通过记录填写原因后作废，分数即时从汇总、排名和档案中移除。',
            '一级审核新增快速查重，对比同方案同指标的已通过数据，以浮窗左右展示新旧记录。',
            '在线更新页新增历史更新日志；更新包构建时强制校验日志与版本号。',
        ],
    },
    {
        'version': '0.3.3',
        'date': '2026-07-15',
        'title': '账号编辑界面重做',
        'summary': '账号设置与整体 UI 统一，明确任职年限和教师身份字段含义。',
        'items': [
            '编辑界面按账号权限、教师身份和账号安全分区。',
            '将原先无说明的数字字段明确为“班主任任职年限（年）”，说明 0 的含义。',
            '优化桌面抽屉和手机端滚动浮层。',
        ],
    },
    {
        'version': '0.3.2',
        'date': '2026-07-15',
        'title': '教师账号支持多方案',
        'summary': '同一教师可参与多个部门的不同考评事项。',
        'items': [
            '超级管理员可为教师多选可用考评方案。',
            '教师在页面右上角切换当前方案，填报和分数严格按方案隔离。',
            '账号 Excel 导入支持一个账号同时填写多个方案编号。',
        ],
    },
    {
        'version': '0.3.1',
        'date': '2026-07-15',
        'title': '发布与分发流程优化',
        'summary': '完善更新源、校验、回滚备份和公开分发细节。',
        'items': [
            '优化纯代码更新包和 Windows 免安装包构建。',
            '更新时保护数据库、附件、API Key 与历史备份。',
        ],
    },
    {
        'version': '0.3.0',
        'date': '2026-07-14',
        'title': 'CampusMetric 正式命名与开源发布',
        'summary': '项目从班主任专用原型进化为通用校园评价工具。',
        'items': [
            '统一 CampusMetric / 校园评价系统品牌、页面标题和启动器。',
            '补充开源仓库、Landing Page、Windows 免安装版和在线演示入口。',
            '完善本地部署、移动响应式和更新源能力。',
        ],
    },
    {
        'version': '0.2.6',
        'date': '2026-07-14',
        'title': '跨方案档案与退回重提',
        'summary': '长期档案扩展到跨方案、跨学年跟踪。',
        'items': [
            '教师和班级档案支持当前账号可访问的全部方案与学年。',
            '档案视图新增明细浮窗，退回数据支持修改后重新提交。',
            '桌面端左侧菜单固定，内容区独立滚动。',
        ],
    },
    {
        'version': '0.2.5',
        'date': '2026-07-14',
        'title': '班级跟踪与待审核编辑',
        'summary': '修复学生姓名误作班级字段，完善教师提交后的编辑流程。',
        'items': [
            '二级跟踪维度统一为班级，学生姓名迁移为普通填报字段。',
            '待审核申报可修改字段、说明和图片，通过后锁定。',
            '审核列表默认收起，档案视图生成补充反馈状态。',
        ],
    },
    {
        'version': '0.2.4',
        'date': '2026-07-14',
        'title': '字典明细与审核核验',
        'summary': '让管理员和审核人能看懂并核对每一条规则与填报数据。',
        'items': [
            '考评字典支持展开计分规则并定位编辑。',
            '审核页展示学生姓名、获奖级别、奖次等完整字段。',
            '附件改为页内浮窗预览，服务端严格验证图片类型。',
        ],
    },
    {
        'version': '0.2.3',
        'date': '2026-07-14',
        'title': 'AI 证书识别回填',
        'summary': '教师上传证书后，AI 按当前指标表单识别并回填。',
        'items': [
            '识别姓名、级别、奖次、班级和补充说明。',
            '服务端只接受字典允许的选项与级别×奖次组合，最终由教师确认。',
        ],
    },
    {
        'version': '0.2.2',
        'date': '2026-07-14',
        'title': '账号批量导入与子路径更新修复',
        'summary': '提高测试账号建立效率，修复公网子路径部署的在线更新。',
        'items': [
            '超级管理员可下载 Excel 模板并原子化批量导入账号。',
            '更新请求改为使用应用子路径，解决检查更新长时间停留在“处理中”的问题。',
        ],
    },
    {
        'version': '0.2.1',
        'date': '2026-07-14',
        'title': '公网 Demo 与托管更新',
        'summary': '建立公网测试实例和免安装托管更新流程。',
        'items': [
            '支持检查清单、下载、SHA256 校验、代码备份、替换和自动重启。',
            '更新不覆盖数据库、附件、密钥、备份与本地环境。',
        ],
    },
    {
        'version': '0.2.0',
        'date': '2026-07-14',
        'title': '多角色、多方案与 AI 配置',
        'summary': '从单一管理员和单方案扩展为可由不同部门管理的通用系统。',
        'items': [
            '新增超级管理员、部门管理员、审核人和教师四类角色。',
            '每个部门管理员可管理多套方案，支持新增、选择、归档和还原。',
            '新增 PDF / Markdown 方案 AI 转字典、证书识别和长期档案跟踪。',
        ],
    },
    {
        'version': '0.1.0',
        'date': '2026-07-13',
        'title': '首个可用版本',
        'summary': '以班主任评价为目标，贯通字典、填报、审核、计分与归档。',
        'items': [
            '支持 JSON 考评字典导入和手动配置。',
            '教师填报后进入一级审核，系统按指标规则自动计分。',
            '管理端支持录入、改分、总分排名、Excel 导出与学年归档。',
            '全站适配手机，支持模块二维码和单张图片压缩上传。',
        ],
    },
]


def entry_for_version(version):
    return next((entry for entry in CHANGELOG if entry['version'] == version), None)


def notes_for_version(version):
    entry = entry_for_version(version)
    if entry is None:
        raise ValueError(f'更新日志中缺少版本 {version}')
    parts = [entry['summary'], *entry['items']]
    return '；'.join(str(part).rstrip('。；; ') for part in parts) + '。'
