from __future__ import annotations

import json
from pathlib import Path

import yaml

from refactor_master_helpers import ROOT, extract_formula_ids, extract_formula_outputs, load_yaml


def main() -> int:
    formulas = load_yaml(ROOT / "spec" / "13_formula_registry.yaml").get("formula_registry", {}).get("formulas", {})
    owners = load_yaml(ROOT / "spec" / "ownership_map.yaml").get("ownership_map", {})
    formula_ids = extract_formula_ids()
    output_map = extract_formula_outputs()

    missing_owner = [fid for fid in formula_ids if not str(formulas.get(fid, {}).get("owner") or "").strip()]
    missing_status = [fid for fid in formula_ids if not str(formulas.get(fid, {}).get("status") or "").strip()]
    missing_outputs = [fid for fid, outs in output_map.items() if not outs]

    normalized = {
        "schema_version": "2026-06-06-formula-registry-normalized-v1",
        "source": "spec/13_formula_registry.yaml",
        "formula_count": len(formula_ids),
        "formulas": [
            {
                "formula_id": fid,
                "owner": formulas.get(fid, {}).get("owner"),
                "status": formulas.get(fid, {}).get("status"),
                "output_fields": output_map.get(fid, []),
            }
            for fid in formula_ids
        ],
    }
    norm_path = ROOT / "spec" / "03_formulas" / "formula_registry.normalized.yaml"
    norm_path.parent.mkdir(parents=True, exist_ok=True)
    norm_path.write_text(yaml.safe_dump(normalized, sort_keys=False, allow_unicode=True), encoding="utf-8")

    result = {
        "formula_id": "FORMULA_OWNER_COVERAGE_V1",
        "formula_count": len(formula_ids),
        "owner_coverage_pct": round((len(formula_ids) - len(missing_owner)) / len(formula_ids) * 100.0, 2) if formula_ids else 0.0,
        "output_field_coverage_pct": round((len(formula_ids) - len(missing_outputs)) / len(formula_ids) * 100.0, 2) if formula_ids else 0.0,
        "missing_owner_list": missing_owner[:200],
        "missing_status_list": missing_status[:200],
        "missing_output_field_list": missing_outputs[:200],
        "owner_map_concepts": len(owners) if isinstance(owners, dict) else 0,
        "gate": "FAIL" if missing_owner or missing_status or missing_outputs else "PASS",
    }
    out = ROOT / "Temp" / "formula_owner_coverage_v1.json"
    out.write_text(json.dumps(result, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(result, ensure_ascii=False, indent=2))
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
