"""
按招标文件类型（工程 / 服务 / 货物）区分的章节正文生成提示词模板。
与 modules.generator.BID_WRITING_SYSTEM 配合使用；自称以系统铁律为准，统一用「我方」。
"""
import re
from typing import Optional

VALID_TENDER_KINDS = frozenset({'engineering', 'service', 'goods'})

DEFAULT_WORD_COUNT_SPEC = (
    '- 一般小节：不少于 2000 字；核心技术/重点评分章节：不少于 4000 字\n'
    '- 字数须由实质方案内容支撑，禁止用重复项目背景或复述招标要求凑字数\n'
    '- 有实质细节的展开写，原则性描述可简洁处理；通过流程、节点、比选、管控展开满足篇幅'
)

TENDER_KIND_CLASSIFY = """\
你是一名招标文件分类专家。根据以下招标文件摘录，判断本项目技术标书应采用的「写作模板类型」。

只输出以下三个英文单词之一，不要输出任何其他文字、标点、换行或解释：
engineering
service
goods

含义：
- engineering：工程施工类（建筑、市政、公路、水利、装修、园林、拆除等，以现场施工组织、工艺、机械、进度网络为主）
- service：服务类（咨询、设计、监理、运维、物业、保洁、餐饮配送、培训、安保、技术服务等，以人力/智力交付、流程、SLA 为主）
- goods：货物类（设备、材料、车辆、家具、软硬件供货等，以产品规格、供货、质保、验收为主；含附带安装指导仍以供货为主可归此类）

判定规则：
若主要为施工安装且涉及土建/结构/施工机械与工期，归为 engineering。
若主要为服务过程、人员驻场、响应时效与服务质量体系，归为 service。
若主要为产品技术规格、供货批次、出厂检验与到货验收，归为 goods。
若施工与供货并重，以现场施工量与工期为主则 engineering，以设备物资交付为主则 goods。

【招标文件摘录】
{excerpt}
"""


def get_tender_kind_classify_prompt(excerpt: str) -> str:
    return TENDER_KIND_CLASSIFY.replace('{excerpt}', excerpt or '')


def parse_tender_kind_response(response: str) -> str:
    """从模型返回中解析出 engineering / service / goods，失败则 engineering。"""
    if not response:
        return 'engineering'
    tokens = re.sub(r'[^a-zA-Z]+', ' ', response).lower().split()
    for w in tokens:
        if w in VALID_TENDER_KINDS:
            return w
    low = response.lower()
    for k in ('engineering', 'service', 'goods'):
        if k in low:
            return k
    return 'engineering'


def normalize_tender_kind(kind: Optional[str]) -> str:
    k = (kind or '').strip().lower()
    return k if k in VALID_TENDER_KINDS else 'engineering'


# ── 工程类 ───────────────────────────────────────────────────────────────

SECTION_DETAILS_ENGINEERING = """\
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- 角色：资深工程施工组织设计专家
- 任务：撰写通用型工程施工组织设计技术章节

【核心定位】
- 通用施工模板，适用于建筑、市政、公路、水利等工程施工类项目
- 聚焦：施工方案、工艺方法、机械设备、进度计划、质量安全控制
- 正文为可直接提交的成稿语句：凡招标文件概要或工程量清单摘要已给出的工程量、地质、工期、指标等，可如实融入叙述；未给出的具体数值、型号、台数、吨位等，一律用通顺的中文概括表达（如"相应规格""与进度及作业面相匹配的台套""符合设计及规范要求的能级"），不得使用方括号或待填项留白

【内容特征】
- 施工工艺描述到"方法层面"；可引用规范条文名称或编号（如"应符合JTG/T 3610要求"）；无依据处不写臆造数字
- 设备与资源配置：写清设备类别与用途，用"按工况与设计要求选配相应规格与数量""满足流水作业与峰值强度需要"等概括句式，禁止出现"[型号][数量]台"类占位
- 进度计划使用相对阶段（"施工准备期"、"主体施工期"）而非具体日期
- 技术措施可提供多方案比选，用"视地质与水文条件选用适宜工艺"等自然语言衔接现场条件，禁止方括号待填

【未定参数的写法（替代一切占位符）】
- 工程规模与结构：用"本工程相应单体与线路区段""按设计结构形式与跨度条件"等概括，不罗列未提供的具体数字
- 技术参数：已见于招标/清单的写具体值；未见者写"按设计强度等级与验收标准执行""压实度与分层厚度满足规范及设计要求"
- 机械与劳动力：写"配置满足峰值强度与关键线路需要的机械组合""劳动力按施工阶段动态投入并保持关键岗位持证齐备"
- 时间节点：写"在招标工期内划分准备、主体、收尾阶段并设置可控里程碑"，无具体日历则不用臆造周数

【行文规范】
- 自称统一用「我方」，禁用「我们」「本公司」
- 招标人称「招标方」或「建设单位」
- 禁止前导句和AI套话（综上所述、高度重视等）
- 列举用(1)(2)(3)，禁用"首先其次"
- 纯文本输出，段落间空行分隔

【防过拟合约束】
- 不绑定具体地名与局地气候细节，改为"结合项目环境与季节特点采取针对性措施"
- 不绑定特定施工方法（如不说"必须用旋挖钻"，改为"根据地质选用适宜桩基工艺"）
- 使用弹性表述："按设计要求"、"视现场情况"、"符合规范规定"

【字数要求】
{word_count_spec}
- 通过展开多方案比选、详细工艺流程、管控节点来满足篇幅

【输入】
- 招标文件概要：{summary}
- 标书目录：{outline}
- 子小节标题：{subsection_title}

直接输出正文，不含标题和解释。"""


# ── 服务类 ───────────────────────────────────────────────────────────────

SECTION_DETAILS_SERVICE = """\
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- 角色：资深服务方案架构师
- 任务：撰写通用型服务项目实施方案

【核心定位】
- 通用服务模板，适用于咨询服务、运维服务、技术服务、物业管理、培训服务等
- 聚焦：服务方案、实施流程、人员配置、质量保障、响应机制、服务标准
- 严禁出现工程施工技术参数（如混凝土标号、压实度等）
- 正文为成稿：招标/采购文件已载明的服务范围、人数、响应时限、到场要求等可如实写入；未载明的不得用方括号待填，改用"按采购文件与服务等级要求配置""满足驻场与高峰时段人力需要""建立分级响应与升级机制"等概括表述写清含义

【内容特征】
- 服务流程：按"接收需求→分析评估→方案制定→实施执行→验收交付→持续改进"框架展开
- 人员配置：强调专业资质与岗位角色齐全，用"配备满足本项目服务范围与关键岗位持证要求的人员力量""项目经理及骨干具备相应执业或认证资格"等完整句子，禁止"[资质][岗位][数量]名"式占位
- 质量保障：使用服务体系标准（如ISO 9001、ITIL、ITSS）而非工程规范
- 响应机制：写清"受理—分派—处理—回访/关闭"闭环；时限已见于招标文件的写具体值，未见者写"按招标文件及行业通行服务等级划分响应与处理时限，并设置升级与应急通道"
- 服务标准：可引用SLA框架，用自然语言描述指标层级与考核方式，禁止用方括号代替指标

【未定参数的写法】
- 服务范围与对象：用"采购文件约定的服务内容与交付边界""服务对象规模与业务场景按项目实际确定"等概括
- 人员与资源：用"与峰值并发与服务等级相匹配的人力与工具配置"
- 场地与备件：用"按需设置服务场所与备件储备，保障连续性与可用性目标"

【行文规范】
- 自称统一用「我方」，禁用「我们」「本公司」
- 招标人称「招标方」「采购人」或「甲方」
- 禁止前导句和AI套话
- 列举用(1)(2)(3)，禁用"首先其次"
- 纯文本输出，段落间空行分隔
- 强调"服务承诺"与"保障措施"的可执行性，避免空泛

【防过拟合约束】
- 不预设具体行业细节（如不说"针对医院HIS系统"，改为"针对采购人业务系统与数据环境"）
- 服务方案提供"标准模块+可选配置"结构（"基础服务包包含...，增值服务可选..."）
- 使用"结合采购人行业特点与监管要求""参照同类项目成熟实践"等弹性表述

【内容禁区】
- 禁止出现：施工工艺、材料设备技术参数、工程量计算、施工机械配置
- 禁止出现：建筑结构、土木工程技术措施

【字数要求】
{word_count_spec}
- 通过详细描述服务流程节点、人员职责分工、质量检查点、应急预案来满足篇幅

【输入】
- 招标文件概要：{summary}
- 标书目录：{outline}
- 子小节标题：{subsection_title}

直接输出正文，不含标题和解释。"""


# ── 货物类 ───────────────────────────────────────────────────────────────

SECTION_DETAILS_GOODS = """\
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- 角色：资深供货方案技术专家
- 任务：撰写通用型货物采购项目技术响应方案

【核心定位】
- 通用供货模板，适用于设备采购、材料供应、系统集成、软件采购等
- 聚焦：产品技术规格、供货方案、质量保证、安装调试（如有）、售后服务
- 正文为成稿：采购文件、技术规范书或清单中已列明的型号、数量、指标、交货期、质保期等可如实响应；未列明的不得臆造优于招标的数字，亦不得用方括号待填；用"不低于采购文件对应条款""满足招标文件列明的性能与符合性要求""供货批次与到货节奏与现场安装计划相衔接"等概括语言写全句

【内容特征】
- 技术规格：按"指标项—符合性说明"展开；已给出阈值的照写；未给出的写"满足招标文件技术指标与检测方法要求""与同类应用场景主流水平相当且不降低实质性响应"
- 产品描述：强调功能特性、可靠性与标准符合性，避免绑定特定品牌（除非招标文件指定）
- 供货方案：分阶段描述（签约后组织生产或备货、出厂检验、运输与到货验收）；具体天数仅在有依据时写出，否则用"按合同与采购文件约定的供货周期执行"
- 质量保障：强调"出厂检验+第三方检测（如要求）+质保期服务"分层体系
- 售后服务：写清质保责任边界、备件与技术支持渠道；时长以招标为准，无则写"按采购文件及国家相关规定执行"

【未定参数的写法】
- 性能与容量：用"满足采购文件规定的处理能力/精度/兼容性等关键指标"
- 数量与批次：用"与合同清单及现场需求匹配的供货批次与配套件配置"
- 服务时效：用"建立可追踪的报修、响应与闭环机制，时限不低于采购文件要求"

【行文规范】
- 自称统一用「我方」，禁用「我们」「本公司」
- 招标人称「招标方」「采购人」或「甲方」
- 禁止前导句和AI套话
- 列举用(1)(2)(3)，禁用"首先其次"
- 纯文本输出，段落间空行分隔
- 技术描述客观准确，避免夸大（不用"最先进"、"行业第一"，改用"符合国家标准或采购文件引用标准的要求""满足招标文件实质性条款")

【防过拟合约束】
- 不绑定特定品牌（如不说"采用华为服务器"，改为"提供满足采购文件性能与安全要求的服务器设备"）
- 无具体数值依据时，不写虚构的"≥某数值"，改为对符合性与可检测性的承诺
- 供货方案考虑多种交付场景（国内供货、进口设备、定制生产等）时，用自然语言比较路径优劣与适用条件

【内容禁区】
- 禁止出现：施工组织、安装工艺（除非含安装服务）、土建工程、人员现场施工配置
- 禁止出现：工程管理流程（如施工进度网络图）

【字数要求】
{word_count_spec}
- 通过详细展开技术参数说明、供货流程节点、质量检验程序、售后服务细则来满足篇幅

【输入】
- 招标文件概要：{summary}
- 标书目录：{outline}
- 子小节标题：{subsection_title}

直接输出正文，不含标题和解释。"""


def build_section_detail_prompt(
    kind: str,
    summary: str,
    outline: str,
    title: str,
    word_count_spec: str = '',
    boq_summary: str = '',
) -> str:
    k = normalize_tender_kind(kind)
    if k == 'service':
        base = SECTION_DETAILS_SERVICE
    elif k == 'goods':
        base = SECTION_DETAILS_GOODS
    else:
        base = SECTION_DETAILS_ENGINEERING

    wc = word_count_spec.strip() or DEFAULT_WORD_COUNT_SPEC
    text = base.format(
        word_count_spec=wc,
        summary=summary or '（未提供）',
        outline=outline or '（未提供）',
        subsection_title=title or '',
    )
    text += (
        '\n\n【须同步遵守的全局写作禁忌】'
        '禁止复述招标要求后再作答；禁止各章重复工程量数字与项目背景；'
        '禁止无依据将参数写成优于招标文件；字数不得仅靠套话堆砌；'
        '禁止使用方括号、「待填」「TBD」等表示未完稿字段（如[型号][数量][数值]）；'
        '未定信息须写成通顺的概括性中文整句。'
        '若本任务提示词末尾另有「图示/表格」专用输出规范，其中的结构化标记按该规范执行，'
        '不视为待填占位。'
    )

    if boq_summary.strip():
        text += (
            '\n\n- 工程量清单关键信息（写作时按需引用清单中已有数量与单位，勿无故复读；'
            '清单未列明的分项用概括性施工组织语言描述，禁止使用方括号待填项）：\n'
            + boq_summary.strip()
        )
    return text


# 对话模式：按类型追加的系统说明片段（与 app.py 中基础说明拼接）
CHAT_KIND_INSTRUCTION = {
    'engineering': (
        '\n【本模板类型：工程施工】'
        '侧重施工组织、工艺与质量安全；未在招标文件或清单中出现的具体型号、台数、吨位等'
        '用概括性中文表述写清，禁止使用方括号待填；勿虚构优于招标的规格。'
    ),
    'service': (
        '\n【本模板类型：服务】'
        '侧重服务流程、人员与SLA；人数、时限等以招标/采购文件为准，无则概括表述，禁止方括号待填；'
        '禁止大段写混凝土标号、压实度、施工机械等工程参数。'
    ),
    'goods': (
        '\n【本模板类型：货物供货】'
        '侧重规格、供货、检验与质保；指标与交期以采购文件为准，无则概括表述，禁止方括号待填；'
        '禁止写施工组织与土建；勿绑定未指定的品牌。'
    ),
}
