from __future__ import annotations

from dataclasses import dataclass
from collections import Counter


STATUS_DONE = "已接入"
STATUS_PARTIAL = "部分接入"
STATUS_TODO = "待接入"


@dataclass(frozen=True)
class WaterworksProgram:
    chapter: str
    section: str
    name: str
    book_page: int
    status: str = STATUS_TODO
    mapped_module: str = ""
    note: str = ""

    @property
    def pdf_page_hint(self) -> int:
        # The scanned PDF has 11 front-matter pages before printed page 1.
        return self.book_page + 11


def _p(
    chapter: str,
    section_no: int,
    name: str,
    page: int,
    status: str = STATUS_TODO,
    mapped_module: str = "",
    note: str = "",
) -> WaterworksProgram:
    return WaterworksProgram(
        chapter=chapter,
        section=f"第{section_no}节",
        name=name,
        book_page=page,
        status=status,
        mapped_module=mapped_module,
        note=note,
    )


WATERWORKS_PROGRAMS: tuple[WaterworksProgram, ...] = (
    _p("第一章 灌区灌溉工程计算程序", 1, "引水灌溉灌水模数计算", 7, STATUS_DONE, "灌溉引水与渠首水位", "已按书中q=m/(8.64T)接入灌水模数及作物净流量计算。"),
    _p("第一章 灌区灌溉工程计算程序", 2, "灌溉引水流量计算", 8, STATUS_DONE, "灌溉引水与渠首水位", "已接入续灌Q净、Q毛及轮灌设计流量计算，并按书中例题校核。"),
    _p("第一章 灌区灌溉工程计算程序", 3, "灌区渠首水位计算", 10, STATUS_DONE, "灌溉引水与渠首水位", "已接入渠首设计水位公式，可逐段输入渠道比降和长度累加水头损失。"),
    _p("第一章 灌区灌溉工程计算程序", 4, "提水灌溉设计流量计算", 11, STATUS_DONE, "提水泵站与压力管道", "已接入典型年最大毛灌溉用水量法和设计灌水率法。"),
    _p("第一章 灌区灌溉工程计算程序", 5, "提灌站压力管道水力计算", 12, STATUS_DONE, "提水泵站与压力管道", "已接入钢管内径、最小管壁厚度和通气孔面积计算。"),
    _p("第一章 灌区灌溉工程计算程序", 6, "水泵设计扬程计算", 13, STATUS_DONE, "提水泵站与压力管道", "已接入净扬程、总水头损失和设计扬程计算。"),
    _p("第一章 灌区灌溉工程计算程序", 7, "水泵安装高程计算", 16, STATUS_DONE, "提水泵站与压力管道", "已接入按当地大气压、汽化压头、入口流速和吸水管损失修正的允许安装高程。"),
    _p("第一章 灌区灌溉工程计算程序", 8, "水泵总功率、效率以及比速计算", 18, STATUS_DONE, "提水泵站与压力管道", "已接入水泵总功率、有效功率、效率和比速计算。"),
    _p("第一章 灌区灌溉工程计算程序", 9, "站用主变压器容量计算", 20, STATUS_DONE, "提水泵站与压力管道", "已接入多型号电动机负荷、照明负荷和主变容量计算。"),
    _p("第二章 输水渠道工程计算程序", 1, "进水闸合理的引水角度计算", 22, STATUS_DONE, "渠道附属与安全校核", "已按δ=arccos(v0/v1)接入，并按书中v0=1.1、v1=1.2例题校核。"),
    _p("第二章 输水渠道工程计算程序", 2, "明渠水力计算", 23, STATUS_DONE, "渠道水力计算", "已按书中均匀流公式接入梯形/矩形渠道面积、湿周、水力半径、谢才系数、流速、流量、渠岸超高和弯道半径。"),
    _p("第二章 输水渠道工程计算程序", 3, "临界不冲流速计算", 25, STATUS_DONE, "渠道附属与安全校核", "已接入土渠vp=A*R^0.4和砌石护面vf公式，按图2-3例题校核。"),
    _p("第二章 输水渠道工程计算程序", 4, "不淤流速计算", 26, STATUS_DONE, "渠道附属与安全校核", "已按vcd=C0*sqrt(Q)接入，并按Q=10.60、C0=0.20例题校核。"),
    _p("第二章 输水渠道工程计算程序", 5, "临界水深计算", 27, STATUS_DONE, "渠道水力计算", "已按矩形明渠和梯形明渠临界流条件接入临界水深、过水面积、水面宽和临界判据。"),
    _p("第二章 输水渠道工程计算程序", 6, "水力最佳断面计算", 28, STATUS_DONE, "渠道水力计算", "已按书中矩形、梯形水力最佳断面公式接入最佳水深、底宽和流量复算。"),
    _p("第二章 输水渠道工程计算程序", 7, "最佳实用经济断面计算", 30, STATUS_DONE, "渠道附属与安全校核", "已按面积偏离系数a与水力最佳断面关系式接入，默认采用书中浅宽经济断面根。"),
    _p("第二章 输水渠道工程计算程序", 8, "渗漏损失量计算", 31, STATUS_DONE, "渠道附属与安全校核", "已接入衬砌渠道和无衬砌渠道渗漏损失公式，并按书中例题校核。"),
    _p("第二章 输水渠道工程计算程序", 9, "渠道侧墙稳定分析计算", 33, STATUS_DONE, "渠道结构与纵断面", "已按侧墙土压力、水压力、弯矩、受弯配筋和含筋率公式接入，并按书中例题校核。"),
    _p("第二章 输水渠道工程计算程序", 10, "复式断面渠道水力计算", 38, STATUS_DONE, "渠道结构与纵断面", "已接入复式断面整体法、分块法、综合糙率、流量复算和按目标流量反求水深。"),
    _p("第二章 输水渠道工程计算程序", 11, "U形断面渠道水力计算", 40, STATUS_DONE, "渠道附属与安全校核", "已按U形断面面积、湿周、水力半径和曼宁流量公式接入，可按h/B试算尺寸。"),
    _p("第二章 输水渠道工程计算程序", 12, "钢筋总量及含筋率计算", 41, STATUS_DONE, "渠道附属与安全校核", "已按书中根数、弯钩长度、总长、总重和含筋率公式接入渠道例题模板。"),
    _p("第二章 输水渠道工程计算程序", 13, "渠道纵断面设计计算", 43, STATUS_DONE, "渠道结构与纵断面", "已接入渠底、最低水位、设计水位、加大水位、渠顶高程和挖填深度逐桩计算。"),
    _p("第三章 防洪堤防工程计算程序", 1, "河道流量估算", 47, STATUS_DONE, "堤防工程书中程序", "已按书中平均水深代替水力半径的曼宁简化式接入河道流速和流量估算，并按图3-1例题校核。"),
    _p("第三章 防洪堤防工程计算程序", 2, "河道治导线宽度计算", 47, STATUS_DONE, "堤防工程书中程序", "已按B=Qn/(H^(5/3)*sqrt(J))接入，并按图3-2例题校核。"),
    _p("第三章 防洪堤防工程计算程序", 3, "堤防河道水面线推求计算", 48, STATUS_DONE, "能量方程水位 / HEC标准步法", "已接入单断面能量方程与多断面HEC标准步法，可输出逐断面水面线结果。"),
    _p("第三章 防洪堤防工程计算程序", 4, "超高和堤顶高程计算", 50, STATUS_DONE, "堤防工程书中程序", "已接入曼宁反算设计水深、波浪爬高、安全超高和堤身高度计算，并按例题3-1校核。"),
    _p("第三章 防洪堤防工程计算程序", 5, "堤身护坡厚度计算", 52, STATUS_DONE, "堤防工程书中程序", "已接入块石护坡厚度和块石长宽高稳定球径计算，并按例题3-2、3-3校核。"),
    _p("第三章 防洪堤防工程计算程序", 6, "堤基冲刷深度计算", 53, STATUS_DONE, "堤防工程书中程序", "已接入斜冲护岸、平行护岸、弯道最大冲深和锁坝局部冲深公式，并按书中例题校核。"),
    _p("第三章 防洪堤防工程计算程序", 7, "丁坝设计计算", 57, STATUS_DONE, "堤防工程书中程序", "已接入短丁坝主流宽度、丁坝长度和丁坝间距计算，并按图3-8例题校核。"),
    _p("第四章 水力发电工程计算程序", 1, "水电站水能计算", 58, STATUS_DONE, "水电站机电与压力管道", "已接入水电站出力、水轮机输入功率和输出功率计算，并按例题4-1校核。"),
    _p("第四章 水力发电工程计算程序", 2, "装机容量的计算与选择", 59, STATUS_DONE, "水电站机电与压力管道", "已接入保证出力倍率法、年利用小时法和备选装机经济比较，并按例题4-2校核。"),
    _p("第四章 水力发电工程计算程序", 3, "管道直径和管壁厚度计算", 63, STATUS_DONE, "水电站机电与压力管道", "已接入彭德舒公式、经济流速法和钢管壁厚校核，并按例题4-3校核。"),
    _p("第四章 水力发电工程计算程序", 4, "管道进口的最小淹没水深计算", 64, STATUS_DONE, "水电站机电与压力管道", "已接入压力管道进口最小淹没水深计算，并按例题4-4校核。"),
    _p("第四章 水力发电工程计算程序", 5, "通气管面积（直径）计算", 65, STATUS_DONE, "水电站机电与压力管道", "已接入通气孔面积、通气管直径和允许负压计算，并按图4-6例题校核。"),
    _p("第四章 水力发电工程计算程序", 6, "压力管道水锤压力计算", 66, STATUS_DONE, "水电站机电与压力管道", "已接入水锤传播速度、直接/间接水锤判断、水击压强和允许值复核，并按例题4-5校核。"),
    _p("第四章 水力发电工程计算程序", 7, "压力管道水头损失计算", 68, STATUS_DONE, "水电站机电与压力管道", "已接入雷诺数、沿程损失、局部损失和总水头损失计算，并按例题4-6校核。"),
    _p("第四章 水力发电工程计算程序", 8, "压力管道临界外压力计算", 70, STATUS_DONE, "水电站机电与压力管道", "已接入明钢管和埋钢管临界外压计算，并按图4-9例题校核。"),
    _p("第四章 水力发电工程计算程序", 9, "架空输电线路导线截面计算", 70, STATUS_DONE, "水电站机电与压力管道", "已接入经济电流密度截面、导线型号推荐和持续允许电流校验，并按例题4-7校核。"),
    _p("第四章 水力发电工程计算程序", 10, "主变压器总容量计算", 72, STATUS_DONE, "水电站机电与压力管道", "已接入主变压器总容量计算和标准容量合理性判断，并按图4-11例题校核。"),
    _p("第四章 水力发电工程计算程序", 11, "负荷预测", 73, STATUS_DONE, "水电站机电与压力管道", "已接入综合需用系数法、平均增长率法、供电最大负荷和发电最大负荷计算，并按图4-12例题校核。"),
    _p("第五章 水库蓄水工程计算程序", 1, "洪峰流量和洪水总量计算", 76, STATUS_DONE, "水库蓄水书中程序", "已接入经验法洪峰流量、山洪洪峰和一次洪水总量计算，并按例题5-1及图5-2校核。"),
    _p("第五章 水库蓄水工程计算程序", 2, "水库淤积库容估算", 77, STATUS_DONE, "水库蓄水书中程序", "已接入多年平均输沙量和水库淤积库容估算，并按例题5-2校核。"),
    _p("第五章 水库蓄水工程计算程序", 3, "水库年运用调节计算", 78, STATUS_DONE, "水库蓄水书中程序", "已接入一次运用年调节月过程计算，并按例题5-3校核。"),
    _p("第五章 水库蓄水工程计算程序", 4, "土石坝坝顶超高计算", 81, STATUS_DONE, "水库蓄水书中程序", "已接入坝顶超高、风壅、水位组合控制计算，并按例题5-4校核。"),
    _p("第五章 水库蓄水工程计算程序", 5, "土石坝外轮廓尺寸计算", 82, STATUS_DONE, "水库蓄水书中程序", "已接入坝体高度、坝顶宽度、坝底宽度计算，并与坝顶超高联动。"),
    _p("第五章 水库蓄水工程计算程序", 6, "大坝护坡厚度计算", 84, STATUS_DONE, "水库蓄水书中程序", "已接入砌石护坡石块直径和护坡厚度计算，并按例题5-5校核。"),
    _p("第五章 水库蓄水工程计算程序", 7, "坝基悬挂帷幕深度计算", 85, STATUS_DONE, "水库蓄水书中程序", "已接入兰肯公式S=H/3+C，并与坝体外轮廓例题联动校核。"),
    _p("第五章 水库蓄水工程计算程序", 8, "水库库容计算", 86, STATUS_DONE, "水库蓄水书中程序", "已接入断面法分层柱体库容和底部锥体库容计算，并按例题5-6校核。"),
    _p("第五章 水库蓄水工程计算程序", 9, "平面闸门的启闭力计算", 87, STATUS_DONE, "水库蓄水书中程序", "已接入平面闸门支承摩阻、止水摩阻、启门力和闭门力计算，并按例题5-7校核。"),
    _p("第五章 水库蓄水工程计算程序", 10, "水库调洪计算（演算）", 89, STATUS_DONE, "水库调洪演算", "已按等水面Modified Puls法实现入库、库容、泄量和水位过程。"),
    _p("第六章 水工建筑物水力计算程序", 1, "水闸水力计算", 95, STATUS_DONE, "水工建筑物书中程序", "已接入水闸专用开敞流宽度、闸室长度、门槽宽度和槽深计算，并按例题6-1校核。"),
    _p("第六章 水工建筑物水力计算程序", 2, "溢流堰水力计算", 97, STATUS_DONE, "堰流公式水位", "宽顶堰、实用堰、薄壁堰和孔口式已接入。"),
    _p("第六章 水工建筑物水力计算程序", 3, "正槽式溢洪道泄槽水力计算", 99, STATUS_DONE, "水工建筑物书中程序", "已接入泄槽正常水深、掺气水深和边墙高度计算，并按例题6-3校核。"),
    _p("第六章 水工建筑物水力计算程序", 4, "消力池和海漫水力计算", 101, STATUS_DONE, "水工建筑物书中程序", "已接入水跃共轭水深、消力池深度长度、海漫和防冲槽校核，并按例题6-4校核。"),
    _p("第六章 水工建筑物水力计算程序", 5, "陡坡水力计算", 104, STATUS_DONE, "水工建筑物书中程序", "已接入陡坡入口宽度、渐变长度、泄槽水深和消能联算，并按例题6-5校核。"),
    _p("第六章 水工建筑物水力计算程序", 6, "跌水水力计算", 108, STATUS_DONE, "水工建筑物书中程序", "已接入单级跌水入口宽度、消力池长度和粗略跌坎专项计算，并按例题6-6校核。"),
    _p("第六章 水工建筑物水力计算程序", 7, "引水渡槽水力计算", 112, STATUS_DONE, "水工建筑物书中程序", "已接入渡槽槽身水深、速度、进出口水头损失、槽底高程和超高计算，并按例题6-8校核。"),
    _p("第六章 水工建筑物水力计算程序", 8, "倒虹吸管水力计算", 117, STATUS_DONE, "水工建筑物书中程序", "已接入倒虹吸管径、水头损失、管壁厚度、进出口池和下游渠底高程计算，并按例题6-9校核。"),
    _p("第六章 水工建筑物水力计算程序", 9, "桥孔水力计算", 121, STATUS_DONE, "水工建筑物书中程序", "已接入桥孔过流面积、总净宽、设计净高和过桥流量复核，并按例题6-10校核。"),
    _p("第六章 水工建筑物水力计算程序", 10, "隧洞水力计算", 123, STATUS_DONE, "水工建筑物书中程序", "已接入有压隧洞、无压城门洞形和无压圆形隧洞计算，并按例题6-11校核。"),
    _p("第六章 水工建筑物水力计算程序", 11, "涵洞水力计算", 125, STATUS_DONE, "水工建筑物书中程序", "已接入无压和有压箱涵流量、底宽、高度、水深计算，并按例题6-12校核。"),
    _p("第六章 水工建筑物水力计算程序", 12, "侧堰水力计算", 126, STATUS_DONE, "水工建筑物书中程序", "已接入锐角分水和直角分水侧堰流量、宽度计算，并按例题6-13校核。"),
)


def waterworks_status_summary() -> dict[str, int]:
    counts = Counter(program.status for program in WATERWORKS_PROGRAMS)
    return {status: counts.get(status, 0) for status in (STATUS_DONE, STATUS_PARTIAL, STATUS_TODO)}


def waterworks_program_rows() -> list[list[str]]:
    return [
        [
            program.chapter,
            program.section,
            program.name,
            str(program.book_page),
            str(program.pdf_page_hint),
            program.status,
            program.mapped_module or "-",
        ]
        for program in WATERWORKS_PROGRAMS
    ]


def waterworks_program_markdown(program: WaterworksProgram) -> str:
    note = program.note or "尚未接入，需从扫描PDF逐页提取公式、参数说明、例题和校核结果后再开发。"
    mapped = program.mapped_module or "暂未对应现有模块"
    return (
        f"{program.chapter}\n\n"
        f"{program.section}：{program.name}\n\n"
        f"书内页码：{program.book_page}；PDF约第 {program.pdf_page_hint} 页。\n\n"
        f"接入状态：{program.status}\n\n"
        f"对应软件模块：{mapped}\n\n"
        f"说明：{note}\n\n"
        "后续接入要求：逐项补齐参数来源、计算公式、单位检查、示例验算、结果表格和导出格式。"
    )
