#!/usr/bin/env python3
"""Acceptance gates for reporting the Coze migration test results correctly."""

from __future__ import annotations

import unittest
from pathlib import Path

from openpyxl import load_workbook


ROOT = Path(__file__).resolve().parents[1]
PROJECT_XLSX = ROOT / "reports" / "coze-migration-test-results.xlsx"
DESKTOP_XLSX = Path("/Users/jack/Desktop/测试文档-Dify-Coze测试结果/Dify-Coze-测试结果对比.xlsx")
ORIGINAL_REPORT = ROOT / "coze" / "converted" / "original-structure-migration-report.md"
PLATFORM_REPORT = ROOT / "reports" / "coze-original-structure-v1-platform-test.md"
REPLAY_REPORT = ROOT / "reports" / "coze-replay-88-v4-platform-test.md"


def sheet_rows(path: Path, sheet: str) -> list[list[object]]:
    workbook = load_workbook(path, read_only=True, data_only=True)
    worksheet = workbook[sheet]
    return [list(row) for row in worksheet.iter_rows(values_only=True)]


def row_by_first_value(rows: list[list[object]], key: str) -> list[object]:
    for row in rows:
        if row and row[0] == key:
            return row
    raise AssertionError(f"missing row: {key}")


class AcceptanceReportingGateTest(unittest.TestCase):
    def test_original_structure_sheet_exists_in_both_workbooks(self) -> None:
        for path in [PROJECT_XLSX, DESKTOP_XLSX]:
            workbook = load_workbook(path, read_only=True, data_only=True)
            self.assertIn("原结构迁移验证", workbook.sheetnames)

    def test_original_structure_verdicts_distinguish_structure_and_runtime(self) -> None:
        rows = sheet_rows(DESKTOP_XLSX, "原结构迁移验证")
        self.assertEqual(row_by_first_value(rows, "Coze 原结构工作流导入")[2], "PASS")
        self.assertEqual(row_by_first_value(rows, "v4 88 回放包")[2], "NOT_FINAL")
        self.assertEqual(row_by_first_value(rows, "知识库绑定")[2], "PENDING_REBIND")
        self.assertEqual(row_by_first_value(rows, "Dify Python Code 节点")[2], "PENDING_REBIND")
        self.assertEqual(row_by_first_value(rows, "条件/HTTP/变量节点")[2], "PENDING_REBIND")
        self.assertEqual(row_by_first_value(rows, "最终结论")[2], "ACTION_REQUIRED")

    def test_pending_rows_are_red_in_desktop_excel(self) -> None:
        workbook = load_workbook(DESKTOP_XLSX, data_only=True)
        worksheet = workbook["原结构迁移验证"]
        pending_rows = {
            "v4 88 回放包",
            "知识库绑定",
            "Dify Python Code 节点",
            "条件/HTTP/变量节点",
            "最终结论",
        }
        for row in worksheet.iter_rows(min_row=2):
            if row[0].value in pending_rows:
                self.assertEqual(row[2].fill.fgColor.rgb, "00FFC7CE", row[0].value)

    def test_desktop_summary_says_replay_is_not_final(self) -> None:
        rows = sheet_rows(DESKTOP_XLSX, "统计摘要")
        correction = row_by_first_value(rows, "迁移口径修正")[1]
        final_target = row_by_first_value(rows, "当前最终迁移目标")[1]
        blocker = row_by_first_value(rows, "当前阻塞/待办")[1]
        self.assertIn("仅代表回放样本一致", correction)
        self.assertIn("不代表最终工作流结构或泛化能力", correction)
        self.assertIn("running_ai_assistant_5_original_structure_v1", final_target)
        self.assertIn("仍需重绑", blocker)

    def test_replay_rows_keep_limited_scope_explanation(self) -> None:
        rows = sheet_rows(DESKTOP_XLSX, "测试结果")
        header = rows[0]
        final_judgement_idx = header.index("最终判断")
        explanation_idx = header.index("判准说明")
        for row in rows[1:]:
            if row and row[final_judgement_idx] == "Dify与Coze一致（Coze v4回放工作流）":
                explanation = str(row[explanation_idx])
                self.assertIn("回放", explanation)
                self.assertIn("不代表已完成 Dify 原生节点在 Coze 的泛化重绑", explanation)

    def test_project_summary_uses_current_test_total_and_blocker_wording(self) -> None:
        rows = sheet_rows(PROJECT_XLSX, "Summary")
        self.assertEqual(row_by_first_value(rows, "本地动态单元测试总数")[1], 1983)
        self.assertIn("final migration workflow", row_by_first_value(rows, "Migration correction")[1])
        self.assertIn("require rebinding", row_by_first_value(rows, "Remaining blockers")[1])

    def test_markdown_reports_do_not_claim_runtime_success(self) -> None:
        replay_text = REPLAY_REPORT.read_text(encoding="utf-8")
        original_text = ORIGINAL_REPORT.read_text(encoding="utf-8")
        platform_text = PLATFORM_REPORT.read_text(encoding="utf-8")
        combined = "\n".join([replay_text, original_text, platform_text])
        self.assertIn("不等同于完整 Dify 原生工作流在 Coze 中的泛化重绑", replay_text)
        self.assertIn("业务语义 1:1 仍需重绑后再跑全量用例", combined)
        self.assertIn("not yet a production-ready 1:1 runtime workflow", platform_text)
        self.assertNotIn("业务语义测试：PASS", combined)


if __name__ == "__main__":
    unittest.main()
