"""把网关平台导出的「超集」xls，按本次改动接口的 routerCode 精确删行，得到一份恰好的 xls。
只删行、保留表头，不改任何单元格内容；删完回验「不多不少」。

依赖：pip install xlrd xlwt   （xlrd 读旧版 .xls，xlwt 写 .xls）

用法：
  python trim_gateway_xls.py <超集.xls> <输出.xls> <routerCode1> <routerCode2> ...
说明：
  - <routerCodeN> = 本次改动接口的「网关唯一标识」，需与网关里存的**完全一致**（精确相等，非子串）。
  - 导出的 xls 第 1 列就是 网关唯一标识(routerCode)，脚本按它删行。
  - 输出若与目标集合不一致（多/少），脚本报错退出，不产出可疑文件。
"""
import sys
import xlrd
import xlwt

if len(sys.argv) < 4:
    print("用法: python trim_gateway_xls.py <超集.xls> <输出.xls> <routerCode...>")
    sys.exit(2)

src, out = sys.argv[1], sys.argv[2]
changed = set(sys.argv[3:])          # 本次改动接口的 routerCode 精确集合 R

sh = xlrd.open_workbook(src).sheet_by_index(0)
ncols = sh.ncols
code_col = 0                          # 第 1 列 = 网关唯一标识(routerCode)

wb = xlwt.Workbook(encoding="utf-8")
ws = wb.add_sheet("Sheet1")
for c in range(ncols):               # 表头原样
    ws.write(0, c, sh.cell_value(0, c))

kept, seen = 0, set()
for r in range(1, sh.nrows):
    code = sh.cell_value(r, code_col)
    if code in changed:              # 精确相等
        kept += 1
        seen.add(code)
        for c in range(ncols):
            ws.write(kept, c, sh.cell_value(r, c))
wb.save(out)

missing = changed - seen             # R 里但超集没有 → 该接口没有此类型网关配置（正常，不编造）
# 回验：重新读输出，确认恰好 == 命中的集合
vb = xlrd.open_workbook(out).sheet_by_index(0)
got = {vb.cell_value(r, code_col) for r in range(1, vb.nrows)}
expect = changed & seen

print("目标接口 R = %d，超集命中 = %d，输出行数 = %d" % (len(changed), len(seen), vb.nrows - 1))
if missing:
    print("⚠️ R 中这些接口在超集里没有对应网关配置（属正常，不要编造）：", sorted(missing))
if got != expect:
    print("❌ 回验失败：输出与目标不一致！ 多余=", sorted(got - expect), " 缺失=", sorted(expect - got))
    sys.exit(1)
print("✅ 回验通过：输出恰好 = 本次改动且有网关配置的接口，不多不少。文件：", out)
