"""Count antibiotics in the WHO AWaRe classification 2025 by group and class.

Input: B09489-eng.xlsx, the spreadsheet published with "WHO Access, Watch,
Reserve (AWaRe) classification of antibiotics for evaluation and monitoring of
use, 2025" (WHO reference B09489, publication date 2025-08-11,
https://iris.who.int/handle/10665/382244, retrieved 2026-10-24).

Writes aware-2025-class-counts.csv (one row per WHO class, with the broader
family used in the article) next to this script and prints a JSON summary.

Usage: python count_aware_2025.py path/to/B09489-eng.xlsx
"""

import collections
import csv
import json
import pathlib
import sys

import openpyxl

FAMILIES = {
    "Penicillins": "Penicillins",
    "First-generation-cephalosporins": "Cephalosporins",
    "Second-generation-cephalosporins": "Cephalosporins",
    "Third-generation-cephalosporins": "Cephalosporins",
    "Fourth-generation-cephalosporins": "Cephalosporins",
    "Fifth-generation-cephalosporins": "Cephalosporins",
    "Other-cephalosporins": "Cephalosporins",
    "Carbapenems": "Carbapenems and penems",
    "Penems": "Carbapenems and penems",
    "Monobactams": "Other beta-lactams",
    "Monobactam/beta-lactamase-inhibitor": "Other beta-lactams",
    "Beta-lactam/beta-lactamase-inhibitor": "Other beta-lactams",
    "Beta-lactam/beta-lactamase-inhibitor_anti-pseudomonal": "Other beta-lactams",
    "Beta-lactamase-inhibitors": "Other beta-lactams",
    "Quinolones": "Quinolones and fluoroquinolones",
    "Fluoroquinolones": "Quinolones and fluoroquinolones",
    "Sulfonamides": "Sulfonamides and trimethoprim",
    "Sulfonamide-trimethoprim-combinations": "Sulfonamides and trimethoprim",
    "Trimethoprim-derivatives": "Sulfonamides and trimethoprim",
    "Aminoglycosides": "Aminoglycosides",
    "Aminocyclitols": "Aminoglycosides",
    "Macrolides": "Macrolides, lincosamides and streptogramins",
    "Lincosamides": "Macrolides, lincosamides and streptogramins",
    "Streptogramins": "Macrolides, lincosamides and streptogramins",
    "Tetracyclines": "Tetracyclines",
    "Glycylcyclines": "Tetracyclines",
    "Imidazoles": "Nitroimidazoles",
    "Glycopeptides": "Glycopeptides and lipopeptides",
    "Lipopeptides": "Glycopeptides and lipopeptides",
}
GROUPS = ("Access", "Watch", "Reserve")


def main(path):
    wb = openpyxl.load_workbook(path, read_only=True, data_only=True)
    rows = [r for r in wb["AWaRe classification 2025"].iter_rows(min_row=5, values_only=True) if r[0]]
    by_class = collections.defaultdict(collections.Counter)
    for name, cls, _atc, group, _eml, *_ in rows:
        by_class[cls.strip().replace("\xa0", "")][group] += 1

    out = pathlib.Path(__file__).with_name("aware-2025-class-counts.csv")
    with out.open("w", newline="", encoding="utf-8") as f:
        w = csv.writer(f, lineterminator="\n")
        w.writerow(["who_class", "family", "access", "watch", "reserve", "total"])
        for cls in sorted(by_class, key=lambda c: (-sum(by_class[c].values()), c)):
            c = by_class[cls]
            w.writerow([cls, FAMILIES.get(cls, "Other classes"), *(c[g] for g in GROUPS), sum(c.values())])

    families = collections.defaultdict(collections.Counter)
    for cls, c in by_class.items():
        families[FAMILIES.get(cls, "Other classes")].update(c)
    names = {r[0].split("_")[0] for r in rows}
    not_recommended = [r for r in wb["Not recommended"].iter_rows(min_row=5, values_only=True) if r[0]]
    eml = [r for r in wb["24th EML 2025"].iter_rows(min_row=5, values_only=True) if r[0]]
    print(json.dumps({
        "entries": len(rows),
        "by_group": dict(collections.Counter(r[3] for r in rows)),
        "on_eml_by_group": dict(collections.Counter(r[3] for r in rows if r[4] == "Yes")),
        "eml_2025_entries": len(eml),
        "distinct_names_after_merging_routes": len(names),
        "fixed_dose_combination_names": sum("/" in n for n in names),
        "entries_outside_atc_j01": sum(not str(r[2]).startswith("J01") for r in rows),
        "not_recommended_combinations": len(not_recommended),
        "families": {k: dict(v, total=sum(v.values())) for k, v in sorted(families.items(), key=lambda kv: -sum(kv[1].values()))},
    }, indent=2))


if __name__ == "__main__":
    main(sys.argv[1])
