#!/usr/bin/env python3
"""Verify representative listing URLs and append HTTP evidence to the audit JSON."""

from __future__ import annotations

import json
import re
from concurrent.futures import ThreadPoolExecutor, as_completed
from pathlib import Path

import requests


PATH = Path(__file__).resolve().parent / "chain-audit-2026-08-21.json"
HEADERS = {"User-Agent": "Mozilla/5.0 (compatible; TN-Silver-catalog-research/1.0)"}


def normalized(value: str) -> str:
    value = value.lower().replace("커팅", "컷팅").replace("비형", "b형")
    return re.sub(r"[^0-9a-z가-힣]+", "", value)


def check(url: str) -> dict:
    try:
        response = requests.get(url, timeout=30, headers=HEADERS, allow_redirects=True)
        response.encoding = response.apparent_encoding or response.encoding
        body = normalized(response.text)
        return {
            "http_status": response.status_code,
            "reachable": response.status_code < 400,
            "final_url": response.url,
            "body": body,
        }
    except Exception as error:
        return {"http_status": None, "reachable": False, "final_url": url, "body": "", "error": type(error).__name__}


def main() -> None:
    data = json.loads(PATH.read_text(encoding="utf-8"))
    jobs = {}
    with ThreadPoolExecutor(max_workers=6) as executor:
        for row in data["rows"]:
            terms = [row["name"], *row["aliases"]]
            for listing in row["representative_listings"]:
                key = listing["url"]
                if key not in jobs:
                    jobs[key] = executor.submit(check, key)
        results = {url: future.result() for url, future in jobs.items()}
    for row in data["rows"]:
        for listing in row["representative_listings"]:
            raw = results[listing["url"]]
            normalized_terms = [normalized(term) for term in [row["name"], *row["aliases"]] if normalized(term)]
            listing["verification"] = {
                key: value for key, value in raw.items() if key != "body"
            }
            listing["verification"]["term_visible"] = any(term in raw["body"] for term in normalized_terms)
    data["link_verification"] = {
        "checked_on": "2026-08-21",
        "unique_urls": len(results),
        "reachable": sum(1 for value in results.values() if value["reachable"]),
        "unreachable": sum(1 for value in results.values() if not value["reachable"]),
        "term_visible_rows": sum(
            1 for row in data["rows"] for listing in row["representative_listings"]
            if listing["verification"]["term_visible"]
        ),
    }
    PATH.write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data["link_verification"], ensure_ascii=False))
    for url, result in results.items():
        if not result["reachable"]:
            print({key: value for key, value in result.items() if key != "body"}, url)


if __name__ == "__main__":
    main()
