"""Obesity drug vocabulary, target receptor, sponsor mapping.

NOTE: 본 vocabulary는 공개적으로 알려진 비만 파이프라인 약물명을 참조용으로
정리한 것이며, 임상 권고나 처방 근거가 아닙니다.
모든 매핑은 합성·교육용입니다.
"""

# Active obesity pipeline drug vocabulary (50+ entries).
# Each entry: canonical name, list of aliases, list of receptor targets, sponsor.
DRUG_VOCAB = [
    # GLP-1 receptor agonists
    {"canonical": "semaglutide", "aliases": ["semaglutide", "Wegovy", "Ozempic", "NN9535"],
     "targets": ["GLP-1"], "sponsor": "Novo Nordisk"},
    {"canonical": "oral semaglutide", "aliases": ["oral semaglutide", "Rybelsus", "PIONEER-PLUS"],
     "targets": ["GLP-1"], "sponsor": "Novo Nordisk"},
    {"canonical": "liraglutide", "aliases": ["liraglutide", "Saxenda", "Victoza"],
     "targets": ["GLP-1"], "sponsor": "Novo Nordisk"},
    {"canonical": "orforglipron", "aliases": ["orforglipron", "LY3502970"],
     "targets": ["GLP-1"], "sponsor": "Eli Lilly"},
    {"canonical": "danuglipron", "aliases": ["danuglipron", "PF-06882961"],
     "targets": ["GLP-1"], "sponsor": "Pfizer"},
    {"canonical": "ecnoglutide", "aliases": ["ecnoglutide", "XW003"],
     "targets": ["GLP-1"], "sponsor": "Sciwind Biosciences"},
    {"canonical": "noiiglutide", "aliases": ["noiiglutide", "HRS9531-mono"],
     "targets": ["GLP-1"], "sponsor": "Hengrui Pharma"},

    # GLP-1 / GIP dual agonists
    {"canonical": "tirzepatide", "aliases": ["tirzepatide", "Mounjaro", "Zepbound", "LY3298176"],
     "targets": ["GLP-1", "GIP"], "sponsor": "Eli Lilly"},
    {"canonical": "MariTide", "aliases": ["MariTide", "AMG 133", "maridebart cafraglutide"],
     "targets": ["GLP-1", "GIP"], "sponsor": "Amgen"},
    {"canonical": "CT-388", "aliases": ["CT-388"],
     "targets": ["GLP-1", "GIP"], "sponsor": "Carmot Therapeutics"},
    {"canonical": "VK2735", "aliases": ["VK2735"],
     "targets": ["GLP-1", "GIP"], "sponsor": "Viking Therapeutics"},

    # GLP-1 / glucagon dual
    {"canonical": "survodutide", "aliases": ["survodutide", "BI 456906"],
     "targets": ["GLP-1", "Glucagon"], "sponsor": "Boehringer Ingelheim / Zealand"},
    {"canonical": "mazdutide", "aliases": ["mazdutide", "IBI362", "LY3305677"],
     "targets": ["GLP-1", "Glucagon"], "sponsor": "Innovent / Eli Lilly"},
    {"canonical": "pemvidutide", "aliases": ["pemvidutide", "ALT-801"],
     "targets": ["GLP-1", "Glucagon"], "sponsor": "Altimmune"},
    {"canonical": "efinopegdutide", "aliases": ["efinopegdutide", "MK-6024", "HM12525A"],
     "targets": ["GLP-1", "Glucagon"], "sponsor": "Merck / Hanmi"},
    {"canonical": "cotadutide", "aliases": ["cotadutide", "MEDI0382"],
     "targets": ["GLP-1", "Glucagon"], "sponsor": "AstraZeneca"},

    # GLP-1 / GIP / glucagon triple
    {"canonical": "retatrutide", "aliases": ["retatrutide", "LY3437943"],
     "targets": ["GLP-1", "GIP", "Glucagon"], "sponsor": "Eli Lilly"},
    {"canonical": "HM15211", "aliases": ["HM15211", "efocipegtrutide"],
     "targets": ["GLP-1", "GIP", "Glucagon"], "sponsor": "Hanmi"},

    # Amylin and amylin combos
    {"canonical": "cagrilintide", "aliases": ["cagrilintide", "AM833"],
     "targets": ["Amylin"], "sponsor": "Novo Nordisk"},
    {"canonical": "CagriSema", "aliases": ["CagriSema", "cagrilintide+semaglutide"],
     "targets": ["Amylin", "GLP-1"], "sponsor": "Novo Nordisk"},
    {"canonical": "petrelintide", "aliases": ["petrelintide", "ZP8396"],
     "targets": ["Amylin"], "sponsor": "Zealand Pharma"},
    {"canonical": "amycretin", "aliases": ["amycretin", "NN9487"],
     "targets": ["Amylin", "GLP-1"], "sponsor": "Novo Nordisk"},

    # MC4R / leptin / FGF
    {"canonical": "setmelanotide", "aliases": ["setmelanotide", "Imcivree", "RM-493"],
     "targets": ["MC4R"], "sponsor": "Rhythm Pharmaceuticals"},
    {"canonical": "bivamelagon", "aliases": ["bivamelagon", "LB54640"],
     "targets": ["MC4R"], "sponsor": "LG Chem / Rhythm"},
    {"canonical": "metreleptin", "aliases": ["metreleptin", "Myalept"],
     "targets": ["Leptin"], "sponsor": "Amryt / Chiesi"},
    {"canonical": "mibavademab", "aliases": ["mibavademab", "REGN4461"],
     "targets": ["LepR"], "sponsor": "Regeneron"},
    {"canonical": "efruxifermin", "aliases": ["efruxifermin", "EFX"],
     "targets": ["FGF21"], "sponsor": "Akero Therapeutics"},
    {"canonical": "pegozafermin", "aliases": ["pegozafermin", "BIO89-100"],
     "targets": ["FGF21"], "sponsor": "89bio"},

    # Other mechanisms
    {"canonical": "bimagrumab", "aliases": ["bimagrumab", "BYM338"],
     "targets": ["ActRII"], "sponsor": "Versanis / Eli Lilly"},
    {"canonical": "GSBR-1290", "aliases": ["GSBR-1290"],
     "targets": ["GLP-1"], "sponsor": "Structure Therapeutics"},
    {"canonical": "ARD-101", "aliases": ["ARD-101"],
     "targets": ["TAS2R"], "sponsor": "Aardvark Therapeutics"},
    {"canonical": "ARD-201", "aliases": ["ARD-201"],
     "targets": ["TAS2R", "DPP-4"], "sponsor": "Aardvark Therapeutics"},
    {"canonical": "naltrexone-bupropion", "aliases": ["naltrexone-bupropion", "Contrave", "Mysimba"],
     "targets": ["MOR", "DAT"], "sponsor": "Currax Pharmaceuticals"},
    {"canonical": "phentermine-topiramate", "aliases": ["phentermine-topiramate", "Qsymia"],
     "targets": ["NA", "GABA"], "sponsor": "Vivus"},
    {"canonical": "tesofensine", "aliases": ["tesofensine"],
     "targets": ["MAT"], "sponsor": "Saniona"},
    {"canonical": "olezarsen", "aliases": ["olezarsen"],
     "targets": ["APOC3"], "sponsor": "Ionis"},
    {"canonical": "evexomostat", "aliases": ["evexomostat", "SDX-7320"],
     "targets": ["MetAP2"], "sponsor": "SynDevRx"},
    {"canonical": "beloranib", "aliases": ["beloranib", "ZGN-433"],
     "targets": ["MetAP2"], "sponsor": "Zafgen (legacy)"},
    {"canonical": "lipocalin-2-mAb", "aliases": ["lipocalin-2-mAb", "LCN2-mAb"],
     "targets": ["LCN2"], "sponsor": "Academic"},

    # Newer combinations / add-ons
    {"canonical": "tirzepatide+bimagrumab", "aliases": ["tirzepatide+bimagrumab"],
     "targets": ["GLP-1", "GIP", "ActRII"], "sponsor": "Eli Lilly"},
    {"canonical": "semaglutide+cagrilintide", "aliases": ["semaglutide+cagrilintide"],
     "targets": ["GLP-1", "Amylin"], "sponsor": "Novo Nordisk"},
    {"canonical": "retatrutide+SGLT2i", "aliases": ["retatrutide+SGLT2i"],
     "targets": ["GLP-1", "GIP", "Glucagon", "SGLT2"], "sponsor": "Academic combo"},
    {"canonical": "HRS9531", "aliases": ["HRS9531"],
     "targets": ["GLP-1", "GIP"], "sponsor": "Hengrui Pharma"},
    {"canonical": "XW014", "aliases": ["XW014"],
     "targets": ["GLP-1"], "sponsor": "Sciwind Biosciences"},
    {"canonical": "DA-1726", "aliases": ["DA-1726"],
     "targets": ["GLP-1", "Glucagon"], "sponsor": "NeuroBo / Dong-A"},
    {"canonical": "DD01", "aliases": ["DD01"],
     "targets": ["GLP-1", "Glucagon"], "sponsor": "Neuraly / D&D Pharmatech"},
    {"canonical": "GLY-200", "aliases": ["GLY-200"],
     "targets": ["GutBarrier"], "sponsor": "Glyscend"},
    {"canonical": "MET-097i", "aliases": ["MET-097i"],
     "targets": ["GLP-1"], "sponsor": "Metsera"},
    {"canonical": "ASC30", "aliases": ["ASC30"],
     "targets": ["GLP-1"], "sponsor": "Ascletis"},
    {"canonical": "TERN-601", "aliases": ["TERN-601"],
     "targets": ["GLP-1"], "sponsor": "Terns Pharmaceuticals"},
    {"canonical": "ECC5004", "aliases": ["ECC5004"],
     "targets": ["GLP-1"], "sponsor": "Eccogene / AstraZeneca"},
]


# Receptor → human-readable label
RECEPTOR_LABELS = {
    "GLP-1": "GLP-1 receptor",
    "GIP": "GIP receptor",
    "Glucagon": "Glucagon receptor",
    "Amylin": "Amylin receptor (CTR/RAMP)",
    "MC4R": "Melanocortin-4 receptor",
    "Leptin": "Leptin",
    "LepR": "Leptin receptor",
    "FGF21": "FGF21",
    "ActRII": "Activin type II receptor",
    "TAS2R": "Bitter taste receptor",
    "DPP-4": "DPP-4",
    "MOR": "Mu-opioid receptor",
    "DAT": "Dopamine transporter",
    "NA": "Noradrenergic",
    "GABA": "GABAergic",
    "MAT": "Monoamine transporter",
    "APOC3": "Apolipoprotein C-III",
    "MetAP2": "Methionine aminopeptidase 2",
    "LCN2": "Lipocalin-2",
    "SGLT2": "SGLT2",
    "GutBarrier": "Gut barrier modulator",
}


def all_aliases():
    """Return list of (alias_lower, canonical) for matching."""
    out = []
    for entry in DRUG_VOCAB:
        for alias in entry["aliases"]:
            out.append((alias.lower(), entry["canonical"]))
    # Sort longest-first to match longer aliases before shorter substrings.
    out.sort(key=lambda x: -len(x[0]))
    return out


def lookup(canonical):
    """Look up vocab entry by canonical name."""
    for entry in DRUG_VOCAB:
        if entry["canonical"] == canonical:
            return entry
    return None


def total_drug_count():
    return len(DRUG_VOCAB)
