#!/usr/bin/env python3
"""Build workflow assets for tender source enrichment and workbook delivery."""

from __future__ import annotations

from pathlib import Path

from openpyxl import Workbook
from openpyxl.styles import Alignment, Border, Font, PatternFill, Side
from openpyxl.utils import get_column_letter


ROOT = Path(__file__).resolve().parents[1]
OUT_DIR = ROOT / "docs" / "workflows"
FONT = "Microsoft YaHei"
BLUE = "1F4E79"
LIGHT_BLUE = "D9EAF7"
GREEN = "E2F0D9"
YELLOW = "FFF2CC"
WHITE = "FFFFFF"
BORDER = Border(
    left=Side(style="thin", color="B7C9DA"),
    right=Side(style="thin", color="B7C9DA"),
    top=Side(style="thin", color="B7C9DA"),
    bottom=Side(style="thin", color="B7C9DA"),
)


def style(cell, fill: str | None = None, bold: bool = False, color: str = "1F1F1F") -> None:
    cell.font = Font(name=FONT, size=10, bold=bold, color=color)
    cell.alignment = Alignment(wrap_text=True, vertical="top")
    cell.border = BORDER
    if fill:
        cell.fill = PatternFill("solid", fgColor=fill)


def title(ws, row: int, text: str, cols: int) -> None:
    ws.merge_cells(start_row=row, start_column=1, end_row=row, end_column=cols)
    cell = ws.cell(row, 1, text)
    cell.font = Font(name=FONT, size=15, bold=True, color=WHITE)
    cell.fill = PatternFill("solid", fgColor=BLUE)
    cell.alignment = Alignment(horizontal="center", vertical="center")
    cell.border = BORDER
    ws.row_dimensions[row].height = 32


def add_sheet(wb: Workbook, name: str, sheet_title: str, headers: list[str], rows: list[list[str]], widths: list[int]) -> None:
    ws = wb.create_sheet(name)
    title(ws, 1, sheet_title, len(headers))
    for col, header in enumerate(headers, 1):
        style(ws.cell(2, col, header), LIGHT_BLUE, True, "14344A")
        ws.cell(2, col).alignment = Alignment(horizontal="center", vertical="center", wrap_text=True)
    for row_idx, row in enumerate(rows, 3):
        for col_idx, value in enumerate(row, 1):
            fill = GREEN if value == "完成" else YELLOW if value in {"部分", "待登录"} else None
            style(ws.cell(row_idx, col_idx, value), fill)
    for idx, width in enumerate(widths, 1):
        ws.column_dimensions[get_column_letter(idx)].width = width
    for row in range(1, ws.max_row + 1):
        ws.row_dimensions[row].height = 42
    ws.freeze_panes = "A3"
    ws.auto_filter.ref = f"A2:{get_column_letter(len(headers))}{ws.max_row}"


def build_workbook() -> Path:
    OUT_DIR.mkdir(parents=True, exist_ok=True)
    wb = Workbook()
    wb.remove(wb.active)
    add_sheet(
        wb,
        "流程总览",
        "招投标资料补全 Workflow",
        ["阶段", "动作", "产物", "验收标准", "状态"],
        [
            ["1. 项目识别", "读取项目名、编号、采购人、中标人、金额、已有附件和截图。", "项目线索表", "每个项目至少有一个可检索关键词组合。", "完成"],
            ["2. 官方源优先", "检索政府采购网、公共资源交易中心、业主自有招采平台。", "官方公告/附件", "关键结论能回到官方链接或附件。", "完成"],
            ["3. 聚合站补线索", "检索乙方宝、千里马等，记录底部附件、联系人、截图字段。", "聚合站线索表", "截图线索和附件线索分开标注。", "部分"],
            ["4. 企业库补资质", "查天眼查、企查查、爱企查，补工商、证书、专利、软著、历史中标。", "公司资质表", "证书编号未见原文时标为待登录。", "待登录"],
            ["5. 供应商官网补参数", "用供应商案例和产品页补软件功能、硬件参数。", "产品参数参考表", "明确写非招标文件清单。", "完成"],
            ["6. Excel 交付", "按模板写入项目概览、设备、软件、资质、评分、三家公司和缺口。", "项目详情 Excel", "没有未标注来源的关键结论。", "完成"],
            ["7. 沉淀复用", "把问答、渠道、缺口、脚本和验收标准写入 skill/workflow。", "项目内 skills/workflow", "后续 agent 可按 skill 复跑。", "完成"],
        ],
        [18, 58, 32, 58, 14],
    )
    add_sheet(
        wb,
        "渠道矩阵",
        "资料渠道矩阵",
        ["渠道", "优先抓取字段", "常见门槛", "Excel 写法"],
        [
            ["官方政府/公共资源平台", "采购文件、评分标准、开标记录、中标候选人、合同公告", "交易系统登录、CA、附件不可匿名下载", "官方确认，最高优先级"],
            ["业主/行业招采平台", "银行/地铁/央企公告、报名要求、标书下载入口", "注册、报名、购买标书、审核", "记录入口和下载门槛"],
            ["乙方宝/千里马", "项目编号、金额、招标/中标单位、附件按钮、联系人", "微信/手机号扫码、附件登录", "截图线索或附件证据"],
            ["天眼查/企查查/爱企查", "工商、资质、专利、软著、历史中标、风险", "证书编号和明细通常登录", "公司资质，未见编号写待登录"],
            ["供应商官网/案例页", "产品型号、功能、参数、客户案例", "营销口径、非官方招标文件", "参数参考，标注非招标清单"],
        ],
        [28, 60, 46, 50],
    )
    add_sheet(
        wb,
        "问答沉淀",
        "本轮问答沉淀",
        ["用户问题", "沉淀规则", "落地位置"],
        [
            ["为什么只抽了海淀？", "用户提供的海淀材料应作为渠道样例，用来反哺三个目标项目，而不是替换目标项目。", "本 workflow、三项目渠道抓取 sheet"],
            ["乙方宝截图有什么用？", "截图可证明聚合站字段和附件入口，但必须标注截图线索，不能替代官方附件。", "tender-source-acquisition"],
            ["需要扫码怎么办？", "只有当缺口影响交付时才请求扫码；扫码后下载附件并归档。", "tender-source-acquisition"],
            ["不要 TSV。", "用户侧索引、清单、manifest、流程表默认用 Excel .xlsx。", "tender-detail-workbook-delivery"],
            ["评分看不懂怎么办？", "先列官方公式；没有公式时做总分校验和反推表，并明确待招标文件/评标报告确认。", "tender-detail-workbook-delivery"],
        ],
        [34, 86, 42],
    )
    output = OUT_DIR / "招投标资料补全与Excel交付Workflow.xlsx"
    wb.save(output)
    return output


def build_html() -> Path:
    OUT_DIR.mkdir(parents=True, exist_ok=True)
    path = OUT_DIR / "招投标资料补全与Excel交付Workflow.html"
    html = """<!doctype html>
<html lang="zh-CN">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>招投标资料补全与 Excel 交付 Workflow</title>
  <style>
    :root { --ink:#18202a; --muted:#5d6b7b; --line:#dce4ee; --panel:#fff; --page:#f6f8fb; --accent:#1f4e79; --soft:#e7f3f8; }
    * { box-sizing:border-box; }
    body { margin:0; background:var(--page); color:var(--ink); font-family:"Microsoft YaHei","PingFang SC",Arial,sans-serif; line-height:1.65; }
    main { max-width:1160px; margin:0 auto; padding:40px 24px 56px; }
    header { border-bottom:2px solid var(--accent); padding-bottom:18px; margin-bottom:28px; }
    h1 { margin:0 0 10px; font-size:30px; line-height:1.25; letter-spacing:0; }
    .subtitle { margin:0; color:var(--muted); font-size:15px; }
    section { background:var(--panel); border:1px solid var(--line); border-radius:8px; padding:22px; margin:18px 0; }
    h2 { margin:0 0 14px; font-size:18px; color:var(--accent); }
    table { width:100%; border-collapse:collapse; table-layout:fixed; font-size:14px; background:#fff; }
    th, td { border:1px solid var(--line); padding:10px 12px; text-align:left; vertical-align:top; word-break:break-word; }
    th { background:var(--soft); color:#12384d; font-weight:700; }
    code { background:#eef3f7; border:1px solid #dde7ee; border-radius:5px; padding:1px 5px; font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace; font-size:13px; }
    @media (max-width:860px){ main{padding:28px 14px 40px;} table{display:block; overflow-x:auto;} }
  </style>
</head>
<body>
  <main>
    <header>
      <h1>招投标资料补全与 Excel 交付 Workflow</h1>
      <p class="subtitle">把乙方宝截图、官方平台、企业库和供应商官网统一纳入项目资料补全流程。</p>
    </header>
    <section>
      <h2>流程</h2>
      <table>
        <thead><tr><th>阶段</th><th>动作</th><th>验收标准</th></tr></thead>
        <tbody>
          <tr><td>项目识别</td><td>读取项目名、编号、采购人、中标人、金额、已有附件和截图。</td><td>每个项目至少有一个可检索关键词组合。</td></tr>
          <tr><td>官方源优先</td><td>检索政府采购网、公共资源交易中心、业主自有招采平台。</td><td>关键结论能回到官方链接或附件。</td></tr>
          <tr><td>聚合站补线索</td><td>检索乙方宝、千里马等，记录底部附件、联系人、截图字段。</td><td>截图线索和附件线索分开标注。</td></tr>
          <tr><td>企业库补资质</td><td>查天眼查、企查查、爱企查，补工商、证书、专利、软著、历史中标。</td><td>证书编号未见原文时标为待登录。</td></tr>
          <tr><td>Excel 交付</td><td>按模板写入概览、设备、软件、资质、评分、三家公司和缺口。</td><td>没有未标注来源的关键结论。</td></tr>
        </tbody>
      </table>
    </section>
    <section>
      <h2>项目内 Skill</h2>
      <table>
        <thead><tr><th>Skill</th><th>用途</th></tr></thead>
        <tbody>
          <tr><td><code>skills/tender-source-acquisition/</code></td><td>资料来源获取、扫码登录、附件归档、证据等级和渠道矩阵。</td></tr>
          <tr><td><code>skills/tender-detail-workbook-delivery/</code></td><td>Excel 模板结构、评分反推、覆盖率结论、状态标记和验收清单。</td></tr>
        </tbody>
      </table>
    </section>
  </main>
</body>
</html>
"""
    path.write_text(html, encoding="utf-8")
    return path


def main() -> None:
    print(build_workbook())
    print(build_html())


if __name__ == "__main__":
    main()
