from __future__ import annotations

from pathlib import Path

from ..utils.json_utils import read_json, write_json
from ..utils.time_utils import now_iso


class ChecklistService:
    """Builds evidence checklist for 482/186 support workflows."""

    REQUIRED_BUCKETS = {
        "identity": ["passport", "birth_certificate", "name_change_docs"],
        "education": ["degree_certificate", "academic_transcript"],
        "employment": ["reference_letters", "employment_contracts", "payslips_or_tax_records"],
        "translations": ["naati_or_certified_translations_for_non_english_docs"],
    }

    def generate(self, applicant_base: Path) -> dict:
        present_keywords: set[str] = set()

        for manifest_path in sorted(applicant_base.rglob("meta/manifest.json")):
            manifest = read_json(manifest_path, default={}) or {}
            status = str(manifest.get("status") or "").lower()
            if status in {"duplicate", "ignored", "archived"}:
                continue
            entities_path = manifest_path.parents[1] / "extracted" / "entities.json"
            if not entities_path.exists():
                continue
            payload = read_json(entities_path, default={}) or {}
            keywords = payload.get("entities", {}).get("detected_keywords", [])
            present_keywords.update(keywords)

        checklist = {
            "generated_at": now_iso(),
            "target_visa_support": ["482", "186"],
            "verified_evidence": [],
            "inferred_suggestions": [],
            "missing_evidence": [],
            "items": [],
        }

        for category, items in self.REQUIRED_BUCKETS.items():
            for item in items:
                status = "inferred" if any(token in item for token in present_keywords) else "missing"
                checklist["items"].append({"category": category, "item": item, "status": status})
                if status == "inferred":
                    checklist["inferred_suggestions"].append(f"Potentially covered: {item}")
                else:
                    checklist["missing_evidence"].append(f"Missing: {item}")

        generated_dir = applicant_base / "generated"
        write_json(generated_dir / "checklist.json", checklist)

        md_lines = [
            "# Evidence Checklist (482/186 Support)",
            "",
            "This checklist is a preparation aid only and not legal advice.",
            "",
            "## Items",
        ]
        for row in checklist["items"]:
            md_lines.append(f"- [{row['status']}] {row['category']}: {row['item']}")

        (generated_dir / "checklist.md").write_text("\n".join(md_lines) + "\n", encoding="utf-8")
        return checklist
