from __future__ import annotations

from pathlib import Path

from openpyxl import load_workbook
from openpyxl.styles import Alignment, Font, PatternFill
from openpyxl.utils import get_column_letter


ROOT = Path(__file__).resolve().parents[1]
EXCEL_PATH = ROOT / "测试用例" / "SaaS_订阅邀请登录_测试功能点.xlsx"
SHEET_NAME = "流程用例-产品解决方案"


COLUMNS = [
    "用例编号",
    "链路模块",
    "用例标题",
    "优先级",
    "入口路径",
    "前置条件",
    "测试数据",
    "流程步骤",
    "预期结果/回读断言",
    "自动化脚本建议",
    "当前实走依据",
]


def lines(items: list[str]) -> str:
    return "\n".join(f"{index}. {item}" for index, item in enumerate(items, 1))


ROWS = [
    [
        "PRODSOL-FLOW-001",
        "产品管理-产品解决方案",
        "进入产品解决方案列表并按条件查询",
        "P0",
        "SaaS-admin -> 产品管理 -> 产品解决方案",
        lines(
            [
                "管理员账号已登录 SaaS-admin",
                "产品解决方案列表存在产品数据",
            ]
        ),
        "产品编号、产品名称、提供方类型、状态、创建时间",
        lines(
            [
                "进入产品管理-产品解决方案",
                "在筛选区输入产品编号或产品名称",
                "选择提供方类型",
                "选择状态",
                "选择创建时间范围",
                "点击查询",
                "点击重置",
            ]
        ),
        lines(
            [
                "列表按筛选条件刷新",
                "返回行的产品编号、产品名称、提供方类型、状态与筛选条件一致",
                "重置后筛选条件清空并恢复默认列表",
                "列表字段展示产品编号、产品名称、提供方类型、状态、产品描述、版本数量、订阅租户、操作",
            ]
        ),
        "封装 navigate_to_product_solution、search_product_solution、reset_product_solution_filters、assert_solution_row。",
        "用户截图展示筛选项：产品编号、产品名称、提供方类型、状态、创建时间、查询、重置。",
    ],
    [
        "PRODSOL-FLOW-002",
        "产品管理-产品解决方案",
        "新建产品后在产品解决方案列表回读",
        "P0",
        "SaaS-admin -> 产品管理 -> 产品解决方案 -> 新建产品",
        lines(
            [
                "管理员账号已登录 SaaS-admin",
                "当前用户有新建产品权限",
            ]
        ),
        "产品名称：自动化产品_{时间戳}；提供方类型：平台或 ISV；产品描述：自动化新建产品",
        lines(
            [
                "进入产品解决方案列表",
                "点击右上角新建产品",
                "按页面要求填写产品基础信息",
                "保存或提交新建产品",
                "返回产品解决方案列表",
                "按产品名称查询新建产品",
            ]
        ),
        lines(
            [
                "新建产品保存成功",
                "列表可查询到新建产品",
                "新建产品状态为待发布",
                "产品编号自动生成",
                "版本数量、订阅租户数按初始状态展示",
            ]
        ),
        "产品名称使用时间戳。新建弹窗或页面字段待继续实走后补全 Page Object。",
        "用户截图展示右上角存在“新建产品”按钮，列表中待发布产品可见。",
    ],
    [
        "PRODSOL-FLOW-003",
        "产品管理-产品解决方案",
        "查看产品详情后返回列表",
        "P1",
        "SaaS-admin -> 产品管理 -> 产品解决方案 -> 查看",
        lines(
            [
                "管理员账号已登录 SaaS-admin",
                "列表存在至少一条产品数据",
            ]
        ),
        "目标产品：任意列表产品",
        lines(
            [
                "进入产品解决方案列表",
                "在目标产品行点击查看",
                "查看产品详情页或详情弹窗",
                "返回产品解决方案列表",
            ]
        ),
        lines(
            [
                "成功打开产品详情",
                "详情中的产品编号、产品名称、提供方类型、状态与列表一致",
                "返回列表后筛选条件和分页状态符合页面实际表现",
            ]
        ),
        "封装 open_solution_detail 和 assert_solution_detail，可作为列表行数据回读基础能力。",
        "用户截图展示每行操作区存在“查看”。",
    ],
    [
        "PRODSOL-FLOW-004",
        "产品管理-产品解决方案",
        "编辑待发布产品后列表回读",
        "P0",
        "SaaS-admin -> 产品管理 -> 产品解决方案 -> 编辑",
        lines(
            [
                "管理员账号已登录 SaaS-admin",
                "目标产品状态为待发布",
                "目标产品操作区存在编辑入口",
            ]
        ),
        "产品描述：自动化编辑描述_{时间戳}",
        lines(
            [
                "进入产品解决方案列表",
                "选择一个待发布产品",
                "点击编辑",
                "修改产品基础信息，例如产品描述",
                "保存编辑",
                "返回列表并查询该产品",
            ]
        ),
        lines(
            [
                "编辑保存成功",
                "列表或详情可回读到更新后的产品信息",
                "产品状态仍符合编辑后的实际状态",
            ]
        ),
        "先覆盖待发布产品编辑；已上架产品编辑入口如果置灰，后续单独记录权限/状态规则。",
        "用户截图展示待发布行存在“编辑”，已上架行编辑为灰色。",
    ],
    [
        "PRODSOL-FLOW-005",
        "产品管理-产品解决方案",
        "待发布产品发布后状态变为已上架",
        "P0",
        "SaaS-admin -> 产品管理 -> 产品解决方案 -> 发布",
        lines(
            [
                "管理员账号已登录 SaaS-admin",
                "目标产品状态为待发布",
                "目标产品已满足发布前置配置",
            ]
        ),
        "目标产品：待发布产品",
        lines(
            [
                "进入产品解决方案列表",
                "选择待发布产品",
                "点击发布",
                "在确认弹窗中确认发布",
                "查询该产品或刷新列表",
            ]
        ),
        lines(
            [
                "发布操作成功",
                "产品状态由待发布变为已上架",
                "操作区从发布切换为下架",
                "已上架产品不可继续普通编辑或版本管理入口按页面实际规则置灰",
            ]
        ),
        "发布依赖配置完整，自动化可优先用已满足配置的测试产品。",
        "用户截图展示待发布行存在发布操作，已上架行展示下架。",
    ],
    [
        "PRODSOL-FLOW-006",
        "产品管理-产品解决方案",
        "已上架产品下架后状态回读",
        "P0",
        "SaaS-admin -> 产品管理 -> 产品解决方案 -> 下架",
        lines(
            [
                "管理员账号已登录 SaaS-admin",
                "目标产品状态为已上架",
                "目标产品操作区存在下架入口",
            ]
        ),
        "目标产品：已上架产品",
        lines(
            [
                "进入产品解决方案列表",
                "选择已上架产品",
                "点击下架",
                "在确认弹窗中确认下架",
                "查询该产品或刷新列表",
            ]
        ),
        lines(
            [
                "下架操作成功",
                "产品状态不再展示为已上架，按页面实际规则回到待发布或已下架",
                "操作区展示发布或上架类入口",
                "订阅租户数等存量数据不被清空",
            ]
        ),
        "状态文案需以后续实走为准；截图中已上架行明确有下架入口。",
        "用户截图展示已上架产品行操作区存在“下架”。",
    ],
    [
        "PRODSOL-FLOW-007",
        "产品管理-产品解决方案",
        "进入产品版本管理并回读版本数量",
        "P0",
        "SaaS-admin -> 产品管理 -> 产品解决方案 -> 版本管理",
        lines(
            [
                "管理员账号已登录 SaaS-admin",
                "目标产品存在版本数量或可维护版本",
            ]
        ),
        "目标产品：列表中版本数量大于等于 0 的产品",
        lines(
            [
                "进入产品解决方案列表",
                "点击目标产品行的版本管理",
                "查看产品版本管理页面或弹窗",
                "新增、编辑或查看版本后返回列表",
            ]
        ),
        lines(
            [
                "产品版本管理入口可正常打开",
                "版本管理中的版本数量与列表版本数量一致或符合新增后的变化",
                "版本保存后返回列表，版本数量正确更新",
            ]
        ),
        "这是产品订阅版本自动化的入口用例，后续可继续拆新增版本、编辑版本、启禁用版本。",
        "用户截图展示每行操作区存在“版本管理”，列表字段有版本数量。",
    ],
    [
        "PRODSOL-FLOW-008",
        "产品管理-产品解决方案",
        "配置菜单后回读菜单绑定",
        "P1",
        "SaaS-admin -> 产品管理 -> 产品解决方案 -> 配置菜单",
        lines(
            [
                "管理员账号已登录 SaaS-admin",
                "目标产品操作区存在配置菜单入口",
            ]
        ),
        "目标菜单：按页面已有菜单资源选择",
        lines(
            [
                "进入产品解决方案列表",
                "点击目标产品行的配置菜单",
                "在配置菜单页面或弹窗选择菜单",
                "保存配置",
                "重新进入配置菜单回读",
            ]
        ),
        lines(
            [
                "配置菜单页面或弹窗正常打开",
                "菜单选择保存成功",
                "重新进入后菜单勾选状态与保存结果一致",
            ]
        ),
        "和应用版本资源绑定类似，自动化重点是勾选、保存、重新进入回读。",
        "用户截图展示每行操作区存在“配置菜单”。",
    ],
    [
        "PRODSOL-FLOW-009",
        "产品管理-产品解决方案",
        "产品打包入口可打开并完成基础回读",
        "P1",
        "SaaS-admin -> 产品管理 -> 产品解决方案 -> 打包",
        lines(
            [
                "管理员账号已登录 SaaS-admin",
                "目标产品操作区存在打包入口",
            ]
        ),
        "目标产品：任意可打包产品",
        lines(
            [
                "进入产品解决方案列表",
                "点击目标产品行的打包",
                "查看打包页面或弹窗",
                "按页面实际能力执行打包或取消",
            ]
        ),
        lines(
            [
                "打包入口可正常打开",
                "打包页面展示目标产品信息",
                "取消或关闭后可回到列表",
                "如果执行打包，页面出现成功提示或任务记录",
            ]
        ),
        "当前先记录入口流程；打包参数和结果等后续实走后再补细。",
        "用户截图展示每行操作区存在“打包”。",
    ],
]


def style_sheet(ws) -> None:
    header_fill = PatternFill("solid", fgColor="305496")
    header_font = Font(color="FFFFFF", bold=True)
    for cell in ws[1]:
        cell.fill = header_fill
        cell.font = header_font
        cell.alignment = Alignment(horizontal="center", vertical="center", wrap_text=True)

    widths = [18, 28, 34, 10, 42, 42, 36, 52, 52, 48, 42]
    for index, width in enumerate(widths, 1):
        ws.column_dimensions[get_column_letter(index)].width = width

    for row in ws.iter_rows(min_row=2):
        for cell in row:
            cell.alignment = Alignment(vertical="top", wrap_text=True)
    ws.freeze_panes = "A2"
    ws.auto_filter.ref = ws.dimensions


def main() -> None:
    wb = load_workbook(EXCEL_PATH)
    if SHEET_NAME in wb.sheetnames:
        del wb[SHEET_NAME]
    ws = wb.create_sheet(SHEET_NAME, 1)
    ws.append(COLUMNS)
    for row in ROWS:
        ws.append(row)
    style_sheet(ws)
    wb.save(EXCEL_PATH)
    print(f"updated={EXCEL_PATH}")
    print(f"sheet={SHEET_NAME}")
    print(f"cases={len(ROWS)}")


if __name__ == "__main__":
    main()
