from __future__ import annotations

import os
from pathlib import Path

from docx.enum.text import WD_ALIGN_PARAGRAPH

import build_standard_v4 as v4
import build_official_v3 as fmt


OUT = Path(
    os.environ.get(
        "CODE_AUDIT_V5_OUTPUT_DIR",
        str(Path.home() / "Desktop/等保整改证明材料-20260916/01-代码审计/对外报送修订版V5"),
    )
)
REPORT = OUT / "智慧营养健康餐厅管理系统重点代码安全审查报告.docx"
RECORD = OUT / "智慧营养健康餐厅管理系统代码安全审查记录及证明材料.docx"


def cover(doc, title: str, subtitle: str) -> None:
    p = doc.add_paragraph()
    p.paragraph_format.space_before = v4.Pt(95)
    p.paragraph_format.space_after = v4.Pt(24)
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    r = p.add_run(title)
    fmt.style_run(r, font=fmt.TITLE_FONT, size=24)
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    p.paragraph_format.space_after = v4.Pt(70)
    r = p.add_run(subtitle)
    fmt.style_run(r, font=fmt.HEADING_FONT, size=17)
    fmt.add_table(
        doc,
        ["项目", "内容"],
        [
            ["系统名称", "智慧营养健康餐厅管理系统"],
            ["审查对象", "管理端后台重点模块代码及相关接口"],
            ["审查日期", "2026年9月10日"],
            ["出具日期", "2026年9月11日"],
            ["编制单位", "北京康比特体育科技股份有限公司"],
        ],
        [4.0, 11.5],
        font_size=12,
    )
    fmt.add_text(
        doc,
        "北京康比特体育科技股份有限公司\n（盖章）\n2026年9月11日",
        first_line=False,
        align=WD_ALIGN_PARAGRAPH.RIGHT,
        line_pt=25,
        before=28,
        size=15,
    )


def build_report() -> None:
    doc = v4.new_doc("智慧营养健康餐厅管理系统重点代码安全审查报告", "网络安全限期整改代码审查材料")
    cover(doc, "智慧营养健康餐厅管理系统\n重点代码安全审查报告", "网络安全限期整改证明材料")

    fmt.add_page_break(doc)
    fmt.add_title(doc, "智慧营养健康餐厅管理系统", "重点代码安全审查报告")
    v4.heading(doc, "一、审查概况")
    v4.body(doc, "针对网络安全监督检查指出的系统上线前未开展代码审计问题，我单位于2026年9月10日对智慧营养健康餐厅管理系统管理端后台重点模块代码及相关接口开展安全审查，检查身份鉴别、访问控制、输入与查询、敏感信息保护、会话令牌和口令存储等环节，并核对已有修复和测试记录。")
    fmt.add_table(
        doc,
        ["项目", "落实情况"],
        [
            ["审查对象", "智慧营养健康餐厅管理系统管理端后台重点模块代码及相关接口"],
            ["时间范围", "2026年9月10日开展代码检查；2026年9月11日汇总形成报告"],
            ["检查范围", "登录与会话、人员信息接口、日期配餐查询、请求校验、公共安全逻辑和系统配置"],
            ["实施方式", "固定审查对象后开展重点代码静态检查，并核对已有修复、定向测试和服务器文件检查记录"],
            ["检查结果", "形成6项需要整改或进一步复核的问题；同时确认若干已有安全控制和1项历史接口修复记录"],
        ],
        [3.8, 11.7],
        font_size=10.5,
    )
    v4.heading(doc, "二、实际开展的工作")
    v4.body(doc, "一是围绕登录入口、会话处理、人员信息访问、日期配餐查询和系统配置加载等重点路径进行代码追踪；二是检查服务端输入校验、对象权限校验、查询构造、令牌保护和口令存储方式；三是核对历史人员详情接口修复、定向测试和服务器文件检查记录；四是依据现行安全开发、变更和授权审批制度登记检查结果及后续处置事项。")
    v4.heading(doc, "三、已确认的安全控制")
    fmt.add_table(
        doc,
        ["检查事项", "确认结果"],
        [
            ["登录安全控制", "已设置登录失败锁定、密码过期和复杂度检查"],
            ["认证信息保护", "认证Cookie已设置必要的安全属性"],
            ["人员详情访问", "历史修复已在详情查询前增加目标人员范围校验"],
            ["检查记录留存", "已形成审查范围、问题清单及历史修复和测试核对记录"],
        ],
        [5.0, 10.5],
        font_size=10.5,
    )

    v4.heading(doc, "四、检查发现及处置情况")
    fmt.add_table(
        doc,
        ["序号", "检查发现", "当前处置情况"],
        [
            ["1", "二次认证状态与服务端用户、会话的绑定不足", "待完善服务端认证状态管理并复核"],
            ["2", "人员更新、删除及展示等接口的对象权限校验不完整", "人员详情接口已有修复记录，其余相关接口待整改复核"],
            ["3", "日期配餐查询存在动态查询拼接", "待改为参数化处理并开展异常输入复核"],
            ["4", "部分系统配置存在明文敏感信息管理风险", "待迁移受控配置、轮换相关凭据并核查影响"],
            ["5", "会话令牌保护及账号状态复核需要加强", "待完善令牌和账号状态校验机制"],
            ["6", "现有口令摘要算法和盐值强度不足", "待制定兼容迁移方案并开展登录、改密和重置回归"],
        ],
        [1.2, 8.0, 6.3],
        font_size=10.2,
    )
    v4.heading(doc, "五、修复与验证情况")
    v4.body(doc, "历史人员详情接口已增加目标人员范围校验，定向测试记录显示3项测试、10项断言通过；服务器检查确认相应修复文件已部署。相关测试集中仍记录4项失败、1项错误，且受限账号合法对象、越权对象的线上对照复测尚未完成。因此，现阶段仅确认该详情接口已有局部修复和定向验证结果，其他问题仍按清单整改复核。")
    fmt.add_page_break(doc)
    v4.heading(doc, "六、结论及后续安排")
    v4.body(doc, "截至2026年9月11日，我单位已完成本次重点范围代码安全审查，形成审查对象、时间、范围、检查结果和处置记录。审查发现的6项问题尚未全部完成整改复核，不能据此认定全部代码安全问题均已解决。")
    fmt.add_table(
        doc,
        ["后续事项", "工作内容", "当前状态"],
        [
            ["代码整改", "按照问题清单完成认证、授权、查询、配置、令牌和口令存储整改", "待完成"],
            ["测试复核", "完成相关测试失败项处理及受限账号合法对象、越权对象对照复测", "待完成"],
            ["上线核对", "核对整改内容的发布结果并留存检查记录", "待完成"],
            ["材料整理", "汇总代码检查、整改、测试、上线核对和审批记录", "持续整理"],
        ],
        [3.0, 9.3, 3.2],
        font_size=10.2,
    )
    v4.body(doc, "我单位将按照回函承诺于2026年9月16日前提交本阶段证明材料。")
    v4.body(doc, "附件：《智慧营养健康餐厅管理系统代码安全审查记录及证明材料》", first=False)
    fmt.add_text(
        doc,
        "北京康比特体育科技股份有限公司\n（盖章）\n2026年9月11日",
        first_line=False,
        align=WD_ALIGN_PARAGRAPH.RIGHT,
        line_pt=21,
        before=8,
        size=13,
    )
    doc.save(REPORT)


def build_record() -> None:
    doc = v4.new_doc("智慧营养健康餐厅管理系统代码安全审查记录及证明材料", "网络安全限期整改代码审查记录")
    cover(doc, "智慧营养健康餐厅管理系统\n代码安全审查记录及证明材料", "与重点代码安全审查报告配套使用")

    fmt.add_page_break(doc)
    fmt.add_title(doc, "智慧营养健康餐厅管理系统", "代码安全审查记录及证明材料")
    v4.heading(doc, "一、审查对象与实施记录")
    fmt.add_table(
        doc,
        ["项目", "记录内容"],
        [
            ["审查日期", "2026年9月10日"],
            ["审查对象", "智慧营养健康餐厅管理系统管理端后台重点模块代码及相关接口"],
            ["模块范围", "登录与会话、人员信息接口、日期配餐查询、请求校验、公共安全逻辑和系统配置"],
            ["实施方式", "重点代码静态检查；核对历史修复、定向测试及服务器文件检查记录"],
            ["形成结果", "6项问题记录、已有控制检查记录、历史接口修复与测试核对记录"],
        ],
        [3.6, 11.9],
        font_size=10.5,
    )
    v4.heading(doc, "二、相关工作及落实情况")
    fmt.add_table(
        doc,
        ["序号", "工作事项", "落实情况", "相关材料"],
        [
            ["1", "固定审查对象和范围", "已明确系统、模块、接口和检查日期", "审查报告、审查记录"],
            ["2", "重点代码检查", "已检查认证、授权、输入查询、会话、口令和配置等重点环节", "问题检查记录"],
            ["3", "历史修复核对", "已核对人员详情接口修复内容", "接口修复记录"],
            ["4", "测试与部署核对", "已核对定向测试和服务器文件检查结果", "测试记录、服务器检查记录"],
            ["5", "问题登记与处置", "已形成6项问题及后续整改复核安排", "问题及处置情况表"],
        ],
        [1.0, 4.0, 6.4, 4.1],
        font_size=9.5,
    )
    v4.heading(doc, "三、已有安全控制检查结果")
    fmt.add_table(
        doc,
        ["检查内容", "结果"],
        [
            ["登录失败处理", "已设置失败锁定控制"],
            ["密码使用控制", "已设置密码过期与复杂度检查"],
            ["认证Cookie", "已设置必要的安全属性"],
            ["人员详情接口", "已在详情查询前增加目标人员范围校验"],
        ],
        [6.0, 9.5],
        font_size=10,
    )

    v4.heading(doc, "四、问题检查及处置记录")
    fmt.add_table(
        doc,
        ["序号", "检查事项", "实际检查结果", "处置进展"],
        [
            ["1", "二次认证状态管理", "认证状态与服务端用户、会话绑定不足", "待完善并复核"],
            ["2", "人员接口对象权限", "详情接口已有范围校验；更新、删除和展示等接口校验仍不完整", "详情接口已修复；其余待整改复核"],
            ["3", "日期配餐查询", "存在动态查询拼接", "待参数化处理并复核"],
            ["4", "敏感配置管理", "部分配置存在明文敏感信息管理风险", "待迁移、轮换并核查影响"],
            ["5", "会话令牌和账号状态", "令牌保护及部分访问路径的状态复核需要加强", "待完善并核实"],
            ["6", "口令存储", "现有摘要算法和盐值强度不足", "待制定迁移方案并回归"],
        ],
        [1.0, 4.3, 6.0, 4.2],
        font_size=9.5,
    )
    v4.heading(doc, "五、历史接口修复与验证记录")
    fmt.add_table(
        doc,
        ["事项", "主要内容", "落实情况"],
        [
            ["接口修复", "人员详情接口在查询前增加目标人员范围校验", "已有代码修复记录"],
            ["定向测试", "3项测试、10项断言通过", "确认详情接口定向测试结果"],
            ["相关测试", "相关测试集中仍记录4项失败、1项错误", "需结合对应问题继续整改复核"],
            ["服务器检查", "已核对相应修复文件的服务器部署情况", "确认修复文件已部署"],
            ["线上对照复测", "受限账号合法对象、越权对象对照复测", "尚待完成"],
        ],
        [3.2, 7.4, 4.9],
        font_size=10,
    )

    v4.heading(doc, "六、制度执行依据")
    fmt.add_table(
        doc,
        ["序号", "制度名称", "主要管理要求"],
        [
            ["1", "安全开发管理规定", "安全需求、阶段评审、代码检查、问题整改和上线前安全测试"],
            ["2", "组织及岗位职责管理规定", "明确安全管理、开发、测试和运维职责"],
            ["3", "变更管理规定", "变更影响分析、测试、回退、验收和记录留存"],
            ["4", "授权和审批管理规定", "安全活动、程序变更及相关审批要求"],
        ],
        [1.2, 5.3, 9.0],
        font_size=10.2,
    )
    v4.heading(doc, "七、结果说明及后续安排")
    v4.body(doc, "本次已完成管理端后台重点模块代码及相关接口的安全检查，并形成6项问题记录。人员详情接口已有局部修复、定向测试和服务器部署检查结果；相关测试集中仍有4项失败、1项错误，受限账号线上对照复测尚待完成，其余问题也需继续整改复核。", size=13, line=22)
    v4.body(doc, "后续将逐项完成代码修改、测试复核、上线核对和审批记录整理，并按照回函承诺于2026年9月16日前提交本阶段证明材料。", size=13, line=22)
    fmt.add_text(
        doc,
        "北京康比特体育科技股份有限公司\n（盖章）\n2026年9月11日",
        first_line=False,
        align=WD_ALIGN_PARAGRAPH.RIGHT,
        line_pt=24,
        before=18,
        size=14,
    )
    doc.save(RECORD)


def main() -> None:
    OUT.mkdir(parents=True, exist_ok=True)
    build_report()
    build_record()
    print(REPORT)
    print(RECORD)


if __name__ == "__main__":
    main()
