"""Generate the deduplicated organization list for the landing page.

Reads _data/active-hubs.qmd and writes _data/orgs.qmd, a generated data file
containing one entry per *organization* for the "Organizations using the
hubverse" grid on index.qmd.

Organizations are deduplicated by their display ``name``: several org slugs can
refer to the same organization (e.g. ``ecdc`` and ``ecdc-archival``, or
``reichlab-training`` and ``reichlab-modeldev``), and we only want each
organization listed once. The first slug seen for a given name wins, so the
card links to that organization's primary section on the hubs page.
"""

import argparse
from pathlib import Path

import yaml


def build_org_list(input_qmd: Path) -> list[dict]:
    """Return a list of {id, name, logo} dicts, one per organization.

    Deduplicated by ``name`` in the order organizations appear in the file;
    the ``example`` placeholder org is skipped.
    """
    with open(input_qmd, "r", encoding="utf-8") as f:
        data = list(yaml.safe_load_all(f))[0]  # Quarto front matter

    orgs = []
    seen_names = set()
    for slug, org_data in (data.get("hubs") or {}).items():
        if slug == "example":
            continue
        org_data = org_data or {}
        name = org_data.get("name", "")
        if not name or name in seen_names:
            continue
        seen_names.add(name)
        orgs.append({
            "id": slug,
            "name": name,
            "logo": org_data.get("logo", ""),
        })
    return orgs


def write_orgs_qmd(orgs: list[dict], output_qmd: Path) -> None:
    """Write orgs to a Quarto data file (YAML-only front matter)."""
    header = (
        "# GENERATED by scripts/print_org_list.py from _data/active-hubs.qmd.\n"
        "# Do not edit by hand; edit active-hubs.qmd and re-run `make orgs`.\n"
    )
    body = yaml.safe_dump(
        {"orgs": orgs}, sort_keys=False, allow_unicode=True, default_flow_style=False
    )
    output_qmd.write_text(f"---\n{header}{body}---\n", encoding="utf-8")


def main(argv=None):
    parser = argparse.ArgumentParser(
        description="Generate _data/orgs.qmd from active-hubs.qmd"
    )
    parser.add_argument(
        "--data-dir",
        type=Path,
        help="Directory holding active-hubs.qmd / orgs.qmd. Defaults to the project _data/.",
    )
    args = parser.parse_args(argv)

    base_dir = Path(__file__).resolve().parents[1]
    data_dir = (args.data_dir or (base_dir / "_data")).resolve()
    input_qmd = data_dir / "active-hubs.qmd"
    output_qmd = data_dir / "orgs.qmd"

    orgs = build_org_list(input_qmd)
    write_orgs_qmd(orgs, output_qmd)
    print(f"Saved {len(orgs)} organizations to {output_qmd}")


if __name__ == "__main__":
    main()
