Specific side effect of each drug compile them in a pdf

Asking for Preferences
Asking for Preferences
Reading File
Finding Sources
Reading File
Running Command

mkdir -p /tmp/workspace/drug-side-effects && ls /tmp/workspace/drug-side-effects/

Writing File

~/drug-side-effects/generate_pdf.py

from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.platypus import (
    SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
    HRFlowable, PageBreak, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import BaseDocTemplate, Frame, PageTemplate
from reportlab.pdfgen import canvas
import datetime

# ─── Data ──────────────────────────────────────────────────────────────────────
# Each entry: (drug_class, representative_drugs, key_unique_side_effects, bullet_notes)

DRUG_DATA = [
    {
        "class": "ACE Inhibitors",
        "color": "#1B4F72",
        "drugs": "Captopril, Enalapril, Lisinopril, Ramipril",
        "table_rows": [
            ("Dry Cough", "Bradykinin accumulation; class effect; up to 15% incidence"),
            ("Angioedema", "Rare but life-threatening; bradykinin-mediated; higher risk in Black patients"),
            ("Hyperkalemia", "Reduced aldosterone; risk ↑ with K+ supplements or renal impairment"),
            ("First-dose Hypotension", "Especially in volume-depleted or heart failure patients"),
            ("Teratogenicity", "Contraindicated in pregnancy (fetal renal tubular dysplasia)"),
        ],
        "bullets": [
            "Dry cough is the most common reason for switching to an ARB.",
            "Captopril (1st-gen) additionally causes rash, dysgeusia, and neutropenia due to sulfhydryl group.",
            "Renal function and K+ must be monitored within 1–2 weeks of initiation.",
        ]
    },
    {
        "class": "Angiotensin Receptor Blockers (ARBs)",
        "color": "#1A5276",
        "drugs": "Losartan, Valsartan, Irbesartan, Candesartan, Telmisartan",
        "table_rows": [
            ("Hyperkalemia", "Similar mechanism to ACE inhibitors; less pronounced"),
            ("Angioedema", "Rare; less common than with ACE inhibitors"),
            ("Teratogenicity", "Same contraindication as ACE inhibitors in pregnancy"),
            ("Losartan: Uricosuric", "Losartan uniquely lowers uric acid; useful in gout + hypertension"),
        ],
        "bullets": [
            "ARBs do NOT cause cough — key differentiator from ACE inhibitors.",
            "Losartan is the only ARB with a clinically meaningful uricosuric effect.",
            "Valsartan/sacubitril (Entresto) combination: risk of angioedema if given with ACE inhibitor.",
        ]
    },
    {
        "class": "Beta-Blockers (β-Blockers)",
        "color": "#154360",
        "drugs": "Metoprolol, Atenolol, Propranolol, Carvedilol, Bisoprolol, Labetalol",
        "table_rows": [
            ("Bradycardia & Heart Block", "Class effect from β1 blockade; monitor HR"),
            ("Bronchospasm", "Non-selective agents (propranolol); avoid in asthma/COPD"),
            ("Masking Hypoglycemia", "Blunts tachycardia warning signs; use cardioselective agents in diabetics"),
            ("Peripheral Vasoconstriction", "Cold extremities, Raynaud's phenomenon"),
            ("Sexual Dysfunction", "Erectile dysfunction in males"),
            ("Rebound Hypertension", "Abrupt withdrawal causes rebound; taper gradually"),
            ("Carvedilol: α+β blockade", "Additional postural hypotension due to α1 blockade"),
        ],
        "bullets": [
            "Propranolol (non-selective) uniquely used for essential tremor, portal hypertension, and thyroid storm.",
            "Labetalol: combined α/β blocker; drug of choice in hypertensive emergency in pregnancy.",
            "Atenolol is hydrophilic — less CNS penetration, fewer nightmares/depression than propranolol.",
            "Abrupt discontinuation in ischemic heart disease can precipitate acute MI.",
        ]
    },
    {
        "class": "Calcium Channel Blockers (CCBs)",
        "color": "#1F618D",
        "drugs": "Amlodipine, Nifedipine, Diltiazem, Verapamil, Felodipine",
        "table_rows": [
            ("Peripheral Edema", "Dihydropyridines (amlodipine, nifedipine); pre-capillary vasodilation"),
            ("Flushing & Headache", "Vasodilation; more with nifedipine"),
            ("Reflex Tachycardia", "Short-acting dihydropyridines (nifedipine); less with amlodipine"),
            ("Constipation", "Verapamil — most common; due to GI smooth muscle inhibition"),
            ("Bradycardia / AV Block", "Non-dihydropyridines: verapamil, diltiazem — cardiac conduction effects"),
            ("Gingival Hyperplasia", "Class effect; especially nifedipine"),
        ],
        "bullets": [
            "Verapamil = most constipating CCB; also most negatively chronotropic/dromotropic.",
            "Amlodipine: long half-life (~35–50 h) — minimal reflex tachycardia; once-daily dosing.",
            "Dihydropyridines (amlodipine, nifedipine) act predominantly on vascular smooth muscle.",
            "Non-dihydropyridines (verapamil, diltiazem) act on both cardiac and vascular tissue.",
        ]
    },
    {
        "class": "Thiazide Diuretics",
        "color": "#117A65",
        "drugs": "Hydrochlorothiazide (HCTZ), Chlorthalidone, Indapamide, Metolazone",
        "table_rows": [
            ("Hypokalemia", "Increased K+ excretion at distal tubule; monitor K+"),
            ("Hyponatremia", "Most common electrolyte abnormality; dilutional"),
            ("Hyperuricemia", "Reduced uric acid excretion; may precipitate gout"),
            ("Hyperglycemia", "Impaired insulin secretion; worsen diabetes"),
            ("Hyperlipidemia", "Increased LDL, triglycerides (mild, dose-dependent)"),
            ("Hypercalcemia", "Reduced renal Ca²+ excretion; opposite of loop diuretics"),
            ("Photosensitivity", "Thiazide-specific rash on sun-exposed areas"),
        ],
        "bullets": [
            "Mnemonic for thiazide side effects: HyperGLUC — Glucose, Lipids, Uric acid, Calcium (↑).",
            "Chlorthalidone has longer half-life and stronger BP-lowering effect than HCTZ.",
            "Contraindicated in anuria and sulfonamide allergy.",
            "Thiazides RETAIN calcium — useful in hypercalciuria/nephrolithiasis prevention.",
        ]
    },
    {
        "class": "Loop Diuretics",
        "color": "#0E6655",
        "drugs": "Furosemide, Bumetanide, Torsemide, Ethacrynic Acid",
        "table_rows": [
            ("Hypokalemia", "Most important electrolyte effect; monitor serum K+"),
            ("Ototoxicity", "Dose-related; tinnitus, hearing loss; especially ethacrynic acid"),
            ("Hypocalcemia", "Increased urinary Ca²+ loss; opposite of thiazides"),
            ("Hypomagnesemia", "Renal Mg²+ wasting; can worsen hypokalemia"),
            ("Hyperuricemia", "Competes with uric acid for secretion"),
            ("Metabolic Alkalosis", "H+ and Cl- loss"),
        ],
        "bullets": [
            "Ethacrynic acid: only loop diuretic NOT a sulfonamide — use in sulfa allergy.",
            "Furosemide is the most widely used loop diuretic; acts on ascending limb of loop of Henle.",
            "IV furosemide: give slowly to reduce ototoxicity risk.",
            "Loop diuretics WASTE calcium — contrast with thiazides which retain calcium.",
        ]
    },
    {
        "class": "Potassium-Sparing Diuretics",
        "color": "#1E8449",
        "drugs": "Spironolactone, Eplerenone, Amiloride, Triamterene",
        "table_rows": [
            ("Hyperkalemia", "Main risk; potentially fatal; avoid with ACE inhibitors/ARBs"),
            ("Gynecomastia", "Spironolactone only; anti-androgenic effects"),
            ("Menstrual Irregularities", "Spironolactone; due to progesterone-receptor activity"),
            ("Metabolic Acidosis", "Hyperchloremic acidosis from reduced H+ secretion"),
            ("Triamterene: Renal Stones", "Crystalluria and kidney stones"),
        ],
        "bullets": [
            "Spironolactone's anti-androgenic side effects (gynecomastia) led to development of eplerenone (more selective).",
            "Spironolactone reduces mortality in heart failure with reduced ejection fraction (HFrEF).",
            "Amiloride/triamterene block Na+ channels directly (not aldosterone-mediated).",
            "Avoid combination with K+ supplements or ACE inhibitors — severe hyperkalemia risk.",
        ]
    },
    {
        "class": "Statins (HMG-CoA Reductase Inhibitors)",
        "color": "#6C3483",
        "drugs": "Atorvastatin, Rosuvastatin, Simvastatin, Pravastatin, Lovastatin, Fluvastatin",
        "table_rows": [
            ("Myopathy / Rhabdomyolysis", "Dose-dependent; check CK if muscle pain; risk ↑ with gemfibrozil"),
            ("Hepatotoxicity", "Elevated transaminases; rare severe hepatitis; monitor LFTs"),
            ("Teratogenicity", "Contraindicated in pregnancy (cholesterol needed for fetal development)"),
            ("New-onset Diabetes", "Modest increase in T2DM risk, especially high-intensity statins"),
            ("Cognitive Effects", "Rare, reversible memory impairment reported"),
        ],
        "bullets": [
            "Simvastatin has the highest myopathy risk; avoid >40 mg/day with amlodipine.",
            "Gemfibrozil (not fenofibrate) dramatically increases statin myopathy risk via CYP inhibition.",
            "Pravastatin and rosuvastatin are less CYP3A4 dependent — fewer drug interactions.",
            "Statins are the most proven cardiovascular mortality-reducing lipid drugs.",
        ]
    },
    {
        "class": "Fibrates",
        "color": "#7D3C98",
        "drugs": "Gemfibrozil, Fenofibrate, Bezafibrate",
        "table_rows": [
            ("Myopathy", "Risk ↑↑ when combined with statins, especially gemfibrozil"),
            ("Cholelithiasis", "Increased cholesterol saturation of bile; gallstones"),
            ("GI Disturbances", "Nausea, dyspepsia, abdominal pain"),
            ("Hepatotoxicity", "Elevated transaminases; rare"),
        ],
        "bullets": [
            "Gemfibrozil inhibits glucuronidation of statins — raises statin plasma levels significantly.",
            "Fenofibrate is safer than gemfibrozil when combined with statins.",
            "Fibrates primarily lower triglycerides and raise HDL.",
        ]
    },
    {
        "class": "Anticoagulants",
        "color": "#922B21",
        "drugs": "Warfarin, Heparin, Enoxaparin, Rivaroxaban, Apixaban, Dabigatran",
        "table_rows": [
            ("Bleeding", "All anticoagulants; GI, intracranial, retroperitoneal"),
            ("Warfarin: Skin Necrosis", "Protein C/S deficiency; day 3–5 of initiation"),
            ("Warfarin: Teratogenicity", "Fetal warfarin syndrome; use heparin in pregnancy"),
            ("HIT (Heparin)", "Heparin-Induced Thrombocytopenia; paradoxical thrombosis; immune-mediated"),
            ("Dabigatran: GI Upset", "Dyspepsia; contains tartaric acid core"),
            ("Heparin: Osteoporosis", "Long-term heparin use; LMWH safer than UFH"),
            ("Heparin: Hyperkalemia", "Suppression of aldosterone secretion"),
        ],
        "bullets": [
            "HIT: Stop heparin immediately; switch to direct thrombin inhibitor (argatroban, bivalirudin).",
            "Warfarin reversal: Vitamin K, FFP, or 4-factor PCC for urgent reversal.",
            "DOACs (rivaroxaban, apixaban, dabigatran) have fewer drug interactions than warfarin.",
            "Dabigatran: only oral anticoagulant with specific reversal agent (idarucizumab).",
            "Andexanet alfa reverses Factor Xa inhibitors (rivaroxaban, apixaban).",
        ]
    },
    {
        "class": "Antiplatelet Agents",
        "color": "#A04000",
        "drugs": "Aspirin, Clopidogrel, Ticagrelor, Prasugrel, Dipyridamole",
        "table_rows": [
            ("GI Bleeding / Ulceration", "Aspirin; COX-1 inhibition reduces gastroprotective prostaglandins"),
            ("Aspirin: Reye's Syndrome", "Children + viral illness; avoid aspirin <18 years"),
            ("Aspirin: Salicylism", "Tinnitus, dizziness with toxicity"),
            ("Clopidogrel: Bleeding", "Active metabolite via CYP2C19; poor metabolizers have reduced effect"),
            ("Ticagrelor: Dyspnea", "Unique non-bleeding SE; reversible bronchoconstriction, mechanism unclear"),
            ("Ticagrelor: Bradycardia", "Ventricular pauses; monitor with 24-h Holter if symptomatic"),
            ("Prasugrel: Intracranial Bleed", "Higher bleeding risk; contraindicated in prior TIA/stroke"),
        ],
        "bullets": [
            "Ticagrelor dyspnea is pathognomonic — does not represent true bronchospasm in most cases.",
            "Clopidogrel requires CYP2C19 activation; PPIs (especially omeprazole) may reduce effect.",
            "Aspirin at low doses inhibits thromboxane A2 (antiplatelet); high doses inhibit prostacyclin too.",
            "Dipyridamole causes headache (vasodilation) — common reason for discontinuation.",
        ]
    },
    {
        "class": "NSAIDs",
        "color": "#B7950B",
        "drugs": "Ibuprofen, Naproxen, Diclofenac, Indomethacin, Celecoxib, Ketorolac",
        "table_rows": [
            ("GI Ulceration / Bleeding", "COX-1 inhibition; reduced mucus and bicarbonate secretion"),
            ("Renal Impairment", "Reduced prostaglandin-mediated renal perfusion; acute kidney injury"),
            ("Fluid Retention / Edema", "Sodium retention; worsen heart failure and hypertension"),
            ("Indomethacin: CNS Effects", "Headache, dizziness, confusion; most CNS-toxic NSAID"),
            ("COX-2 inhibitors: CV Risk", "Celecoxib; ↑ MI and stroke risk (loss of prostacyclin protection)"),
            ("Reye's Syndrome (Aspirin)", "Aspirin specifically in children + viral illness"),
            ("Bronchospasm", "Aspirin/NSAID-exacerbated respiratory disease (AERD); ~10% of asthmatics"),
        ],
        "bullets": [
            "Indomethacin: used to close patent ductus arteriosus (PDA) in neonates.",
            "Celecoxib spares GI mucosa but increases cardiovascular risk.",
            "Ketorolac: most potent analgesic NSAID; limit to ≤5 days due to GI/renal toxicity.",
            "NSAIDs blunt the antihypertensive effect of ACE inhibitors, ARBs, and beta-blockers.",
        ]
    },
    {
        "class": "Opioid Analgesics",
        "color": "#7B241C",
        "drugs": "Morphine, Codeine, Fentanyl, Oxycodone, Tramadol, Methadone, Buprenorphine",
        "table_rows": [
            ("Respiratory Depression", "Most dangerous; μ-receptor mediated; reversed by naloxone"),
            ("Constipation", "Reduced GI motility; does NOT develop tolerance; treat with laxatives"),
            ("Nausea / Vomiting", "Chemoreceptor trigger zone stimulation"),
            ("Miosis (Pinpoint Pupils)", "Pathognomonic of opioid use/toxicity"),
            ("Physical Dependence", "Withdrawal: restlessness, diaphoresis, diarrhea, piloerection"),
            ("Tramadol: Seizures", "Lowers seizure threshold; serotonin syndrome risk"),
            ("Methadone: QT Prolongation", "Torsades de pointes risk; monitor ECG"),
            ("Codeine: Variability", "CYP2D6 ultra-metabolizers: toxic morphine levels"),
        ],
        "bullets": [
            "Morphine releases histamine — causes pruritus, bronchospasm; fentanyl does not.",
            "Constipation is the one opioid side effect with NO tolerance development.",
            "Tramadol: dual mechanism (opioid + SNRI) — risk of serotonin syndrome with SSRIs/MAOIs.",
            "Methadone: long half-life (24–36 h) + QT prolongation = dangerous accumulation risk.",
            "Buprenorphine: partial agonist; ceiling effect on respiratory depression — safer in addiction.",
        ]
    },
    {
        "class": "Corticosteroids",
        "color": "#5D6D7E",
        "drugs": "Prednisolone, Dexamethasone, Hydrocortisone, Methylprednisolone, Betamethasone",
        "table_rows": [
            ("Cushing's Syndrome", "Chronic use: central obesity, moon face, buffalo hump, striae"),
            ("Hyperglycemia", "Increased gluconeogenesis, decreased glucose uptake"),
            ("Osteoporosis", "Reduced osteoblast activity, increased osteoclast activity"),
            ("Adrenal Suppression", "HPA axis suppression; do NOT stop abruptly after prolonged use"),
            ("Immunosuppression", "Increased infection risk; reactivation of TB/viral infections"),
            ("Peptic Ulcer", "Increased acid, reduced mucus; worse with concomitant NSAIDs"),
            ("Cataracts & Glaucoma", "Posterior subcapsular cataracts; raised IOP"),
            ("Psychiatric Effects", "Euphoria, psychosis, depression (steroid psychosis)"),
            ("Growth Suppression", "In children; prolonged use"),
        ],
        "bullets": [
            "Mnemonic for steroid side effects: CUSHINGOID — Cataracts, Ulcers, Skin thinning, Hypertension, Infections, Necrosis (AVN), Growth restriction, Osteoporosis, Immunosuppression, Diabetes.",
            "Avascular necrosis (AVN) of femoral head is a serious long-term complication.",
            "Short-term high-dose: acute psychiatric reactions, hyperglycemia, hypertension.",
            "Dexamethasone: no mineralocorticoid activity; used in cerebral edema, meningitis.",
        ]
    },
    {
        "class": "Antidepressants — SSRIs",
        "color": "#1F618D",
        "drugs": "Fluoxetine, Sertraline, Paroxetine, Escitalopram, Citalopram, Fluvoxamine",
        "table_rows": [
            ("Sexual Dysfunction", "Decreased libido, delayed orgasm/ejaculation; very common (~40%)"),
            ("GI Effects", "Nausea, diarrhea; serotonin in gut; usually transient"),
            ("Insomnia / Agitation", "Especially fluoxetine (activating SSRI)"),
            ("Serotonin Syndrome", "With MAOIs, tramadol, triptans; triad: AMS, autonomic instability, clonus"),
            ("SIADH / Hyponatremia", "Especially in elderly; syndrome of inappropriate ADH"),
            ("Weight Gain", "Paroxetine associated with most weight gain"),
            ("Increased Suicidality", "Black box warning in patients <25 years, especially initial weeks"),
            ("Citalopram: QT Prolongation", "Dose-dependent; avoid >40 mg/day (>20 mg in elderly)"),
        ],
        "bullets": [
            "Paroxetine: most anticholinergic SSRI; shortest half-life — severe discontinuation syndrome.",
            "Fluoxetine: longest half-life (~5 days) — least discontinuation syndrome; inhibits CYP2D6.",
            "Serotonin syndrome vs. NMS: serotonin syndrome has hyperreflexia/clonus; NMS has rigidity.",
            "SSRIs are first-line for depression, anxiety, OCD, PTSD, and panic disorder.",
        ]
    },
    {
        "class": "Antidepressants — TCAs & MAOIs",
        "color": "#1A5276",
        "drugs": "Amitriptyline, Imipramine, Clomipramine, Nortriptyline | Phenelzine, Tranylcypromine",
        "table_rows": [
            ("TCA: Anticholinergic Effects", "Dry mouth, urinary retention, constipation, blurred vision, confusion"),
            ("TCA: Cardiotoxicity", "QRS widening, arrhythmias, hypotension; lethal in overdose"),
            ("TCA: Sedation", "Antihistamine H1 blockade; amitriptyline most sedating"),
            ("TCA: Orthostatic Hypotension", "Alpha-1 blockade"),
            ("MAOI: Hypertensive Crisis", "Tyramine-rich foods (cheese, aged meats, wine) — 'cheese reaction'"),
            ("MAOI: Serotonin Syndrome", "With SSRIs, TCAs, meperidine, tramadol — DANGEROUS"),
            ("MAOI: Orthostatic Hypotension", "Especially phenelzine"),
        ],
        "bullets": [
            "TCA overdose: treat with sodium bicarbonate (reverses cardiotoxicity via Na+ channel).",
            "Clomipramine: most serotonergic TCA; first-line for OCD.",
            "MAOIs require 2-week washout before starting SSRIs (5 weeks for fluoxetine due to long half-life).",
            "Imipramine: used for nocturnal enuresis in children.",
        ]
    },
    {
        "class": "Antipsychotics — Typical (1st Gen)",
        "color": "#512E5F",
        "drugs": "Haloperidol, Chlorpromazine, Fluphenazine, Perphenazine, Thioridazine",
        "table_rows": [
            ("EPS — Acute Dystonia", "Hours to days; spasms of neck, tongue, oculogyric crisis; treat with anticholinergic"),
            ("EPS — Akathisia", "Days to weeks; restlessness; treat with propranolol or benztropine"),
            ("EPS — Parkinsonism", "Weeks; bradykinesia, rigidity, tremor; treat with anticholinergics"),
            ("Tardive Dyskinesia", "Months-years; repetitive orofacial movements; may be irreversible"),
            ("Neuroleptic Malignant Syndrome", "Rare; fever, rigidity, AMS, autonomic instability; stop drug; dantrolene"),
            ("Hyperprolactinemia", "D2 blockade in tuberoinfundibular pathway; gynecomastia, galactorrhea, amenorrhea"),
            ("Thioridazine: Retinal Pigmentation", "Unique to thioridazine; pigmentary retinopathy"),
            ("Chlorpromazine: Photosensitivity", "Corneal deposits; skin discoloration"),
        ],
        "bullets": [
            "EPS risk: High-potency (haloperidol, fluphenazine) > Low-potency (chlorpromazine) > Atypicals.",
            "Tardive dyskinesia: switch to clozapine or quetiapine; valbenazine/deutetrabenazine for treatment.",
            "NMS management: STOP antipsychotic; ICU; dantrolene, bromocriptine.",
        ]
    },
    {
        "class": "Antipsychotics — Atypical (2nd Gen)",
        "color": "#4A235A",
        "drugs": "Clozapine, Olanzapine, Risperidone, Quetiapine, Aripiprazole, Ziprasidone",
        "table_rows": [
            ("Clozapine: Agranulocytosis", "1–2%; mandatory WBC monitoring (ANC); can be fatal"),
            ("Clozapine: Seizures", "Dose-dependent; >600 mg/day risk increases significantly"),
            ("Clozapine: Myocarditis", "Rare but serious; especially in first month of treatment"),
            ("Metabolic Syndrome", "Olanzapine > Clozapine > Quetiapine; weight gain, hyperglycemia, dyslipidemia"),
            ("Risperidone: Hyperprolactinemia", "Most among atypicals; similar to typicals"),
            ("Quetiapine: Sedation", "Antihistamine effect; used for sleep"),
            ("Ziprasidone: QT Prolongation", "Baseline ECG recommended"),
            ("Aripiprazole: Akathisia", "More activating; lower metabolic risk"),
        ],
        "bullets": [
            "Clozapine: ONLY atypical proven to reduce suicidality and treat refractory schizophrenia.",
            "Clozapine requires REMS program enrollment due to agranulocytosis risk.",
            "Olanzapine/fluoxetine combination (Symbyax) approved for bipolar depression.",
            "Metabolic monitoring (weight, glucose, lipids) is essential for all atypical antipsychotics.",
        ]
    },
    {
        "class": "Benzodiazepines",
        "color": "#186A3B",
        "drugs": "Diazepam, Lorazepam, Alprazolam, Clonazepam, Midazolam, Temazepam",
        "table_rows": [
            ("CNS Depression / Sedation", "Most common; dose-dependent"),
            ("Respiratory Depression", "Especially with opioids or alcohol — synergistic"),
            ("Anterograde Amnesia", "Formation of new memories impaired; exploited in drug-facilitated assault"),
            ("Dependence & Withdrawal", "Seizures, delirium on abrupt withdrawal after chronic use"),
            ("Paradoxical Reactions", "Agitation, aggression, disinhibition; especially in elderly/children"),
            ("Teratogenicity", "Cleft palate risk (controversial); neonatal withdrawal syndrome"),
        ],
        "bullets": [
            "Reverse with flumazenil; short-acting — resedation can occur.",
            "Lorazepam: drug of choice for status epilepticus (IV); no active metabolites.",
            "Diazepam has longest half-life; multiple active metabolites (desmethyldiazepam).",
            "Never abruptly stop in chronic users — seizure risk; taper slowly.",
        ]
    },
    {
        "class": "Antibiotics — Penicillins & Cephalosporins",
        "color": "#0E6655",
        "drugs": "Amoxicillin, Ampicillin, Piperacillin | Cephalexin, Ceftriaxone, Cefepime",
        "table_rows": [
            ("Hypersensitivity / Anaphylaxis", "IgE-mediated; most common with penicillins; 1–10% of penicillin-allergic react to cephalosporins"),
            ("Ampicillin: Maculopapular Rash", "Unique non-allergic rash with EBV mononucleosis or CLL"),
            ("Clostridium difficile Colitis", "Especially broad-spectrum agents; diarrhea, pseudomembranous colitis"),
            ("Ceftriaxone: Biliary Sludge", "Pseudolithiasis; cholestatic jaundice especially in neonates"),
            ("Cefepime: Neurotoxicity", "Encephalopathy, seizures in renal impairment"),
        ],
        "bullets": [
            "Ampicillin rash in EBV mononucleosis is not a true allergy — does not predict future penicillin allergy.",
            "Cross-reactivity between penicillins and cephalosporins: ~1–2% (less than older estimates of 10%).",
            "Piperacillin-tazobactam: broadest penicillin; C. diff risk with prolonged use.",
        ]
    },
    {
        "class": "Antibiotics — Fluoroquinolones",
        "color": "#117A65",
        "drugs": "Ciprofloxacin, Levofloxacin, Moxifloxacin, Norfloxacin",
        "table_rows": [
            ("Tendon Rupture", "Achilles tendon; risk ↑ with age, corticosteroids, renal failure"),
            ("QT Prolongation", "Moxifloxacin > levofloxacin; risk of torsades de pointes"),
            ("CNS Effects", "Seizures, confusion, psychosis; especially in elderly"),
            ("Cartilage Damage", "Contraindicated in children and pregnant women (animal data)"),
            ("Phototoxicity", "Ciprofloxacin: sunburn-like reaction"),
            ("Peripheral Neuropathy", "May be irreversible; black box warning"),
        ],
        "bullets": [
            "Fluoroquinolones carry an FDA black box warning for tendinitis/tendon rupture and peripheral neuropathy.",
            "Ciprofloxacin: best for Gram-negative including Pseudomonas aeruginosa.",
            "Moxifloxacin: no renal dose adjustment needed; good for respiratory/intra-abdominal.",
            "Chelate with divalent cations (Ca2+, Mg2+, Al3+, Fe2+) — take 2 hours apart from antacids.",
        ]
    },
    {
        "class": "Antibiotics — Aminoglycosides",
        "color": "#1E8449",
        "drugs": "Gentamicin, Tobramycin, Amikacin, Streptomycin, Neomycin",
        "table_rows": [
            ("Nephrotoxicity", "Proximal tubular necrosis; dose-dependent; monitor creatinine"),
            ("Ototoxicity", "Vestibular AND cochlear; irreversible sensorineural hearing loss"),
            ("Neuromuscular Blockade", "Inhibit acetylcholine release; risk at NMJ; avoid in myasthenia gravis"),
            ("Neomycin: GI Malabsorption", "Oral neomycin inhibits GI flora; malabsorption syndrome"),
        ],
        "bullets": [
            "Once-daily dosing (extended-interval) reduces nephrotoxicity while maintaining efficacy.",
            "Streptomycin: first antibiotic for TB; predominantly vestibulotoxic (not cochleotoxic).",
            "Synergy with cell-wall agents (penicillin/vancomycin) for enterococcal/streptococcal endocarditis.",
            "Monitor peak/trough levels and renal function during therapy.",
        ]
    },
    {
        "class": "Antibiotics — Macrolides & Tetracyclines",
        "color": "#6E2F5E",
        "drugs": "Azithromycin, Clarithromycin, Erythromycin | Doxycycline, Minocycline, Tetracycline",
        "table_rows": [
            ("Erythromycin: GI Dysmotility", "Motilin receptor agonist; nausea, abdominal cramps, diarrhea"),
            ("Macrolides: QT Prolongation", "Azithromycin > clarithromycin > erythromycin; cardiac arrhythmia risk"),
            ("Macrolides: Drug Interactions", "CYP3A4 inhibition (clarithromycin, erythromycin); not azithromycin"),
            ("Tetracyclines: Teeth Discoloration", "Permanent yellowing in children <8 years; binds Ca2+ in bone/teeth"),
            ("Tetracyclines: Photosensitivity", "Doxycycline especially; sunburn-like reactions"),
            ("Tetracyclines: Esophagitis", "Take with plenty of water; remain upright; doxycycline worst"),
            ("Minocycline: Vestibular", "Vertigo, dizziness; unique among tetracyclines"),
            ("Tetracyclines: Hepatotoxicity", "High IV doses especially in pregnancy"),
        ],
        "bullets": [
            "Doxycycline: drug of choice for Lyme disease, rickettsial infections, chlamydia, atypicals.",
            "Azithromycin 'Z-pack': short course due to long tissue half-life; QT risk in cardiac patients.",
            "Tetracyclines are absolutely contraindicated in pregnancy and children <8 years.",
            "Minocycline: used for acne; also causes drug-induced lupus and blue-gray skin pigmentation.",
        ]
    },
    {
        "class": "Antibiotics — Vancomycin & Linezolid",
        "color": "#7B241C",
        "drugs": "Vancomycin, Linezolid, Teicoplanin",
        "table_rows": [
            ("Vancomycin: Red Man Syndrome", "Histamine release (not IgE); flushing, erythema of face/neck/chest; slow infusion prevents it"),
            ("Vancomycin: Nephrotoxicity", "Especially with aminoglycosides or high trough levels"),
            ("Vancomycin: Ototoxicity", "Rare; mostly at high serum levels"),
            ("Linezolid: Myelosuppression", "Thrombocytopenia, anemia; monitor CBC; occurs after >2 weeks"),
            ("Linezolid: Serotonin Syndrome", "MAO-A inhibition; avoid with SSRIs, SNRIs, tramadol"),
            ("Linezolid: Optic Neuropathy", "Long-term use; may be irreversible; monitor vision"),
        ],
        "bullets": [
            "Red Man Syndrome is NOT an allergy; slow infusion (over 60+ minutes) prevents it.",
            "Linezolid is bacteriostatic against Enterococcus but bactericidal against Streptococcus.",
            "Vancomycin: gold standard for MRSA; monitor AUC/MIC ratio for dosing.",
            "Linezolid: weak, reversible MAO-A inhibitor — dietary tyramine restriction recommended for long-term use.",
        ]
    },
    {
        "class": "Antifungals",
        "color": "#1A5276",
        "drugs": "Amphotericin B, Fluconazole, Itraconazole, Voriconazole, Caspofungin",
        "table_rows": [
            ("Amphotericin B: Nephrotoxicity", "Most common limiting toxicity; hydration reduces risk; liposomal form safer"),
            ("Amphotericin B: Infusion Reactions", "Fever, chills, rigors, headache; give premedication"),
            ("Amphotericin B: Electrolyte Wasting", "Hypokalemia, hypomagnesemia; supplement aggressively"),
            ("Azoles: Hepatotoxicity", "LFT monitoring required; itraconazole > fluconazole"),
            ("Azoles: Drug Interactions", "CYP3A4/2C9 inhibition; fluconazole especially potent"),
            ("Voriconazole: Visual Disturbances", "Transient photopsia ('seeing flashes/colors'); reversible"),
            ("Voriconazole: Phototoxicity", "Increased skin cancer risk with prolonged use"),
            ("Caspofungin: Hepatotoxicity", "Transient liver enzyme elevation"),
        ],
        "bullets": [
            "Amphotericin B: 'Ampho-terrible' due to infusion side effects; liposomal formulation reduces nephrotoxicity.",
            "Fluconazole: does NOT cover Aspergillus or Mucor; best for Candida.",
            "Voriconazole: drug of choice for invasive Aspergillosis.",
            "Caspofungin: echinocandin; used for Candida and Aspergillus; minimal drug interactions.",
        ]
    },
    {
        "class": "Antidiabetics — Oral Agents",
        "color": "#117A65",
        "drugs": "Metformin, Glipizide, Pioglitazone, Sitagliptin, Dapagliflozin, Acarbose",
        "table_rows": [
            ("Metformin: Lactic Acidosis", "Rare but serious; withhold before IV contrast; contraindicated in renal failure (eGFR <30)"),
            ("Metformin: GI Effects", "Nausea, diarrhea, metallic taste; start low/slow with meals"),
            ("Metformin: B12 Deficiency", "Long-term use reduces B12 absorption; monitor levels"),
            ("Sulfonylureas: Hypoglycemia", "Stimulate insulin regardless of glucose; risk with missed meals"),
            ("Sulfonylureas: Weight Gain", "Increased insulin secretion promotes fat storage"),
            ("Pioglitazone: Fluid Retention", "PPAR-γ; edema, heart failure exacerbation; contraindicated in HF"),
            ("Pioglitazone: Bladder Cancer", "Possible increased risk with long-term use"),
            ("SGLT-2i: UTI & Genital Infections", "Glycosuria promotes yeast/bacterial growth; dapagliflozin, empagliflozin"),
            ("SGLT-2i: DKA", "Euglycemic DKA; withhold perioperatively"),
            ("SGLT-2i: Fournier's Gangrene", "Rare necrotizing fasciitis of perineum; black box warning"),
            ("DPP-4i: Pancreatitis", "Sitagliptin, saxagliptin; monitor for abdominal pain"),
            ("Acarbose: Flatulence", "Carbohydrate fermentation in colon; very common"),
        ],
        "bullets": [
            "Metformin: first-line for T2DM; no hypoglycemia risk as monotherapy; weight-neutral to -ve.",
            "SGLT-2 inhibitors reduce cardiovascular and renal mortality — significant benefit beyond glucose.",
            "GLP-1 receptor agonists (semaglutide, liraglutide): significant weight loss, CV benefit, but nausea and pancreatitis risk.",
            "Pioglitazone: only TZD with CV benefit (PROactive trial); rosiglitazone withdrawn due to MI risk.",
        ]
    },
    {
        "class": "Insulin",
        "color": "#0E6655",
        "drugs": "Regular, NPH, Glargine, Detemir, Lispro, Aspart, Degludec",
        "table_rows": [
            ("Hypoglycemia", "Most common and dangerous; all insulins; worse with mismatched meals"),
            ("Weight Gain", "Anabolic effect; all insulins"),
            ("Lipodystrophy", "Lipoatrophy or lipohypertrophy at injection sites; rotate sites"),
            ("Hypokalemia", "Insulin drives K+ into cells; monitor in DKA treatment"),
            ("Insulin Glargine: No Peak", "Cannot be mixed with other insulins; painful if diluted"),
        ],
        "bullets": [
            "Hypoglycemia: unawareness more common with recurrent episodes; teach glucagon kit use.",
            "Site rotation: abdomen > arm > thigh for absorption rate.",
            "Somogyi effect: rebound hyperglycemia from overnight hypoglycemia; reduce evening dose.",
            "Dawn phenomenon: early morning hyperglycemia from cortisol/GH surge; increase basal insulin.",
        ]
    },
    {
        "class": "Antiepileptics",
        "color": "#2C3E50",
        "drugs": "Phenytoin, Valproate, Carbamazepine, Lamotrigine, Levetiracetam, Phenobarbital, Topiramate",
        "table_rows": [
            ("Phenytoin: Gingival Hyperplasia", "Overgrowth of gum tissue; dose-related"),
            ("Phenytoin: Hirsutism", "Increased body hair; cosmetically distressing"),
            ("Phenytoin: Folate Deficiency", "Impairs folate absorption; megaloblastic anemia"),
            ("Phenytoin: Nystagmus/Ataxia", "Dose-dependent CNS toxicity (cerebellar signs)"),
            ("Valproate: Hepatotoxicity", "Fatal in children <2 years; Reye-like syndrome"),
            ("Valproate: Teratogenicity", "Neural tube defects (spina bifida); highest teratogenicity of AEDs"),
            ("Valproate: Pancreatitis", "Rare but serious; abdominal pain, elevated amylase"),
            ("Valproate: Weight Gain & Alopecia", "Very common; hair may regrow with zinc/selenium"),
            ("Carbamazepine: SIADH", "Hyponatremia; dose-dependent"),
            ("Carbamazepine: Agranulocytosis", "Rare; monitor CBC"),
            ("Carbamazepine: Stevens-Johnson", "HLA-B*1502 allele (Asian populations); screen before use"),
            ("Lamotrigine: Stevens-Johnson", "Dose titration must be slow; severe rash risk"),
            ("Topiramate: Kidney Stones", "Carbonic anhydrase inhibition; uric acid stones"),
            ("Topiramate: Cognitive Impairment", "'Dopamax' — word-finding difficulty, slowed cognition"),
            ("Levetiracetam: Psychiatric", "Irritability, aggression, depression; monitor mood"),
        ],
        "bullets": [
            "Valproate: broadest-spectrum AED (absence, tonic-clonic, myoclonic, focal); avoid in women of childbearing age.",
            "Phenytoin: zero-order kinetics at therapeutic doses — small dose increases can cause toxicity.",
            "Carbamazepine: enzyme inducer (CYP3A4); reduces efficacy of OCP, warfarin, other AEDs.",
            "Lamotrigine: slow titration prevents SJS rash; safest AED in pregnancy after folate supplementation.",
        ]
    },
    {
        "class": "Antiretrovirals (ARVs)",
        "color": "#154360",
        "drugs": "Tenofovir, Emtricitabine, Efavirenz, Dolutegravir, Ritonavir, Abacavir",
        "table_rows": [
            ("Tenofovir: Nephrotoxicity", "Proximal tubular dysfunction (Fanconi syndrome); monitor renal function"),
            ("Tenofovir: Bone Loss", "Decreased bone mineral density; Ca/Vit D supplementation"),
            ("Abacavir: Hypersensitivity", "HLA-B*5701 — life-threatening; screen before use; do not rechallenge"),
            ("Efavirenz: CNS Effects", "Vivid dreams, nightmares, dizziness; take at bedtime; teratogenic"),
            ("Ritonavir: Drug Interactions", "Potent CYP3A4 inhibitor; used as 'booster' to elevate other PI levels"),
            ("NRTIs: Lactic Acidosis", "Mitochondrial toxicity; stavudine and zidovudine worst"),
            ("Integrase Inhibitors: Weight Gain", "Dolutegravir, bictegravir; metabolic effects"),
        ],
        "bullets": [
            "Abacavir: always screen HLA-B*5701 before starting; hypersensitivity is FATAL on rechallenge.",
            "Efavirenz: contraindicated in first trimester pregnancy (neural tube defects in primates).",
            "Ritonavir low-dose boosting: increases trough levels of co-administered PIs.",
            "All HIV patients need monitoring for metabolic syndrome, lipodystrophy, and cardiovascular risk.",
        ]
    },
    {
        "class": "Chemotherapy — Key Examples",
        "color": "#922B21",
        "drugs": "Cyclophosphamide, Methotrexate, Cisplatin, Doxorubicin, Bleomycin, Vincristine",
        "table_rows": [
            ("Cyclophosphamide: Hemorrhagic Cystitis", "Acrolein metabolite; prevent with mesna and hydration"),
            ("Cyclophosphamide: SIADH", "At high doses used in bone marrow transplant conditioning"),
            ("Cisplatin: Nephrotoxicity", "Most nephrotoxic chemo; aggressive hydration required; tubular damage"),
            ("Cisplatin: Ototoxicity", "High-frequency hearing loss; cumulative dose-related"),
            ("Cisplatin: Peripheral Neuropathy", "Dose-limiting; glove-and-stocking distribution"),
            ("Doxorubicin: Cardiotoxicity", "Dilated cardiomyopathy; cumulative dose-related (>550 mg/m²); dexrazoxane cardioprotective"),
            ("Bleomycin: Pulmonary Fibrosis", "Dose-limiting; avoid supplemental O2 (worsens fibrosis)"),
            ("Methotrexate: Mucositis/Myelosuppression", "Folate antagonist; rescue with leucovorin"),
            ("Vincristine: Peripheral Neuropathy", "Dose-limiting; areflexia, sensory/motor neuropathy"),
            ("Vincristine: SIADH", "Unique vinca alkaloid SE"),
        ],
        "bullets": [
            "Doxorubicin cardiotoxicity: monitor LVEF with ECHO; lifetime cumulative dose limit <550 mg/m².",
            "Bleomycin: contraindicated with high FiO2 — elevated O2 radically worsens pulmonary toxicity.",
            "Methotrexate rescue: leucovorin (folinic acid) given after high-dose MTX to protect normal cells.",
            "Cisplatin vs. Carboplatin: cisplatin more nephro/ototoxic; carboplatin more myelosuppressive.",
        ]
    },
]

# ─── PDF Generation ────────────────────────────────────────────────────────────

OUTPUT_PATH = "/tmp/workspace/drug-side-effects/Drug_Side_Effects_Reference.pdf"

PAGE_W, PAGE_H = A4

def header_footer(canvas_obj, doc):
    canvas_obj.saveState()
    # Header bar
    canvas_obj.setFillColor(colors.HexColor("#1B2631"))
    canvas_obj.rect(0, PAGE_H - 28*mm, PAGE_W, 28*mm, fill=1, stroke=0)
    canvas_obj.setFont("Helvetica-Bold", 14)
    canvas_obj.setFillColor(colors.white)
    canvas_obj.drawString(15*mm, PAGE_H - 17*mm, "Drug Side Effects Reference Guide")
    canvas_obj.setFont("Helvetica", 9)
    canvas_obj.drawRightString(PAGE_W - 15*mm, PAGE_H - 17*mm, f"Generated: {datetime.date.today().strftime('%B %d, %Y')}")
    # Footer
    canvas_obj.setFillColor(colors.HexColor("#1B2631"))
    canvas_obj.rect(0, 0, PAGE_W, 12*mm, fill=1, stroke=0)
    canvas_obj.setFont("Helvetica", 8)
    canvas_obj.setFillColor(colors.white)
    canvas_obj.drawString(15*mm, 4*mm, "For educational use only. Always consult current prescribing information and clinical guidelines.")
    canvas_obj.drawRightString(PAGE_W - 15*mm, 4*mm, f"Page {doc.page}")
    canvas_obj.restoreState()

doc = BaseDocTemplate(
    OUTPUT_PATH,
    pagesize=A4,
    leftMargin=15*mm,
    rightMargin=15*mm,
    topMargin=35*mm,
    bottomMargin=20*mm,
)

frame = Frame(doc.leftMargin, doc.bottomMargin, doc.width, doc.height, id='normal')
template = PageTemplate(id='main', frames=[frame], onPage=header_footer)
doc.addPageTemplates([template])

styles = getSampleStyleSheet()

# Custom styles
title_style = ParagraphStyle(
    'DrugTitle',
    parent=styles['Heading1'],
    fontSize=13,
    textColor=colors.white,
    spaceAfter=4,
    spaceBefore=2,
    leading=16,
)
subtitle_style = ParagraphStyle(
    'SubTitle',
    parent=styles['Normal'],
    fontSize=9,
    textColor=colors.HexColor("#BFC9CA"),
    spaceAfter=6,
    italic=True,
)
bullet_style = ParagraphStyle(
    'BulletPoint',
    parent=styles['Normal'],
    fontSize=8.5,
    leftIndent=10,
    spaceAfter=3,
    leading=12,
    textColor=colors.HexColor("#1C2833"),
)
section_label = ParagraphStyle(
    'SectionLabel',
    parent=styles['Normal'],
    fontSize=8,
    textColor=colors.HexColor("#5D6D7E"),
    spaceAfter=3,
    fontName='Helvetica-Bold',
    spaceBefore=8,
)
cover_title = ParagraphStyle(
    'CoverTitle',
    parent=styles['Title'],
    fontSize=28,
    textColor=colors.HexColor("#1B2631"),
    spaceAfter=8,
    alignment=TA_CENTER,
    fontName='Helvetica-Bold',
)
cover_sub = ParagraphStyle(
    'CoverSub',
    parent=styles['Normal'],
    fontSize=12,
    textColor=colors.HexColor("#5D6D7E"),
    spaceAfter=6,
    alignment=TA_CENTER,
)

story = []

# ─── Cover Page ────────────────────────────────────────────────────────────────
story.append(Spacer(1, 3*cm))
story.append(Paragraph("Drug Side Effects", cover_title))
story.append(Paragraph("Reference Guide", cover_title))
story.append(Spacer(1, 0.5*cm))
story.append(HRFlowable(width="70%", thickness=3, color=colors.HexColor("#1B4F72"), hAlign='CENTER'))
story.append(Spacer(1, 0.5*cm))
story.append(Paragraph("Key & Unique Adverse Effects Across All Major Drug Classes", cover_sub))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph(f"Compiled from Goodman & Gilman's, Harrison's, and standard pharmacology references", cover_sub))
story.append(Spacer(1, 2*cm))

# Summary table on cover
cover_data = [
    ["Drug Class", "No. of Drugs"],
]
for d in DRUG_DATA:
    cover_data.append([d["class"], d["drugs"].count(",") + 1])

cover_table = Table(cover_data, colWidths=[10*cm, 4*cm])
cover_table.setStyle(TableStyle([
    ('BACKGROUND', (0, 0), (-1, 0), colors.HexColor("#1B2631")),
    ('TEXTCOLOR', (0, 0), (-1, 0), colors.white),
    ('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'),
    ('FONTSIZE', (0, 0), (-1, 0), 10),
    ('ROWBACKGROUNDS', (0, 1), (-1, -1), [colors.HexColor("#EBF5FB"), colors.white]),
    ('FONTSIZE', (0, 1), (-1, -1), 8.5),
    ('ALIGN', (1, 0), (1, -1), 'CENTER'),
    ('GRID', (0, 0), (-1, -1), 0.5, colors.HexColor("#AEB6BF")),
    ('TOPPADDING', (0, 0), (-1, -1), 4),
    ('BOTTOMPADDING', (0, 0), (-1, -1), 4),
    ('LEFTPADDING', (0, 0), (-1, -1), 8),
]))
story.append(cover_table)
story.append(Spacer(1, 1*cm))
story.append(Paragraph(f"Total: {len(DRUG_DATA)} Major Drug Classes | {datetime.date.today().strftime('%B %Y')}", cover_sub))
story.append(PageBreak())

# ─── Drug Class Pages ──────────────────────────────────────────────────────────
for drug in DRUG_DATA:
    color_hex = drug["color"]
    bg_color = colors.HexColor(color_hex)

    elements = []

    # Class header bar
    header_table = Table(
        [[Paragraph(f'<b>{drug["class"]}</b>', title_style)]],
        colWidths=[doc.width],
    )
    header_table.setStyle(TableStyle([
        ('BACKGROUND', (0, 0), (-1, -1), bg_color),
        ('TOPPADDING', (0, 0), (-1, -1), 8),
        ('BOTTOMPADDING', (0, 0), (-1, -1), 8),
        ('LEFTPADDING', (0, 0), (-1, -1), 10),
        ('ROUNDEDCORNERS', [4, 4, 4, 4]),
    ]))
    elements.append(header_table)

    # Drugs list
    elements.append(Spacer(1, 2))
    elements.append(Paragraph(f"Representative Drugs: {drug['drugs']}", subtitle_style))
    elements.append(Spacer(1, 4))

    # Table section label
    elements.append(Paragraph("KEY & UNIQUE SIDE EFFECTS", section_label))

    # Side effects table
    table_data = [
        [
            Paragraph('<b>Side Effect</b>', ParagraphStyle('th', parent=styles['Normal'], fontSize=8.5, textColor=colors.white, fontName='Helvetica-Bold')),
            Paragraph('<b>Notes / Mechanism</b>', ParagraphStyle('th', parent=styles['Normal'], fontSize=8.5, textColor=colors.white, fontName='Helvetica-Bold')),
        ]
    ]
    for row in drug["table_rows"]:
        table_data.append([
            Paragraph(row[0], ParagraphStyle('td_bold', parent=styles['Normal'], fontSize=8, fontName='Helvetica-Bold', textColor=colors.HexColor("#1B2631"))),
            Paragraph(row[1], ParagraphStyle('td', parent=styles['Normal'], fontSize=8, textColor=colors.HexColor("#2C3E50"))),
        ])

    se_table = Table(table_data, colWidths=[5.5*cm, 12*cm])
    se_table.setStyle(TableStyle([
        ('BACKGROUND', (0, 0), (-1, 0), bg_color),
        ('ROWBACKGROUNDS', (0, 1), (-1, -1), [colors.HexColor("#F2F3F4"), colors.white]),
        ('GRID', (0, 0), (-1, -1), 0.5, colors.HexColor("#CCD1D1")),
        ('VALIGN', (0, 0), (-1, -1), 'TOP'),
        ('TOPPADDING', (0, 0), (-1, -1), 5),
        ('BOTTOMPADDING', (0, 0), (-1, -1), 5),
        ('LEFTPADDING', (0, 0), (-1, -1), 6),
        ('RIGHTPADDING', (0, 0), (-1, -1), 6),
    ]))
    elements.append(se_table)

    # Bullet notes
    elements.append(Spacer(1, 6))
    elements.append(Paragraph("CLINICAL PEARLS", section_label))
    for b in drug["bullets"]:
        elements.append(Paragraph(f"\u2022  {b}", bullet_style))

    elements.append(Spacer(1, 6))
    story.append(KeepTogether(elements[:4]))  # Keep header + first few rows together
    story.extend(elements[4:])
    story.append(Spacer(1, 8))
    story.append(HRFlowable(width="100%", thickness=0.5, color=colors.HexColor("#BFC9CA")))
    story.append(Spacer(1, 6))

# Build
doc.build(story)
print(f"PDF generated: {OUTPUT_PATH}")
Running Command

cd /tmp/workspace/drug-side-effects && python generate_pdf.py

Running Command

ls -lh /tmp/workspace/drug-side-effects/Drug_Side_Effects_Reference.pdf

Your PDF is ready:

Drug Side Effects Reference

PDF Document · PDF


Here's what's inside:
28 Major Drug Classes covered, including:
CategoryClasses
CardiovascularACE Inhibitors, ARBs, Beta-Blockers, CCBs, Thiazides, Loop Diuretics, K+-Sparing Diuretics
Lipid-LoweringStatins, Fibrates
CoagulationAnticoagulants (Warfarin, Heparin, DOACs), Antiplatelet Agents
Pain / InflammationNSAIDs, Opioids, Corticosteroids
PsychiatrySSRIs, TCAs/MAOIs, Typical Antipsychotics, Atypical Antipsychotics, Benzodiazepines
AntibioticsPenicillins/Cephalosporins, Fluoroquinolones, Aminoglycosides, Macrolides/Tetracyclines, Vancomycin/Linezolid
OtherAntifungals, Antidiabetics (oral), Insulin, Antiepileptics, Antiretrovirals, Chemotherapy
Format per drug class:
  • Color-coded header with representative drug names
  • Side effects table - effect name + mechanism/clinical note
  • Clinical pearls - bullet points with high-yield facts, mnemonics, and unique distinguishing features (e.g., ticagrelor dyspnea, ampicillin rash in EBV, red man syndrome, opioid constipation with no tolerance)
Sources: Goodman & Gilman's Pharmacological Basis of Therapeutics, Harrison's Principles of Internal Medicine, and standard pharmacology references.

Create a drug interactions PDF (major CYP450, transporters, toxicity combinations)

Finding Sources
Finding Sources
Writing File

~/drug-side-effects/generate_interactions_pdf.py

from reportlab.lib.pagesizes import A4, landscape
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.platypus import (
    SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
    HRFlowable, PageBreak, KeepTogether, BaseDocTemplate, Frame, PageTemplate
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT
import datetime

OUTPUT_PATH = "/tmp/workspace/drug-side-effects/Drug_Interactions_Reference.pdf"
PAGE_W, PAGE_H = A4

# ─── COLOUR PALETTE ────────────────────────────────────────────────────────────
C_DARK    = colors.HexColor("#1B2631")
C_RED     = colors.HexColor("#922B21")
C_ORANGE  = colors.HexColor("#BA4A00")
C_YELLOW  = colors.HexColor("#B7950B")
C_GREEN   = colors.HexColor("#1E8449")
C_BLUE    = colors.HexColor("#1F618D")
C_PURPLE  = colors.HexColor("#6C3483")
C_TEAL    = colors.HexColor("#117A65")
C_NAVY    = colors.HexColor("#154360")
C_ROW1    = colors.HexColor("#F2F3F4")
C_ROW2    = colors.white
C_GRID    = colors.HexColor("#CCD1D1")
C_WARN    = colors.HexColor("#FDFEFE")
C_WARN_BG = colors.HexColor("#FDEDEC")

# ─── STYLES ────────────────────────────────────────────────────────────────────
styles = getSampleStyleSheet()

def make_style(name, parent='Normal', **kwargs):
    return ParagraphStyle(name, parent=styles[parent], **kwargs)

h1 = make_style('H1', 'Heading1', fontSize=13, textColor=colors.white, spaceAfter=2, spaceBefore=2, leading=16, fontName='Helvetica-Bold')
h2 = make_style('H2', 'Normal', fontSize=9.5, textColor=C_DARK, spaceAfter=4, spaceBefore=6, fontName='Helvetica-Bold')
body = make_style('Body', fontSize=8, textColor=C_DARK, leading=11, spaceAfter=2)
bullet_s = make_style('Bullet', fontSize=8.5, leftIndent=10, spaceAfter=3, leading=12, textColor=C_DARK)
label_s = make_style('Label', fontSize=7.5, textColor=colors.HexColor("#5D6D7E"), spaceAfter=3, fontName='Helvetica-Bold', spaceBefore=8)
cover_title_s = make_style('CoverTitle', 'Title', fontSize=30, textColor=C_DARK, spaceAfter=8, alignment=TA_CENTER, fontName='Helvetica-Bold')
cover_sub_s = make_style('CoverSub', fontSize=11, textColor=colors.HexColor("#5D6D7E"), spaceAfter=6, alignment=TA_CENTER)
warn_s = make_style('Warn', fontSize=8.5, textColor=C_RED, fontName='Helvetica-Bold', spaceAfter=2)
td_bold = make_style('TDBold', fontSize=8, fontName='Helvetica-Bold', textColor=C_DARK)
td_norm = make_style('TDNorm', fontSize=8, textColor=colors.HexColor("#2C3E50"), leading=11)
th_s = make_style('TH', fontSize=8.5, textColor=colors.white, fontName='Helvetica-Bold')

def hdr_bar(text, color=C_DARK):
    t = Table([[Paragraph(f'<b>{text}</b>', h1)]], colWidths=[180*mm])
    t.setStyle(TableStyle([
        ('BACKGROUND', (0,0),(-1,-1), color),
        ('TOPPADDING', (0,0),(-1,-1), 7),
        ('BOTTOMPADDING', (0,0),(-1,-1), 7),
        ('LEFTPADDING', (0,0),(-1,-1), 10),
    ]))
    return t

def section_table(headers, rows, col_widths, hdr_color=C_DARK):
    data = [[Paragraph(h, th_s) for h in headers]] + \
           [[Paragraph(str(cell), td_bold if i == 0 else td_norm) for i, cell in enumerate(row)] for row in rows]
    t = Table(data, colWidths=col_widths)
    t.setStyle(TableStyle([
        ('BACKGROUND', (0,0),(-1,0), hdr_color),
        ('ROWBACKGROUNDS', (0,1),(-1,-1), [C_ROW1, C_ROW2]),
        ('GRID', (0,0),(-1,-1), 0.5, C_GRID),
        ('VALIGN', (0,0),(-1,-1), 'TOP'),
        ('TOPPADDING', (0,0),(-1,-1), 5),
        ('BOTTOMPADDING', (0,0),(-1,-1), 5),
        ('LEFTPADDING', (0,0),(-1,-1), 6),
        ('RIGHTPADDING', (0,0),(-1,-1), 6),
    ]))
    return t

def bullets(items):
    return [Paragraph(f"\u2022  {i}", bullet_s) for i in items]

def spacer(h=6):
    return Spacer(1, h)

def hr():
    return HRFlowable(width="100%", thickness=0.5, color=C_GRID)

def page_break():
    return PageBreak()

# ─── HEADER / FOOTER ──────────────────────────────────────────────────────────
def header_footer(canvas_obj, doc):
    canvas_obj.saveState()
    canvas_obj.setFillColor(C_DARK)
    canvas_obj.rect(0, PAGE_H - 28*mm, PAGE_W, 28*mm, fill=1, stroke=0)
    canvas_obj.setFont("Helvetica-Bold", 13)
    canvas_obj.setFillColor(colors.white)
    canvas_obj.drawString(15*mm, PAGE_H - 16*mm, "Drug Interactions Reference Guide")
    canvas_obj.setFont("Helvetica", 8.5)
    canvas_obj.drawRightString(PAGE_W - 15*mm, PAGE_H - 16*mm, f"Generated: {datetime.date.today().strftime('%B %d, %Y')}")
    canvas_obj.setFont("Helvetica", 7.5)
    canvas_obj.setFillColor(colors.HexColor("#AEB6BF"))
    canvas_obj.drawString(15*mm, PAGE_H - 24*mm, "CYP450 Enzymes  |  Drug Transporters  |  Dangerous Combinations  |  QT Prolongation  |  Serotonin Syndrome  |  NMS")
    # Footer
    canvas_obj.setFillColor(C_DARK)
    canvas_obj.rect(0, 0, PAGE_W, 12*mm, fill=1, stroke=0)
    canvas_obj.setFont("Helvetica", 8)
    canvas_obj.setFillColor(colors.white)
    canvas_obj.drawString(15*mm, 4*mm, "For educational use only. Verify all interactions with current prescribing information before clinical use.")
    canvas_obj.drawRightString(PAGE_W - 15*mm, 4*mm, f"Page {doc.page}")
    canvas_obj.restoreState()

doc = BaseDocTemplate(
    OUTPUT_PATH, pagesize=A4,
    leftMargin=15*mm, rightMargin=15*mm,
    topMargin=35*mm, bottomMargin=20*mm,
)
frame = Frame(doc.leftMargin, doc.bottomMargin, doc.width, doc.height, id='normal')
template = PageTemplate(id='main', frames=[frame], onPage=header_footer)
doc.addPageTemplates([template])

story = []

# ══════════════════════════════════════════════════════════════════════════════
# COVER PAGE
# ══════════════════════════════════════════════════════════════════════════════
story += [
    spacer(40),
    Paragraph("Drug Interactions", cover_title_s),
    Paragraph("Reference Guide", cover_title_s),
    spacer(6),
    HRFlowable(width="70%", thickness=3, color=C_BLUE, hAlign='CENTER'),
    spacer(8),
    Paragraph("CYP450 Enzymes · Drug Transporters · Dangerous Pharmacodynamic Combinations", cover_sub_s),
    Paragraph("QT Prolongation · Serotonin Syndrome · Bleeding Risk · Nephrotoxicity · Additive CNS Depression", cover_sub_s),
    spacer(16),
]

# Cover index table
cover_sections = [
    ["Section", "Topic", "Page"],
    ["1", "CYP450 Overview & Enzyme Map", "—"],
    ["2", "CYP3A4 – Inhibitors, Inducers, Substrates", "—"],
    ["3", "CYP2D6 – Inhibitors, Inducers, Substrates", "—"],
    ["4", "CYP2C9 – Inhibitors, Inducers, Substrates", "—"],
    ["5", "CYP2C19 – Inhibitors, Inducers, Substrates", "—"],
    ["6", "CYP1A2 – Inhibitors, Inducers, Substrates", "—"],
    ["7", "CYP2E1 – Inducers & Toxicity", "—"],
    ["8", "Drug Transporters (P-gp, OATP, OCT, BCRP)", "—"],
    ["9", "QT-Prolonging Drug Combinations", "—"],
    ["10", "Serotonin Syndrome Combinations", "—"],
    ["11", "Bleeding Risk Combinations", "—"],
    ["12", "Nephrotoxic Combinations", "—"],
    ["13", "Additive CNS / Respiratory Depression", "—"],
    ["14", "Hypertensive Crisis Combinations", "—"],
    ["15", "High-Yield Dangerous Pair Summary", "—"],
]
cov_t = Table(
    [[Paragraph(c if i==0 else str(c), th_s if i==0 else (td_bold if j==0 else td_norm))
      for j, c in enumerate(row)]
     for i, row in enumerate(cover_sections)],
    colWidths=[1.5*cm, 11*cm, 2*cm]
)
cov_t.setStyle(TableStyle([
    ('BACKGROUND', (0,0),(-1,0), C_DARK),
    ('ROWBACKGROUNDS', (0,1),(-1,-1), [C_ROW1, C_ROW2]),
    ('GRID', (0,0),(-1,-1), 0.5, C_GRID),
    ('ALIGN', (0,0),(-1,-1), 'LEFT'),
    ('ALIGN', (2,0),(2,-1), 'CENTER'),
    ('TOPPADDING', (0,0),(-1,-1), 5),
    ('BOTTOMPADDING', (0,0),(-1,-1), 5),
    ('LEFTPADDING', (0,0),(-1,-1), 8),
]))
story.append(cov_t)
story.append(spacer(10))
story.append(Paragraph("Source: Goodman & Gilman's, Katzung's Basic & Clinical Pharmacology, Harrison's Principles of Internal Medicine", cover_sub_s))
story.append(page_break())

# ══════════════════════════════════════════════════════════════════════════════
# SECTION 1 — CYP450 OVERVIEW
# ══════════════════════════════════════════════════════════════════════════════
story += [
    hdr_bar("SECTION 1 — CYP450 Overview", C_DARK),
    spacer(6),
    Paragraph("WHAT IS CYP450?", label_s),
]
story += bullets([
    "CYP450 (cytochrome P450) enzymes are the primary oxidative metabolising system in the liver (and intestinal wall).",
    "They account for ~75% of all drug metabolism. The most clinically important isoforms are CYP3A4, CYP2D6, CYP2C9, CYP2C19, and CYP1A2.",
    "INHIBITORS raise substrate plasma levels (toxicity risk). INDUCERS lower substrate levels (therapeutic failure risk).",
    "A drug can be a SUBSTRATE (metabolised by the enzyme), INHIBITOR (blocks the enzyme), INDUCER (upregulates the enzyme), or any combination.",
    "Prodrugs require CYP activation — inhibition of the converting enzyme reduces efficacy (e.g., clopidogrel via CYP2C19).",
])
story.append(spacer(8))
story.append(Paragraph("CYP450 ISOFORM QUICK-REFERENCE", label_s))
cyp_overview = [
    ["Isoform", "% of Hepatic CYP", "Key Substrates (examples)", "Inhibited by", "Induced by"],
    ["CYP3A4/5", "~30–40%", "Statins, benzodiazepines, cyclosporin, tacrolimus, HIV PIs, many CCBs, macrolides", "Ketoconazole, ritonavir, grapefruit", "Rifampin, carbamazepine, St. John's Wort, phenytoin"],
    ["CYP2D6", "~20–25%", "TCAs, SSRIs, codeine, tamoxifen, beta-blockers (metoprolol, carvedilol), antipsychotics", "Fluoxetine, paroxetine, bupropion, quinidine", "Rifampin (mild); no strong inducers"],
    ["CYP2C9", "~15–20%", "Warfarin (S-), NSAIDs, phenytoin, glipizide, losartan, celecoxib", "Fluconazole, amiodarone, metronidazole", "Rifampin, carbamazepine, phenobarbital"],
    ["CYP2C19", "~10%", "Clopidogrel (prodrug), PPIs, diazepam, escitalopram, voriconazole", "Fluconazole, fluvoxamine, omeprazole", "Rifampin, carbamazepine, St. John's Wort"],
    ["CYP1A2", "~10–15%", "Theophylline, caffeine, clozapine, olanzapine, warfarin (R-), tizanidine", "Fluvoxamine, ciprofloxacin, enoxacin", "Smoking, omeprazole, rifampin, char-grilled food"],
    ["CYP2E1", "~5%", "Ethanol, paracetamol, halothane, isoniazid", "Disulfiram, isoniazid", "Chronic ethanol, isoniazid (low doses), fasting"],
]
story.append(section_table(
    cyp_overview[0], cyp_overview[1:],
    [2.5*cm, 2.5*cm, 5.5*cm, 4.5*cm, 4.5*cm],
    C_DARK
))
story += [spacer(8), hr(), spacer(6)]

# ══════════════════════════════════════════════════════════════════════════════
# SECTION 2 — CYP3A4
# ══════════════════════════════════════════════════════════════════════════════
story += [
    hdr_bar("SECTION 2 — CYP3A4: Most Important Isoform (~30–40% of Hepatic Metabolism)", C_BLUE),
    spacer(4),
    Paragraph("CYP3A4 INHIBITORS — raise substrate levels → TOXICITY RISK", label_s),
]
cyp3a4_inh = [
    ["Inhibitor", "Strength", "Clinically Significant Substrates Affected", "Clinical Consequence"],
    ["Ketoconazole / Itraconazole", "Strong", "Simvastatin, lovastatin, midazolam, cyclosporin, tacrolimus, fentanyl", "Rhabdomyolysis (statins); prolonged sedation; nephrotoxicity (CNIs)"],
    ["Ritonavir (and cobicistat)", "Strong", "Nearly all HIV PIs, many CCBs, steroids, opioids", "Used therapeutically as 'booster'; toxic levels of co-meds"],
    ["Clarithromycin / Erythromycin", "Strong/Moderate", "Statins, digoxin, colchicine, warfarin, sildenafil", "Rhabdomyolysis; colchicine toxicity; enhanced anticoagulation"],
    ["Grapefruit Juice", "Variable (intestinal)", "Statins, CCBs (felodipine, nifedipine), cyclosporin, tacrolimus", "Unpredictable; avoid with narrow-TI drugs"],
    ["Verapamil / Diltiazem", "Moderate", "Statins, cyclosporin, carbamazepine, colchicine", "Statin myopathy; CNI toxicity"],
    ["Fluconazole", "Moderate (also 2C9)", "Warfarin, phenytoin, midazolam, statins", "Bleeding (warfarin); phenytoin toxicity"],
    ["Amiodarone", "Moderate (also 2C9, 2D6)", "Warfarin, digoxin, simvastatin, cyclosporin", "Bleeding; digoxin toxicity; rhabdomyolysis"],
]
story.append(section_table(cyp3a4_inh[0], cyp3a4_inh[1:], [3.5*cm, 2*cm, 6*cm, 6.5*cm], C_BLUE))
story += [spacer(6), Paragraph("CYP3A4 INDUCERS — lower substrate levels → THERAPEUTIC FAILURE / TREATMENT FAILURE", label_s)]
cyp3a4_ind = [
    ["Inducer", "Strength", "Critical Substrates Affected", "Clinical Consequence"],
    ["Rifampin (Rifampicin)", "Strong", "Warfarin, OCP (oral contraceptives), cyclosporin, HIV drugs, tacrolimus, many antiepileptics", "VTE in OCP users; transplant rejection; HIV treatment failure"],
    ["Carbamazepine", "Strong", "Warfarin, OCP, valproate, phenytoin (auto-induction too), many psychotropics", "OCP failure; sub-therapeutic levels; seizure relapse"],
    ["Phenytoin", "Strong", "OCP, warfarin, cyclosporin, imatinib, dasatinib", "Cancer drug treatment failure; OCP failure"],
    ["Phenobarbital / Primidone", "Strong", "Warfarin, OCP, glucocorticoids, antipsychotics", "Multiple treatment failures"],
    ["St. John's Wort", "Moderate-Strong", "Cyclosporin, warfarin, HIV drugs, OCP, digoxin", "Transplant rejection; HIV failure; OCP failure"],
    ["Dexamethasone (high dose)", "Moderate", "Cyclosporin, warfarin, opioids", "Sub-therapeutic immunosuppression"],
    ["Bosentan", "Moderate", "Cyclosporin, sildenafil, warfarin", "Reduced efficacy of co-drugs"],
]
story.append(section_table(cyp3a4_ind[0], cyp3a4_ind[1:], [3.5*cm, 2.5*cm, 6*cm, 6*cm], C_ORANGE))
story += [spacer(6)]
story += bullets([
    "MNEMONIC for strong CYP3A4 INHIBITORS: 'CRACK GFI' — Clarithromycin, Ritonavir, Amiodarone (moderate), Conazoles (ketoconazole/itraconazole), K(G)rapefruit, Fluconazole, Isoniazid (moderate).",
    "MNEMONIC for strong CYP3A4 INDUCERS: 'RIPES' — Rifampin, (carba)mazepine, Phenytoin, Ethanol (chronic), St. John's Wort (+ phenobarbital).",
    "Simvastatin and lovastatin are the most CYP3A4-dependent statins — highest interaction risk. Pravastatin and rosuvastatin are least CYP3A4-dependent.",
])
story += [spacer(6), hr(), spacer(6), page_break()]

# ══════════════════════════════════════════════════════════════════════════════
# SECTION 3 — CYP2D6
# ══════════════════════════════════════════════════════════════════════════════
story += [
    hdr_bar("SECTION 3 — CYP2D6: Highly Polymorphic Enzyme", C_PURPLE),
    spacer(4),
    Paragraph("GENETIC VARIATION: Poor Metabolisers (PM) ~5–10% Caucasians — act like being permanently 'inhibited'. Ultra-Rapid Metabolisers (UM) — act like permanent induction (codeine → toxic morphine levels).", label_s),
    spacer(4),
    Paragraph("CYP2D6 INHIBITORS — raise substrate levels", label_s),
]
cyp2d6_inh = [
    ["Inhibitor", "Strength", "Key Substrates Affected", "Clinical Consequence"],
    ["Fluoxetine", "Strong", "TCAs, codeine, tramadol, metoprolol, haloperidol, tamoxifen", "TCA toxicity (arrhythmia); codeine accumulation; reduced tamoxifen efficacy (controversy)"],
    ["Paroxetine", "Strong", "Same as fluoxetine; also other SSRIs", "TCA cardiotoxicity; metoprolol bradycardia"],
    ["Bupropion", "Strong", "TCAs, antipsychotics, codeine, metoprolol", "Dose-dependent; TCA toxicity"],
    ["Quinidine", "Strong", "Codeine, tramadol, antipsychotics", "Opioid toxicity; used to phenotype CYP2D6 in research"],
    ["Duloxetine", "Moderate", "TCAs, beta-blockers, some antipsychotics", "TCA toxicity; beta-blocker bradycardia"],
    ["Terbinafine", "Strong", "TCAs, SSRIs, antipsychotics", "TCA cardiac toxicity"],
    ["Amiodarone", "Moderate", "Metoprolol, flecainide, codeine", "Bradycardia; arrhythmia risk"],
]
story.append(section_table(cyp2d6_inh[0], cyp2d6_inh[1:], [3*cm, 2*cm, 6*cm, 7*cm], C_PURPLE))
story += [spacer(6), Paragraph("KEY CYP2D6 CLINICAL PEARLS", label_s)]
story += bullets([
    "CODEINE is a prodrug activated by CYP2D6 → morphine. Poor metabolisers: no analgesia. Ultra-rapid metabolisers: toxic morphine levels (neonatal death cases with breastfeeding).",
    "TAMOXIFEN requires CYP2D6 activation to its active metabolite endoxifen. Avoid fluoxetine/paroxetine in breast cancer patients on tamoxifen.",
    "METOPROLOL is a sensitive CYP2D6 substrate. Co-prescribing paroxetine or fluoxetine → 4–5x increase in metoprolol levels → severe bradycardia.",
    "No clinically strong CYP2D6 inducers exist (unlike CYP3A4). Rifampin has only mild inducing effect.",
    "TRAMADOL activation to O-desmethyltramadol requires CYP2D6; also serotonin syndrome risk via 2D6 inhibitors (paroxetine + tramadol = dangerous).",
])
story += [spacer(6), hr(), spacer(6), page_break()]

# ══════════════════════════════════════════════════════════════════════════════
# SECTION 4 — CYP2C9
# ══════════════════════════════════════════════════════════════════════════════
story += [
    hdr_bar("SECTION 4 — CYP2C9: Warfarin, NSAIDs, and Phenytoin", C_RED),
    spacer(4),
    Paragraph("CYP2C9 INHIBITORS & INDUCERS — Clinical Interactions", label_s),
]
cyp2c9_data = [
    ["Drug", "Role", "Key Substrates / Interaction", "Clinical Consequence"],
    ["Fluconazole", "Strong Inhibitor", "S-Warfarin (more active isomer), phenytoin, glipizide, losartan", "INR ↑↑ (major bleed risk); phenytoin toxicity (nystagmus, ataxia); hypoglycemia"],
    ["Amiodarone", "Moderate Inhibitor", "S-Warfarin, fluvastatin, celecoxib", "Bleeding with warfarin; monitor INR closely; reduce warfarin dose by 30–50%"],
    ["Metronidazole", "Moderate Inhibitor", "S-Warfarin", "Significant INR increase; antibiotic + anticoagulant bleeding risk"],
    ["Sulfonamides (TMP-SMX)", "Inhibitor", "Warfarin, phenytoin", "Major bleeding risk; phenytoin toxicity"],
    ["Miconazole (topical/oral)", "Moderate Inhibitor", "Warfarin", "Significant INR elevation even from topical/oral gel"],
    ["Rifampin", "Strong Inducer", "Warfarin, phenytoin, glipizide, losartan", "Subtherapeutic warfarin (thrombosis risk); reduced antidiabetic effect"],
    ["Carbamazepine", "Moderate Inducer", "Warfarin, phenytoin", "Reduced warfarin efficacy; complex phenytoin interaction (also substrate)"],
    ["Phenobarbital", "Moderate Inducer", "Warfarin, phenytoin", "Reduced warfarin; reduced phenytoin levels"],
]
story.append(section_table(cyp2c9_data[0], cyp2c9_data[1:], [3.5*cm, 2.5*cm, 5.5*cm, 6.5*cm], C_RED))
story += [spacer(6)]
story += bullets([
    "Warfarin (S-isomer) is metabolised by CYP2C9; R-isomer by CYP1A2 and CYP3A4. Most interactions affect S-warfarin.",
    "Any antibiotic can raise INR by killing gut bacteria (reduced Vitamin K synthesis) — even without CYP2C9 inhibition.",
    "Phenytoin is both a CYP2C9 substrate AND an inducer of CYP3A4/2C9 — complex, unpredictable kinetics.",
    "Fluconazole + warfarin: one of the most common drug interaction-related bleeding emergencies. Reduce warfarin prophylactically.",
])
story += [spacer(6), hr(), spacer(6)]

# ══════════════════════════════════════════════════════════════════════════════
# SECTION 5 — CYP2C19
# ══════════════════════════════════════════════════════════════════════════════
story += [
    hdr_bar("SECTION 5 — CYP2C19: Clopidogrel and PPIs", C_TEAL),
    spacer(4),
    Paragraph("CYP2C19 KEY INTERACTIONS", label_s),
]
cyp2c19_data = [
    ["Drug", "Role", "Substrate Affected", "Clinical Consequence"],
    ["Omeprazole / Esomeprazole", "Moderate Inhibitor (also substrate)", "Clopidogrel (prodrug)", "Reduced clopidogrel activation → higher MACE (cardiovascular events) in ACS/PCI patients"],
    ["Fluvoxamine", "Strong Inhibitor", "Diazepam, omeprazole, clomipramine, clopidogrel, voriconazole", "Prolonged benzodiazepine sedation; raised voriconazole toxicity"],
    ["Fluconazole", "Moderate Inhibitor", "Clopidogrel, voriconazole, PPIs", "Reduced clopidogrel effect; voriconazole toxicity"],
    ["Rifampin", "Strong Inducer", "PPIs (lower PPI efficacy), voriconazole", "Contraindicated with voriconazole (undetectable levels)"],
    ["Carbamazepine", "Moderate Inducer", "Clopidogrel (slight), voriconazole", "Voriconazole failure"],
    ["St. John's Wort", "Moderate Inducer", "Voriconazole, PPIs", "Antifungal failure; contraindicated with voriconazole"],
    ["Clopidogrel (substrate)", "Substrate (prodrug)", "Requires CYP2C19 activation", "Poor metabolisers (*2/*2): ~3x higher MACE risk; ultra-RMs: unpredictable"],
]
story.append(section_table(cyp2c19_data[0], cyp2c19_data[1:], [3.5*cm, 2.5*cm, 4.5*cm, 7.5*cm], C_TEAL))
story += [spacer(6)]
story += bullets([
    "PPI + CLOPIDOGREL controversy: Omeprazole/esomeprazole most problematic (CYP2C19 inhibition). Pantoprazole preferred if PPI needed in clopidogrel patient (less CYP2C19 inhibition).",
    "GENETIC TESTING: FDA recommends considering CYP2C19 genotyping before clopidogrel in high-risk patients. Prasugrel/ticagrelor do not require CYP2C19 activation.",
    "Rifampin + Voriconazole: absolute contraindication — voriconazole levels drop to undetectable.",
    "CYP2C19 Poor Metabolisers (~2–5% Caucasians; ~15–20% Asians): PPIs work BETTER (less metabolism), clopidogrel works WORSE.",
])
story += [spacer(6), hr(), spacer(6), page_break()]

# ══════════════════════════════════════════════════════════════════════════════
# SECTION 6 — CYP1A2
# ══════════════════════════════════════════════════════════════════════════════
story += [
    hdr_bar("SECTION 6 — CYP1A2: Clozapine, Theophylline, and Smoking", C_NAVY),
    spacer(4),
    Paragraph("CYP1A2 INHIBITORS & INDUCERS", label_s),
]
cyp1a2_data = [
    ["Drug/Factor", "Role", "Key Substrates Affected", "Clinical Consequence"],
    ["Fluvoxamine", "Strong Inhibitor", "Clozapine, olanzapine, theophylline, tizanidine, duloxetine, caffeine, warfarin (R-)", "Clozapine toxicity (seizures, agranulocytosis); theophylline toxicity; tizanidine hypotension/sedation"],
    ["Ciprofloxacin", "Moderate Inhibitor", "Clozapine, theophylline, tizanidine, warfarin", "Theophylline toxicity (seizures); clozapine toxicity; tizanidine severe hypotension"],
    ["Enoxacin", "Strong Inhibitor", "Theophylline, caffeine", "Theophylline toxicity; multiple seizures reported"],
    ["Tobacco Smoking", "Strong Inducer", "Clozapine, olanzapine, theophylline, caffeine", "SMOKING CESSATION raises clozapine/olanzapine levels by 50–100% — toxicity on quitting"],
    ["Omeprazole (high dose)", "Moderate Inducer", "Theophylline, clozapine", "Mild reduction in levels"],
    ["Rifampin", "Moderate Inducer", "Theophylline, warfarin (R-)", "Reduced efficacy"],
    ["Char-grilled / smoked food", "Mild Inducer", "Theophylline, clozapine", "Dietary polycyclic aromatic hydrocarbons induce CYP1A2"],
]
story.append(section_table(cyp1a2_data[0], cyp1a2_data[1:], [3.5*cm, 2.5*cm, 5*cm, 7*cm], C_NAVY))
story += [spacer(6)]
story += bullets([
    "SMOKING CESSATION ALERT: Patients on clozapine or olanzapine who quit smoking can have 50–100% rise in drug levels within days → toxicity (seizures, sedation). Dose reduction often needed.",
    "TIZANIDINE + CIPROFLOXACIN: absolute contraindication. CYP1A2 inhibition → 10x rise in tizanidine → severe hypotension, CNS depression. Fatalities reported.",
    "THEOPHYLLINE has a narrow therapeutic index (10–20 mcg/mL). Small CYP1A2 changes can cause toxicity (seizures, arrhythmias) — monitor levels with any interacting drug.",
    "FLUVOXAMINE is the most potent CYP1A2 inhibitor among SSRIs — unique profile compared to other SSRIs.",
])
story += [spacer(6), hr(), spacer(6)]

# ══════════════════════════════════════════════════════════════════════════════
# SECTION 7 — CYP2E1
# ══════════════════════════════════════════════════════════════════════════════
story += [
    hdr_bar("SECTION 7 — CYP2E1: Paracetamol (Acetaminophen) Hepatotoxicity & Alcohol", C_ORANGE),
    spacer(4),
    Paragraph("CYP2E1 is responsible for converting paracetamol to the toxic metabolite NAPQI (N-acetyl-p-benzoquinone imine), which is normally conjugated with glutathione.", label_s),
]
cyp2e1_data = [
    ["Interaction", "Mechanism", "Clinical Consequence"],
    ["Ethanol (chronic) + Paracetamol", "Chronic alcohol induces CYP2E1 → ↑ NAPQI production; glutathione depleted", "Hepatotoxicity at LOWER paracetamol doses than usual; fatal liver failure risk"],
    ["Isoniazid + Paracetamol", "Isoniazid induces CYP2E1 at low doses; inhibits it at high doses", "Enhanced NAPQI production → hepatotoxicity; warn TB patients on isoniazid"],
    ["Fasting + Paracetamol", "Fasting induces CYP2E1 and depletes glutathione stores", "Increased hepatotoxicity risk even at therapeutic doses"],
    ["Disulfiram + Ethanol", "Disulfiram inhibits aldehyde dehydrogenase (not CYP2E1) — but also inhibits CYP2E1", "Disulfiram reaction: flushing, tachycardia, nausea, vomiting, hypotension"],
    ["Halothane + Enzyme Inducers", "CYP2E1 metabolises halothane to trifluoroacetyl chloride", "Halothane hepatitis; avoid in patients on isoniazid or with alcoholism"],
]
story.append(section_table(cyp2e1_data[0], cyp2e1_data[1:], [4.5*cm, 7*cm, 6.5*cm], C_ORANGE))
story += [spacer(6), hr(), spacer(6), page_break()]

# ══════════════════════════════════════════════════════════════════════════════
# SECTION 8 — DRUG TRANSPORTERS
# ══════════════════════════════════════════════════════════════════════════════
story += [
    hdr_bar("SECTION 8 — Drug Transporters: P-glycoprotein (P-gp), OATPs, OCTs, BCRP", colors.HexColor("#2C3E50")),
    spacer(4),
    Paragraph("P-GLYCOPROTEIN (P-gp / MDR1 / ABCB1)", label_s),
]
story.append(Paragraph(
    "P-gp is an efflux transporter in gut, blood-brain barrier, kidney, liver, and placenta. It LIMITS drug absorption and CNS penetration. "
    "P-gp inhibitors RAISE substrate levels; inducers LOWER them. Critical for digoxin, dabigatran, and many oncology drugs.",
    body))
story.append(spacer(4))
pgp_data = [
    ["Drug", "Role", "Key Substrates Affected", "Clinical Consequence"],
    ["Amiodarone", "P-gp Inhibitor", "Digoxin, dabigatran", "Digoxin toxicity (nausea, arrhythmia, visual disturbance); dabigatran bleeding"],
    ["Verapamil / Diltiazem", "P-gp Inhibitor", "Digoxin, dabigatran, colchicine", "Digoxin toxicity; reduce digoxin dose by 30–50%"],
    ["Clarithromycin / Erythromycin", "P-gp Inhibitor", "Digoxin, dabigatran, colchicine", "Colchicine toxicity (myopathy, myelosuppression); digoxin toxicity"],
    ["Ketoconazole / Itraconazole", "P-gp Inhibitor", "Digoxin, dabigatran, paclitaxel", "Enhanced absorption + reduced efflux → toxicity"],
    ["Dronedarone", "P-gp + CYP3A4 Inhibitor", "Digoxin, dabigatran", "Digoxin toxicity; dabigatran 2x increase"],
    ["Rifampin", "P-gp Inducer", "Digoxin, dabigatran, HIV drugs", "Reduced bioavailability; treatment failure"],
    ["Carbamazepine", "P-gp Inducer", "Digoxin, lamotrigine, dabigatran", "Reduced drug levels"],
    ["St. John's Wort", "P-gp Inducer", "Digoxin, cyclosporin, dabigatran", "Transplant rejection; subtherapeutic anticoagulation"],
]
story.append(section_table(pgp_data[0], pgp_data[1:], [3.5*cm, 2.5*cm, 5*cm, 7*cm], colors.HexColor("#2C3E50")))
story += [spacer(6), Paragraph("ORGANIC ANION TRANSPORTING POLYPEPTIDES (OATP1B1 / OATP1B3) — Hepatic Uptake", label_s)]
oatp_data = [
    ["Inhibitor", "Substrates Affected", "Clinical Consequence"],
    ["Cyclosporin", "Statins (all), repaglinide, fexofenadine, methotrexate", "Major statin myopathy/rhabdomyolysis risk; repaglinide 6x increase → hypoglycemia"],
    ["Gemfibrozil (also CYP2C8 inh.)", "Statins, repaglinide, rosiglitazone", "Rhabdomyolysis with statins; severe hypoglycemia with repaglinide (avoid combination)"],
    ["Rifampin (acute dose)", "Statins, methotrexate, fexofenadine", "Transient increase in statin levels (chronic rifampin induces CYP3A4 and lowers levels)"],
    ["Eltrombopag", "Rosuvastatin (OATP1B1)", "Rosuvastatin levels increased; reduce dose"],
    ["Letermovir", "Statins (esp. simvastatin/atorvastatin via OATP)", "Significant statin level increase; dose adjustment or switch"],
]
story.append(section_table(oatp_data[0], oatp_data[1:], [4*cm, 6*cm, 8*cm], colors.HexColor("#117A65")))
story += [spacer(6), Paragraph("OCT2 / MATE Renal Transporters (affect renal elimination of metformin, creatinine)", label_s)]
oct_data = [
    ["Inhibitor", "Substrate Affected", "Clinical Consequence"],
    ["Cimetidine", "Metformin, procainamide, creatinine (spurious)", "Increased metformin levels; reduced creatinine secretion → falsely elevated serum creatinine"],
    ["Trimethoprim", "Metformin, creatinine, dofetilide", "Raised metformin; spurious creatinine rise; dofetilide toxicity (QT prolongation)"],
    ["Dolutegravir / Bictegravir", "Creatinine (OCT2 inhibition), metformin", "Spurious creatinine elevation (not true renal impairment); metformin accumulation risk"],
    ["Vancomycin", "Metformin (mild)", "Mild increase; relevant in renal impairment"],
]
story.append(section_table(oct_data[0], oct_data[1:], [4*cm, 5*cm, 9*cm], colors.HexColor("#1E8449")))
story += [spacer(6), hr(), spacer(6), page_break()]

# ══════════════════════════════════════════════════════════════════════════════
# SECTION 9 — QT PROLONGATION
# ══════════════════════════════════════════════════════════════════════════════
story += [
    hdr_bar("SECTION 9 — QT-Prolonging Combinations → Risk of Torsades de Pointes", C_RED),
    spacer(4),
    Paragraph(
        "Torsades de Pointes (TdP) is a life-threatening polymorphic ventricular tachycardia. Risk = QTc >500 ms or increase >60 ms from baseline. "
        "Combinations of QT-prolonging drugs are particularly dangerous.",
        body),
    spacer(4),
    Paragraph("DRUGS THAT PROLONG QT (by class)", label_s),
]
qt_drugs = [
    ["Class", "Drugs", "Notes"],
    ["Antiarrhythmics (Class IA)", "Quinidine, procainamide, disopyramide", "Highest risk; direct hERG potassium channel block"],
    ["Antiarrhythmics (Class III)", "Amiodarone, sotalol, dofetilide, ibutilide", "Sotalol + dofetilide: highest TdP rate; amiodarone paradoxically low despite QT prolongation"],
    ["Antipsychotics", "Haloperidol (IV), thioridazine, ziprasidone, clozapine, quetiapine", "IV haloperidol: monitor ECG; thioridazine most dangerous typical"],
    ["Antidepressants", "Citalopram, escitalopram, TCAs (amitriptyline, imipramine)", "Citalopram dose-dependent; max 40 mg/day (20 mg in elderly)"],
    ["Antibiotics", "Azithromycin, moxifloxacin, clarithromycin, erythromycin IV, levofloxacin", "Azithromycin cardiac deaths in high-CV-risk patients"],
    ["Antifungals", "Fluconazole, voriconazole, posaconazole, ketoconazole", "Also inhibit CYP3A4 — double interaction risk with co-substrates"],
    ["Antihistamines", "Terfenadine (withdrawn), astemizole (withdrawn)", "Withdrawn due to fatal TdP; modern antihistamines generally safer"],
    ["Antimalarials", "Chloroquine, hydroxychloroquine, quinine, halofantrine", "Hydroxychloroquine dose-dependent; careful monitoring in SLE/RA"],
    ["Methadone", "Methadone", "Dose-dependent; ECG monitoring mandatory; highest opioid QT risk"],
    ["Oncology", "Arsenic trioxide, vandetanib, osimertinib, sunitinib, lenvatinib", "Many TKIs prolong QT; monitor ECG during cancer treatment"],
    ["GI Motility", "Domperidone, cisapride (withdrawn)", "Cisapride withdrawn; domperidone: max 10 mg TID, avoid IV"],
    ["Miscellaneous", "Ondansetron (high dose IV), hydroxyzine, pentamidine, tacrolimus", "Ondansetron: avoid >32 mg single IV dose"],
]
story.append(section_table(qt_drugs[0], qt_drugs[1:], [3.5*cm, 6*cm, 8.5*cm], C_RED))
story += [spacer(6), Paragraph("HIGHEST-RISK QT COMBINATIONS", label_s)]
qt_combos = [
    ["Combination", "Risk Level", "Clinical Action"],
    ["Azithromycin + Methadone", "EXTREME", "Avoid — multiple TdP fatalities documented"],
    ["Sotalol + Moxifloxacin", "EXTREME", "Avoid — additive hERG block + high individual risks"],
    ["Dofetilide + Trimethoprim", "EXTREME", "TMP raises dofetilide levels (OCT2) + additive QT → TdP"],
    ["Fluconazole + Terfenadine/Cisapride", "EXTREME (historic)", "Led to both drugs being withdrawn/restricted"],
    ["Haloperidol IV + Azithromycin", "HIGH", "Use oral haloperidol; continuous ECG monitoring if unavoidable"],
    ["Citalopram + Fluconazole", "HIGH", "CYP2C19/3A4 inhibition raises citalopram + additive QT"],
    ["Methadone + Fluconazole", "HIGH", "CYP3A4 inhibition raises methadone + additive QT"],
    ["Hydroxychloroquine + Azithromycin", "HIGH", "Highlighted during COVID-19 pandemic; avoid combination"],
    ["TCA (amitriptyline) + Antipsychotic", "MODERATE-HIGH", "Monitor ECG; reduce doses"],
]
story.append(section_table(qt_combos[0], qt_combos[1:], [5*cm, 3*cm, 10*cm], C_RED))
story += [spacer(6)]
story += bullets([
    "Risk factors for TdP: female sex, hypokalemia, hypomagnesemia, bradycardia, congenital long QT syndrome, cardiac disease, liver impairment.",
    "Correction: ALWAYS correct electrolytes (K+ target >4 mEq/L; Mg2+ >0.8 mmol/L) before initiating QT-prolonging drugs.",
    "Resource: CredibleMeds / ArizonaCERT.org provides updated QT risk ratings for all drugs.",
])
story += [spacer(6), hr(), spacer(6), page_break()]

# ══════════════════════════════════════════════════════════════════════════════
# SECTION 10 — SEROTONIN SYNDROME
# ══════════════════════════════════════════════════════════════════════════════
story += [
    hdr_bar("SECTION 10 — Serotonin Syndrome Combinations", colors.HexColor("#6C3483")),
    spacer(4),
    Paragraph(
        "Serotonin syndrome = excess serotonergic activity. TRIAD: (1) Mental status changes (agitation, confusion), "
        "(2) Autonomic instability (hyperthermia, diaphoresis, tachycardia), (3) Neuromuscular abnormalities (CLONUS, hyperreflexia, tremor). "
        "Clonus distinguishes it from NMS. Onset: within 24 hours of drug change.",
        body),
    spacer(4),
    Paragraph("SEROTONERGIC DRUG CLASSES", label_s),
]
sert_classes = [
    ["Mechanism", "Drugs"],
    ["Increase serotonin synthesis", "L-tryptophan, 5-HTP"],
    ["Increase serotonin release", "MDMA (ecstasy), cocaine, amphetamines, dextromethorphan (DXM), meperidine, tramadol, linezolid"],
    ["Inhibit serotonin reuptake (SERT)", "SSRIs (all), SNRIs, TCAs (clomipramine, imipramine), tramadol, meperidine, dextromethorphan, methadone, St. John's Wort"],
    ["Inhibit serotonin breakdown (MAO)", "MAOIs (phenelzine, tranylcypromine, selegiline, moclobemide), linezolid (weak MAO-A)"],
    ["Direct serotonin receptor agonism", "Buspirone (5-HT1A), triptans (5-HT1B/D), LSD, ergotamine, lithium (potentiates)"],
    ["Inhibit serotonin metabolism (CYP)", "Fluvoxamine (1A2/2C19/3A4), fluoxetine (2D6), paroxetine (2D6) — increase levels of serotonergic drugs"],
]
story.append(section_table(sert_classes[0], sert_classes[1:], [5*cm, 13*cm], colors.HexColor("#6C3483")))
story += [spacer(6), Paragraph("DANGEROUS SEROTONIN SYNDROME COMBINATIONS", label_s)]
ss_combos = [
    ["Combination", "Risk", "Notes"],
    ["MAOI + SSRI/SNRI", "LETHAL", "Absolute contraindication. 2-week washout required before switching. 5-week washout for fluoxetine (long half-life)"],
    ["MAOI + Meperidine (pethidine)", "LETHAL", "Historically documented deaths. Meperidine inhibits SERT AND weakly inhibits MAO. Use morphine instead."],
    ["MAOI + Tramadol", "VERY HIGH", "Tramadol: SERT inhibitor + weak opioid. Fatal SS cases reported"],
    ["MAOI + Dextromethorphan (DXM)", "VERY HIGH", "DXM in cough syrups. Warn patients on MAOIs about OTC cough preparations"],
    ["SSRI + Tramadol", "HIGH", "Both inhibit SERT; tramadol also activates mu-opioid; serotonin syndrome + seizure risk"],
    ["SSRI + Linezolid", "HIGH", "Linezolid is a weak reversible MAO-A inhibitor; SS cases documented"],
    ["SSRI + St. John's Wort", "MODERATE-HIGH", "Additive SERT inhibition; inform patients about herbal supplements"],
    ["SSRI + Triptans", "MODERATE (often overstated)", "FDA warning; actual case rate low; sumatriptan has minimal CNS penetration"],
    ["Fentanyl + SSRIs", "LOW-MODERATE", "Fentanyl has weak serotonergic activity; monitor in high doses"],
    ["Lithium + SSRIs", "MODERATE", "Lithium potentiates serotonin neurotransmission; especially at high lithium levels"],
    ["SNRI (venlafaxine) + Methadone", "MODERATE", "Methadone: SERT inhibitor; additive serotonin + QT risk"],
]
story.append(section_table(ss_combos[0], ss_combos[1:], [5.5*cm, 3*cm, 9.5*cm], colors.HexColor("#6C3483")))
story += [spacer(6)]
story += bullets([
    "Treatment: Remove offending drug; benzodiazepines (agitation/seizures); cyproheptadine (5-HT2A antagonist); cooling; supportive care.",
    "CONTRAST with NMS: NMS = lead-pipe rigidity, bradyreflexia, gradual onset (days), caused by antipsychotics. SS = clonus, hyperreflexia, rapid onset (hours).",
    "Linezolid is a weak reversible MAOI — always ask about serotonergic drugs before prescribing it.",
])
story += [spacer(6), hr(), spacer(6), page_break()]

# ══════════════════════════════════════════════════════════════════════════════
# SECTION 11 — BLEEDING RISK COMBINATIONS
# ══════════════════════════════════════════════════════════════════════════════
story += [
    hdr_bar("SECTION 11 — Bleeding Risk Combinations", C_RED),
    spacer(4),
]
bleed_data = [
    ["Combination", "Mechanism", "Risk / Clinical Note"],
    ["Warfarin + Fluconazole", "CYP2C9 + CYP3A4 inhibition → ↑ warfarin", "Major — INR can triple; reduce warfarin 30–50%; monitor daily"],
    ["Warfarin + Amiodarone", "CYP2C9 + CYP3A4 inhibition + displacement from albumin", "Major — may take weeks to manifest; reduce warfarin 30–50%"],
    ["Warfarin + Metronidazole", "CYP2C9 inhibition of S-warfarin + gut flora", "Major — common in clinical practice; monitor INR"],
    ["Warfarin + Aspirin/NSAIDs", "Additive platelet inhibition + GI mucosal damage", "GI bleed risk ↑↑; aspirin irreversible platelet inhibition"],
    ["Aspirin + Clopidogrel", "Dual antiplatelet (COX-1 + P2Y12)", "Indicated in ACS/PCI but significantly increases GI bleeding; co-prescribe PPI"],
    ["DOAC + Amiodarone", "P-gp inhibition → ↑ dabigatran, rivaroxaban, apixaban", "Dose reduction of DOAC often required; monitor closely"],
    ["DOAC + Dronedarone", "P-gp + CYP3A4 inhibition", "Major; increases apixaban/rivaroxaban significantly"],
    ["Heparin/LMWH + Ketorolac", "Additive anticoagulant + potent NSAID", "High GI/surgical bleed risk; avoid combination"],
    ["Thrombolytics + Antiplatelet", "Additive fibrinolysis + platelet inhibition", "Necessary in STEMI but controlled; monitor for intracranial bleed"],
    ["SSRIs + NSAIDs/Aspirin", "SSRI impair platelet serotonin uptake + COX inhibition", "Upper GI bleed risk ↑ 3–15x; consider PPI co-prescription"],
    ["Clopidogrel + Omeprazole/Esomeprazole", "CYP2C19 inhibition → ↓ clopidogrel activation", "Reduced antiplatelet effect; use pantoprazole instead"],
]
story.append(section_table(bleed_data[0], bleed_data[1:], [4.5*cm, 5.5*cm, 8*cm], C_RED))
story += [spacer(6), hr(), spacer(6)]

# ══════════════════════════════════════════════════════════════════════════════
# SECTION 12 — NEPHROTOXIC COMBINATIONS
# ══════════════════════════════════════════════════════════════════════════════
story += [
    hdr_bar("SECTION 12 — Nephrotoxic Combinations", C_ORANGE),
    spacer(4),
]
nephro_data = [
    ["Combination", "Mechanism", "Clinical Note"],
    ["Aminoglycoside + Vancomycin", "Additive proximal tubular toxicity", "Major — 10x higher AKI risk; monitor creatinine and drug levels daily"],
    ["Aminoglycoside + Amphotericin B", "Additive tubulotoxicity + electrolyte wasting", "Very high AKI risk; avoid if possible; aggressive hydration"],
    ["NSAIDs + ACE Inhibitor/ARB + Diuretic", "'Triple Whammy'", "AKI from combined efferent arteriole dilation, reduced perfusion, and volume depletion"],
    ["Cyclosporin/Tacrolimus + NSAIDs", "CNI vasoconstriction + NSAID prostaglandin inhibition", "Acute calcineurin inhibitor nephrotoxicity; avoid NSAIDs in transplant patients"],
    ["Contrast dye + NSAIDs/Metformin", "Contrast nephropathy + CIN risk", "Withhold NSAIDs and metformin before/after IV contrast in at-risk patients"],
    ["Tenofovir + NSAIDs", "Tenofovir proximal tubular toxicity enhanced", "Fanconi syndrome; monitor renal function"],
    ["Vancomycin + Piperacillin-Tazobactam", "Synergistic nephrotoxicity (mechanism unclear, possibly tubular)", "Significant AKI risk; consider alternative when possible"],
    ["Cisplatin + Aminoglycosides", "Additive nephrotoxicity + ototoxicity", "Avoid; use carboplatin if aminoglycoside needed"],
    ["Radiocontrast + Diuretics (dehydrated patient)", "Volume depletion + contrast-induced nephropathy", "Pre-hydrate with saline before contrast"],
]
story.append(section_table(nephro_data[0], nephro_data[1:], [5*cm, 5*cm, 8*cm], C_ORANGE))
story += [spacer(6), hr(), spacer(6), page_break()]

# ══════════════════════════════════════════════════════════════════════════════
# SECTION 13 — CNS / RESPIRATORY DEPRESSION
# ══════════════════════════════════════════════════════════════════════════════
story += [
    hdr_bar("SECTION 13 — Additive CNS & Respiratory Depression", C_NAVY),
    spacer(4),
]
cns_data = [
    ["Combination", "Risk", "Notes"],
    ["Opioid + Benzodiazepine", "LETHAL — synergistic resp. depression", "FDA black box warning; deaths ↑ dramatically; avoid co-prescribing; if unavoidable, lowest doses, Rx naloxone"],
    ["Opioid + Alcohol", "LETHAL", "Synergistic CNS/resp. depression; common in opioid overdose deaths"],
    ["Opioid + Gabapentinoids (gabapentin/pregabalin)", "HIGH", "Emerging major risk; increasing fatalities; respiratory monitoring required"],
    ["Opioid + Muscle Relaxants (carisoprodol, cyclobenzaprine)", "HIGH", "Additive CNS depression; respiratory compromise"],
    ["Benzodiazepine + Alcohol", "HIGH", "Synergistic GABA enhancement; respiratory depression"],
    ["Benzodiazepine + Antihistamines (diphenhydramine)", "MODERATE", "CNS depression; sedation; falls risk especially in elderly"],
    ["Opioid + Antipsychotics (quetiapine)", "HIGH", "Quetiapine misused for sedation; with opioids: respiratory depression risk"],
    ["Z-drugs (zolpidem) + Opioids", "HIGH", "Z-drugs act on GABA-A; similar to benzodiazepine interaction"],
    ["Clonidine + Opioids", "MODERATE-HIGH", "Clonidine reduces sympathetic tone; exaggerated respiratory/cardiovascular depression"],
    ["Baclofen + Alcohol", "MODERATE", "Baclofen (GABA-B agonist) enhances CNS depression of alcohol"],
]
story.append(section_table(cns_data[0], cns_data[1:], [5.5*cm, 3.5*cm, 9*cm], C_NAVY))
story += [spacer(6)]
story += bullets([
    "CDC guidelines recommend against co-prescribing opioids + benzodiazepines. If unavoidable, also prescribe naloxone kit.",
    "Gabapentin/pregabalin have emerged as a major factor in opioid overdose deaths — now scheduled in many jurisdictions.",
    "Opioid overdose reversal: Naloxone 0.4–2 mg IV/IM/IN; repeat every 2–3 min as needed (short duration — opioid may outlast naloxone).",
])
story += [spacer(6), hr(), spacer(6)]

# ══════════════════════════════════════════════════════════════════════════════
# SECTION 14 — HYPERTENSIVE CRISIS COMBINATIONS
# ══════════════════════════════════════════════════════════════════════════════
story += [
    hdr_bar("SECTION 14 — Hypertensive Crisis & Dangerous Pressor Interactions", C_RED),
    spacer(4),
]
htn_data = [
    ["Combination", "Mechanism", "Clinical Note"],
    ["MAOI + Tyramine-rich foods", "'Cheese reaction' — tyramine not metabolised by MAO → catecholamine release", "Severe hypertensive crisis; BP can exceed 200 mmHg; hypertensive emergency"],
    ["MAOI + Indirect sympathomimetics (pseudoephedrine, amphetamines)", "Catecholamine flooding from MAO inhibition", "Avoid all OTC decongestants; hypertensive stroke risk"],
    ["MAOI + Cocaine", "Catecholamine release + MAO inhibition", "Extreme hypertensive crisis; cardiac arrhythmia; death"],
    ["Clonidine + Beta-blocker WITHDRAWAL", "Beta-blockade removed but alpha-2 agonism remains; then clonidine withdrawn", "Rebound hypertension; taper clonidine BEFORE beta-blocker withdrawal"],
    ["Cocaine + Beta-blockers", "Cocaine: alpha-1 agonism + beta-blockade = unopposed vasoconstriction", "Paradoxical hypertension + coronary vasospasm; avoid beta-blockers in cocaine chest pain"],
    ["SSRI/SNRI + Vasoconstrictors (triptans)", "Serotonin syndrome component + serotonin-mediated vasoconstriction", "Coronary artery spasm risk; cerebral vasoconstriction"],
    ["Ergotamine + CYP3A4 inhibitors (macrolides, azoles)", "Ergotamine accumulation → ergotism (vasospasm)", "Vasospasm of extremities/coronary/cerebral vessels; gangrene risk"],
    ["NSAIDs + Antihypertensives (ACE-i, ARB, CCB)", "Prostaglandin inhibition → sodium retention + reduced vasodilation", "Attenuate antihypertensive effect; 5–10 mmHg BP rise common"],
]
story.append(section_table(htn_data[0], htn_data[1:], [5*cm, 5.5*cm, 7.5*cm], C_RED))
story += [spacer(6), hr(), spacer(6), page_break()]

# ══════════════════════════════════════════════════════════════════════════════
# SECTION 15 — HIGH-YIELD DANGEROUS PAIRS SUMMARY
# ══════════════════════════════════════════════════════════════════════════════
story += [
    hdr_bar("SECTION 15 — High-Yield Dangerous Drug Pairs: Quick Reference", colors.HexColor("#1B2631")),
    spacer(4),
    Paragraph("MUST-KNOW CRITICAL DRUG INTERACTIONS", label_s),
]
pairs_data = [
    ["Drug A", "Drug B", "Interaction Type", "Consequence", "Action"],
    ["MAOI", "SSRI / Meperidine / Tramadol", "Pharmacodynamic (serotonin)", "LETHAL serotonin syndrome", "Absolute CI; 2-week washout"],
    ["Opioid", "Benzodiazepine", "Pharmacodynamic (CNS)", "LETHAL respiratory depression", "Avoid; if used: lowest dose + naloxone Rx"],
    ["Warfarin", "Fluconazole", "CYP2C9 inhibition", "Major bleed (INR ↑↑)", "Reduce warfarin 30–50%; daily INR"],
    ["Clopidogrel", "Omeprazole", "CYP2C19 inhibition (prodrug)", "Reduced antiplatelet → MACE ↑", "Use pantoprazole instead"],
    ["Simvastatin", "Clarithromycin/Ketoconazole", "CYP3A4 inhibition", "Rhabdomyolysis", "Withhold statin; use pravastatin"],
    ["Tamoxifen", "Paroxetine / Fluoxetine", "CYP2D6 inhibition", "Reduced endoxifen → cancer recurrence", "Avoid; use sertraline/venlafaxine"],
    ["Digoxin", "Amiodarone / Verapamil", "P-gp inhibition", "Digoxin toxicity (arrhythmia)", "Reduce digoxin 30–50%; monitor levels"],
    ["Amphotericin B", "Aminoglycosides", "Additive nephrotoxicity", "AKI", "Monitor renal function; hydrate"],
    ["Azithromycin", "Methadone", "Additive QT prolongation", "Torsades de Pointes", "Avoid; use non-QT antibiotic"],
    ["Rifampin", "OCP / Cyclosporin / HIV drugs", "CYP3A4 + P-gp induction", "Treatment failure (pregnancy, rejection, HIV)", "Use alternative; barrier contraception"],
    ["Methotrexate", "NSAIDs / TMP-SMX", "Reduced renal MTX excretion + folate antagonism", "Severe myelosuppression, mucositis", "Avoid NSAIDs perioperatively; avoid TMP-SMX"],
    ["Lithium", "Thiazide diuretics / NSAIDs", "Reduced renal Li+ clearance", "Lithium toxicity (tremor, AKI, seizure)", "Monitor Li+ levels; avoid dehydration"],
    ["Colchicine", "Clarithromycin / Verapamil", "CYP3A4 + P-gp inhibition", "Colchicine toxicity (myopathy, myelosuppression)", "Avoid; reduce dose in renal impairment"],
    ["Clonidine", "Beta-blockers (abrupt stop)", "Rebound hypertension", "Hypertensive crisis", "Taper clonidine; never stop both together"],
    ["Voriconazole", "Rifampin / St. John's Wort", "CYP2C19 + CYP3A4 induction", "Antifungal failure", "Absolute CI with rifampin"],
    ["Linezolid", "SSRIs / SNRIs / Tramadol", "MAO-A inhibition + serotonergic agents", "Serotonin syndrome", "Stop serotonergic drugs 2 weeks before; avoid combination"],
    ["ACE-i + ARB + Diuretic", "NSAIDs (any)", "'Triple Whammy' nephrotoxicity", "Acute Kidney Injury", "Avoid triple combination; especially in elderly/dehydrated"],
    ["Ciclosporin", "Statins / Repaglinide", "OATP1B1 inhibition", "Rhabdomyolysis / severe hypoglycemia", "Avoid; maximum statin dose restrictions apply"],
    ["Cisplatin", "Aminoglycosides", "Additive nephro + ototoxicity", "AKI + irreversible hearing loss", "Avoid; use carboplatin instead"],
    ["Abacavir", "(HLA-B*5701 positive patient)", "Immune-mediated hypersensitivity", "Fatal hypersensitivity on rechallenge", "SCREEN before prescribing; never rechallenge"],
]
t = Table(
    [[Paragraph(str(cell), th_s if i==0 else (td_bold if j<2 else td_norm))
      for j, cell in enumerate(row)]
     for i, row in enumerate(pairs_data)],
    colWidths=[3*cm, 3.5*cm, 3.5*cm, 4*cm, 4*cm]
)
t.setStyle(TableStyle([
    ('BACKGROUND', (0,0),(-1,0), C_DARK),
    ('ROWBACKGROUNDS', (0,1),(-1,-1), [C_WARN_BG, C_ROW2]),
    ('GRID', (0,0),(-1,-1), 0.5, C_GRID),
    ('VALIGN', (0,0),(-1,-1), 'TOP'),
    ('TOPPADDING', (0,0),(-1,-1), 5),
    ('BOTTOMPADDING', (0,0),(-1,-1), 5),
    ('LEFTPADDING', (0,0),(-1,-1), 6),
    ('RIGHTPADDING', (0,0),(-1,-1), 4),
    # Highlight absolute CIs
    ('BACKGROUND', (0,1),(-1,1), colors.HexColor("#FADBD8")),
    ('BACKGROUND', (0,2),(-1,2), colors.HexColor("#FADBD8")),
    ('BACKGROUND', (0,3),(-1,3), colors.HexColor("#FDEBD0")),
]))
story.append(t)
story += [spacer(8)]
story += bullets([
    "Red rows = absolute contraindications / potentially fatal combinations.",
    "Always consider pharmacokinetic (CYP, P-gp, transporters) AND pharmacodynamic (additive/synergistic toxicity) interactions.",
    "Drug interactions are the 4th leading cause of hospitalisation. Most preventable with systematic review at prescribing.",
    "Use interaction checkers (Lexicomp, Micromedex, Drugs.com, CredibleMeds for QT) as clinical decision support.",
])

# Build PDF
doc.build(story)
print(f"PDF generated: {OUTPUT_PATH}")
Running Command

cd /tmp/workspace/drug-side-effects && python generate_interactions_pdf.py

Running Command

ls -lh /tmp/workspace/drug-side-effects/Drug_Interactions_Reference.pdf

Your drug interactions PDF is ready:

Drug Interactions Reference

PDF Document · PDF


Here's what's inside across 15 sections:
SectionContent
1CYP450 Overview — isoform map, % hepatic metabolism, inhibitors vs. inducers vs. substrates
2CYP3A4 — strong/moderate inhibitors (ketoconazole, ritonavir, clarithromycin, grapefruit) + inducers (rifampin, carbamazepine, St. John's Wort) + clinical consequences
3CYP2D6 — fluoxetine/paroxetine + codeine/metoprolol/tamoxifen; genetic polymorphism notes (PM vs. UM)
4CYP2C9 — warfarin interactions (fluconazole, amiodarone, metronidazole, TMP-SMX)
5CYP2C19 — clopidogrel + PPI (omeprazole vs. pantoprazole); voriconazole + rifampin contraindication
6CYP1A2 — smoking cessation alert with clozapine/olanzapine; tizanidine + ciprofloxacin (contraindicated); theophylline
7CYP2E1 — paracetamol hepatotoxicity (alcohol, isoniazid, fasting); disulfiram reaction
8Drug Transporters — P-gp (digoxin, dabigatran), OATP1B1 (statins + cyclosporin/gemfibrozil), OCT2 (metformin, creatinine artefact with dolutegravir)
9QT Prolongation — all drug classes + highest-risk combinations (azithromycin + methadone, sotalol + moxifloxacin, dofetilide + trimethoprim)
10Serotonin Syndrome — MAOI + SSRI (lethal), meperidine, tramadol, linezolid, DXM; treatment
11Bleeding Risk — warfarin + azoles/amiodarone, triple antiplatelet, SSRI + NSAIDs, clopidogrel + omeprazole
12Nephrotoxic Combinations — "triple whammy" (ACE-i + ARB + NSAID + diuretic), vancomycin + pip-tazo, aminoglycoside + amphotericin B
13CNS/Respiratory Depression — opioid + benzo (black box), gabapentinoids + opioids
14Hypertensive Crisis — MAOI + tyramine, cocaine + beta-blockers, ergotamine + CYP3A4 inhibitors
1520 Must-Know Dangerous Pairs — quick-reference summary table with action steps; lethal combinations highlighted in red
Sources: Goodman & Gilman's, Katzung's Basic & Clinical Pharmacology, Harrison's Principles of Internal Medicine.
This is a shared conversation. Sign in to Orris to start your own chat.