import json
import re
from pathlib import Path


base_dir = Path(__file__).parent
text = (base_dir / "job-posting-observed-output.md").read_text(encoding="utf-8")
input_data = json.loads((base_dir / "job-posting-inputs.json").read_text(encoding="utf-8"))
inputs_by_case = {case["id"]: case["input"] for case in input_data["cases"]}

required_labels = [
    "募集者の名称・住所・連絡先",
    "職種",
    "雇用形態",
    "仕事内容",
    "業務の変更範囲",
    "就業場所",
    "就業場所の変更範囲",
    "勤務時間",
    "休憩",
    "時間外労働",
    "休日",
    "給与・手当・固定残業代",
    "契約期間",
    "有期契約を更新する場合の判断基準",
    "更新上限がある場合の内容",
    "試用期間",
    "加入保険",
    "受動喫煙防止措置",
    "応募資格・募集対象",
]

# Each output row must point to the exact source field(s) expected for this fixture.
# An empty set means that the row must explicitly say that there was no input.
expected_source_keys = {
    1: {
        2: {"職種"}, 3: {"雇用"}, 4: {"業務"}, 6: {"勤務地"},
        8: {"勤務"}, 11: {"休日"}, 12: {"給与"},
    },
    2: {
        2: {"職種"}, 3: {"雇用"}, 4: {"業務"},
        6: {"勤務地メモA", "勤務地メモB"},
        8: {"勤務メモA", "勤務メモB"}, 11: {"休日"}, 12: {"給与"},
    },
    3: {
        2: {"職種"}, 3: {"雇用"}, 4: {"業務"}, 6: {"勤務地"},
        8: {"勤務"}, 11: {"休日"}, 12: {"給与"},
        13: {"契約期間・更新基準"}, 14: {"契約期間・更新基準"},
        19: {"希望"},
    },
}


def case_section(case_id: int) -> str:
    match = re.search(
        rf"^## case-{case_id}：.*?(?=^## case-|^## 公開前の注意)",
        text,
        flags=re.MULTILINE | re.DOTALL,
    )
    if not match:
        raise AssertionError(f"case-{case_id} がありません")
    return match.group(0)


checks = {
    "実行日が2026-09-20": "実行日：2026-09-20" in text,
    "生成手段と限界を明記": "組み込みの生成機能（モデル名は非公開）" in text
    and "公開可否や法令適合性は判断していません" in text,
}

for case_id in (1, 2, 3):
    section = case_section(case_id)
    draft = section.split("### (B) 求人票下書き", 1)[1].split("#### 下書きと入力の対応表", 1)[0]
    mapping = section.split("#### 下書きと入力の対応表", 1)[1]
    draft_lines = re.findall(r"^\d+\. (.+)$", draft, flags=re.MULTILINE)
    mapping_rows = re.findall(
        r"^\|\s*(\d+)\s*\|\s*(.*?)\s*\|\s*(.*?)\s*\|$",
        mapping,
        flags=re.MULTILINE,
    )
    mapping_numbers = [row[0] for row in mapping_rows]
    checks[f"case-{case_id} 下書き19項目"] = len(draft_lines) == 19
    checks[f"case-{case_id} 根拠19行"] = mapping_numbers == [str(n) for n in range(1, 20)]
    checks[f"case-{case_id} 必須項目を省略しない"] = all(
        sum(line.startswith(label + "：") for line in draft_lines) == 1 for label in required_labels
    )
    checks[f"case-{case_id} 対応表が下書きと完全一致"] = (
        len(mapping_rows) == len(draft_lines)
        and all(row[1] == draft_lines[index] for index, row in enumerate(mapping_rows))
    )

    case_inputs = inputs_by_case[f"case-{case_id}"]
    sources_match = len(mapping_rows) == 19
    for row_number, _, source in mapping_rows:
        line_number = int(row_number)
        quoted_terms = set(re.findall(r"「([^」]+)」", source))
        cited_keys = {term for term in quoted_terms if term in case_inputs}
        known_values = set(case_inputs.values())
        expected_keys = expected_source_keys[case_id].get(line_number, set())
        if cited_keys != expected_keys or any(
            term not in case_inputs and term not in known_values for term in quoted_terms
        ):
            sources_match = False
        if not expected_keys and "入力なし" not in source:
            sources_match = False
    checks[f"case-{case_id} 根拠が入力項目と一致"] = sources_match

case_2 = case_section(2)
checks["case-2 矛盾を両案で残す"] = (
    "［要確認：東京本社へ毎日出社／週2日まで在宅可］" in case_2
    and "［要確認：9:00〜17:00／9:00〜18:00］" in case_2
)

case_3 = case_section(3)
case_3_draft = case_3.split("### (B) 求人票下書き", 1)[1].split("#### 下書きと入力の対応表", 1)[0]
checks["case-3 年齢・性別を公開保留"] = (
    "公開保留：法定例外に当たるかを人が公式資料で確認" in case_3
    and "若い男性" not in case_3_draft
)

for name, passed in checks.items():
    print(f"{'PASS' if passed else 'FAIL'}\t{name}")

if not all(checks.values()):
    raise SystemExit(1)
