attachment
attachment
attachment
attachment
attachment
attachment
attachment
attachment

This are the drug list that we are going to use it Tomorrow in wari medical camp So prepare a manual for these drugs by giving drugs name , its indication, dose , route frequency, and duration and contraindications in details fully and also highlights the main part , for quick reviews Also add skme common diseases in ehich i can prescribe that i will usually see in this camp

analyse_media
analyse_media
analyse_media
analyse_media
Reading File
The complete manual is ready above. Here is a summary of what is included:
Drugs covered (all 20 from your indent list):
  1. Cyclopam - antispasmodic
  2. Metronidazole 400mg - antiprotozoal/anaerobic
  3. Gelusil - antacid
  4. Ciprofloxacin 500mg - broad-spectrum antibiotic
  5. Multivitamin - nutritional
  6. Emset 4mg (Ondansetron) - anti-emetic
  7. Diclomol - NSAID + paracetamol combo
  8. Paracetamol 500mg - analgesic/antipyretic
  9. Amlodipine 5mg - antihypertensive
  10. Rantac 150mg - H2 blocker
  11. Cetirizine 10mg - antihistamine
  12. Bisacodyl - laxative
  13. B-Complex - B vitamins
  14. Calcium - mineral supplement
  15. Cough Syrup - antitussive/expectorant
  16. Loperamide - anti-diarrheal
  17. Cipro Eye Drops - ophthalmic antibiotic
  18. Clotrimazole Ointment - antifungal
  19. Diclo Gel & Spray - topical NSAID
  20. Consumables reference (ORS, NS, H2O2, Glucon-D, bandages)
12 Common Camp Diseases covered with clear prescriptions: AGE/Diarrhea, Fever, URTI, Musculoskeletal Pain, Hypertension, Fungal Infections, Heat Exhaustion/Stroke, Wounds, Allergy/Urticaria, Constipation, Eye Infections, Abdominal Colic.
Quick Reference Card at the end for fast prescribing.
All the best for the Wari Medical Camp tomorrow!

Generate this manual as a portable PDF or Word document to print for the camp

Reading File
Reading File
Running Command

mkdir -p /tmp/workspace/wari-camp && ls /tmp/workspace/wari-camp/

Writing File

~/wari-camp/generate_manual.py

from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.lib import colors
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

OUTPUT = "/tmp/workspace/wari-camp/Wari_Camp_Drug_Manual.pdf"

# ─── Colours ────────────────────────────────────────────────────────────────
DARK_BLUE  = colors.HexColor("#1a3c5e")
MED_BLUE   = colors.HexColor("#2563a8")
LIGHT_BLUE = colors.HexColor("#dbeafe")
TEAL       = colors.HexColor("#0e7490")
TEAL_LIGHT = colors.HexColor("#cffafe")
RED        = colors.HexColor("#b91c1c")
RED_LIGHT  = colors.HexColor("#fee2e2")
GREEN      = colors.HexColor("#15803d")
GREEN_LIGHT= colors.HexColor("#dcfce7")
ORANGE     = colors.HexColor("#c2410c")
ORANGE_LIGHT=colors.HexColor("#ffedd5")
YELLOW_LIGHT=colors.HexColor("#fef9c3")
GRAY_LIGHT = colors.HexColor("#f1f5f9")
GRAY_MID   = colors.HexColor("#94a3b8")
WHITE      = colors.white
BLACK      = colors.black

# ─── Page layout with header/footer ─────────────────────────────────────────
PAGE_W, PAGE_H = A4
MARGIN = 1.8*cm

def header_footer(canvas, doc):
    canvas.saveState()
    # Header bar
    canvas.setFillColor(DARK_BLUE)
    canvas.rect(0, PAGE_H - 1.1*cm, PAGE_W, 1.1*cm, fill=1, stroke=0)
    canvas.setFillColor(WHITE)
    canvas.setFont("Helvetica-Bold", 8)
    canvas.drawString(MARGIN, PAGE_H - 0.75*cm,
        "WARI MEDICAL CAMP  |  MIMER Medical College & Dr. BSTR Hospital")
    canvas.setFont("Helvetica", 8)
    canvas.drawRightString(PAGE_W - MARGIN, PAGE_H - 0.75*cm, "15 July 2026")
    # Footer
    canvas.setFillColor(DARK_BLUE)
    canvas.rect(0, 0, PAGE_W, 0.85*cm, fill=1, stroke=0)
    canvas.setFillColor(WHITE)
    canvas.setFont("Helvetica", 7)
    canvas.drawString(MARGIN, 0.28*cm,
        "For use by qualified healthcare professionals only  |  Not for public distribution")
    canvas.setFont("Helvetica-Bold", 8)
    canvas.drawRightString(PAGE_W - MARGIN, 0.28*cm, f"Page {doc.page}")
    canvas.restoreState()

doc = BaseDocTemplate(
    OUTPUT, pagesize=A4,
    leftMargin=MARGIN, rightMargin=MARGIN,
    topMargin=1.5*cm, bottomMargin=1.5*cm,
)
frame = Frame(MARGIN, 1.5*cm, PAGE_W - 2*MARGIN, PAGE_H - 3.0*cm, id="main")
doc.addPageTemplates([PageTemplate(id="main", frames=[frame], onPage=header_footer)])

# ─── Styles ──────────────────────────────────────────────────────────────────
SS = getSampleStyleSheet()

def sty(name, parent="Normal", **kw):
    s = ParagraphStyle(name, parent=SS[parent], **kw)
    return s

s_title    = sty("s_title",    "Normal",   fontSize=22, textColor=WHITE,
                  alignment=TA_CENTER, fontName="Helvetica-Bold", leading=28)
s_subtitle = sty("s_subtitle", "Normal",   fontSize=11, textColor=LIGHT_BLUE,
                  alignment=TA_CENTER, fontName="Helvetica", leading=16)
s_h1       = sty("s_h1",       "Normal",   fontSize=14, textColor=WHITE,
                  fontName="Helvetica-Bold", leading=18, spaceBefore=8, spaceAfter=4)
s_h2       = sty("s_h2",       "Normal",   fontSize=11, textColor=DARK_BLUE,
                  fontName="Helvetica-Bold", leading=15, spaceBefore=6, spaceAfter=3)
s_h3       = sty("s_h3",       "Normal",   fontSize=10, textColor=TEAL,
                  fontName="Helvetica-Bold", leading=13, spaceBefore=4, spaceAfter=2)
s_body     = sty("s_body",     "Normal",   fontSize=9,  textColor=BLACK,
                  fontName="Helvetica",      leading=13, spaceAfter=3)
s_bold     = sty("s_bold",     "Normal",   fontSize=9,  textColor=BLACK,
                  fontName="Helvetica-Bold", leading=13)
s_quick    = sty("s_quick",    "Normal",   fontSize=9,  textColor=TEAL,
                  fontName="Helvetica-BoldOblique", leading=13, spaceAfter=4)
s_warn     = sty("s_warn",     "Normal",   fontSize=9,  textColor=RED,
                  fontName="Helvetica-Bold", leading=13)
s_note     = sty("s_note",     "Normal",   fontSize=8.5,textColor=ORANGE,
                  fontName="Helvetica-BoldOblique", leading=12, spaceAfter=4)
s_toc      = sty("s_toc",      "Normal",   fontSize=9,  textColor=DARK_BLUE,
                  fontName="Helvetica", leading=14)
s_section_header = sty("s_section_header", "Normal", fontSize=10, textColor=WHITE,
                  fontName="Helvetica-Bold", alignment=TA_CENTER, leading=14)
s_disease  = sty("s_disease",  "Normal",   fontSize=11, textColor=DARK_BLUE,
                  fontName="Helvetica-Bold", leading=15, spaceBefore=5, spaceAfter=3)

# ─── Helper builders ─────────────────────────────────────────────────────────
def section_banner(text, bg=DARK_BLUE, fg=WHITE):
    """Full-width coloured banner."""
    return Table(
        [[Paragraph(text, s_section_header)]],
        colWidths=[PAGE_W - 2*MARGIN],
        style=TableStyle([
            ("BACKGROUND", (0,0), (-1,-1), bg),
            ("TOPPADDING",    (0,0), (-1,-1), 6),
            ("BOTTOMPADDING", (0,0), (-1,-1), 6),
            ("LEFTPADDING",   (0,0), (-1,-1), 10),
        ])
    )

def drug_table(rows):
    """2-col table for drug parameters."""
    data = []
    for k, v in rows:
        data.append([
            Paragraph(k, s_bold),
            Paragraph(v, s_body)
        ])
    col_w = PAGE_W - 2*MARGIN
    t = Table(data, colWidths=[3.5*cm, col_w - 3.5*cm])
    t.setStyle(TableStyle([
        ("BACKGROUND",    (0,0), (0,-1), LIGHT_BLUE),
        ("BACKGROUND",    (1,0), (1,-1), WHITE),
        ("ROWBACKGROUNDS",(0,0), (-1,-1), [GRAY_LIGHT, WHITE]),
        ("GRID",          (0,0), (-1,-1), 0.4, GRAY_MID),
        ("TOPPADDING",    (0,0), (-1,-1), 4),
        ("BOTTOMPADDING", (0,0), (-1,-1), 4),
        ("LEFTPADDING",   (0,0), (-1,-1), 6),
        ("VALIGN",        (0,0), (-1,-1), "TOP"),
    ]))
    return t

def ci_box(items):
    """Red-bordered contraindication box."""
    text = "  •  ".join(items)
    return Table(
        [[Paragraph("<b>⚠ CONTRAINDICATIONS:</b>  " + text, s_warn)]],
        colWidths=[PAGE_W - 2*MARGIN],
        style=TableStyle([
            ("BACKGROUND",    (0,0), (-1,-1), RED_LIGHT),
            ("BOX",           (0,0), (-1,-1), 0.8, RED),
            ("TOPPADDING",    (0,0), (-1,-1), 5),
            ("BOTTOMPADDING", (0,0), (-1,-1), 5),
            ("LEFTPADDING",   (0,0), (-1,-1), 8),
        ])
    )

def highlight_box(text, bg=YELLOW_LIGHT, tc=BLACK):
    return Table(
        [[Paragraph("✦ " + text, sty("_hl", "Normal", fontSize=9,
                                     textColor=tc, fontName="Helvetica-Bold",
                                     leading=13))]],
        colWidths=[PAGE_W - 2*MARGIN],
        style=TableStyle([
            ("BACKGROUND",    (0,0), (-1,-1), bg),
            ("BOX",           (0,0), (-1,-1), 0.6, GRAY_MID),
            ("TOPPADDING",    (0,0), (-1,-1), 5),
            ("BOTTOMPADDING", (0,0), (-1,-1), 5),
            ("LEFTPADDING",   (0,0), (-1,-1), 8),
        ])
    )

def sp(h=4): return Spacer(1, h)
def hr(): return HRFlowable(width="100%", thickness=0.5, color=GRAY_MID, spaceAfter=4)

# ═══════════════════════════════════════════════════════════════════════════
# BUILD CONTENT
# ═══════════════════════════════════════════════════════════════════════════
story = []

# ── COVER ────────────────────────────────────────────────────────────────────
story.append(sp(30))
cover_tbl = Table(
    [[Paragraph("🏥  WARI MEDICAL CAMP", s_title)],
     [Paragraph("Drug Reference Manual", s_subtitle)],
     [sp(6)],
     [Paragraph("MAER MIT Pune's  |  MIMER Medical College &amp; Dr. BSTR Hospital,<br/>Talegaon Dabhade", s_subtitle)],
     [Paragraph("Date: 15 July 2026", s_subtitle)],
    ],
    colWidths=[PAGE_W - 2*MARGIN],
    style=TableStyle([
        ("BACKGROUND",    (0,0), (-1,-1), DARK_BLUE),
        ("TOPPADDING",    (0,0), (-1,-1), 18),
        ("BOTTOMPADDING", (0,0), (-1,-1), 18),
        ("LEFTPADDING",   (0,0), (-1,-1), 20),
        ("ALIGN",         (0,0), (-1,-1), "CENTER"),
    ])
)
story.append(cover_tbl)
story.append(sp(20))

# Quick instruction box
story.append(Table(
    [[Paragraph(
        "<b>How to use this manual</b><br/>"
        "Each drug entry has: Indication · Dose · Route · Frequency · Duration · Contraindications · Key Highlight.<br/>"
        "Part 2 covers the 12 most common conditions seen at field medical camps with ready prescriptions.<br/>"
        "The Quick Reference Card (last page) is designed for fast prescribing at the table.",
        sty("_intro","Normal", fontSize=9, textColor=DARK_BLUE, fontName="Helvetica", leading=14)
    )]],
    colWidths=[PAGE_W - 2*MARGIN],
    style=TableStyle([
        ("BACKGROUND",    (0,0), (-1,-1), LIGHT_BLUE),
        ("BOX",           (0,0), (-1,-1), 1, MED_BLUE),
        ("TOPPADDING",    (0,0), (-1,-1), 8),
        ("BOTTOMPADDING", (0,0), (-1,-1), 8),
        ("LEFTPADDING",   (0,0), (-1,-1), 10),
    ])
))
story.append(PageBreak())

# ── PART 1 HEADER ────────────────────────────────────────────────────────────
story.append(section_banner("PART 1  |  DRUG PROFILES  (20 Drugs)"))
story.append(sp(10))

# ═════════════════════ DRUGS DATA ════════════════════════════════════════════
drugs = [
  {
    "num": 1, "name": "CYCLOPAM",
    "subtitle": "Dicyclomine 20mg + Paracetamol 500mg",
    "quick": "Antispasmodic — use for colicky abdominal pain, IBS, dysmenorrhea",
    "params": [
        ("Indication",  "Abdominal colic, IBS, dysmenorrhea, renal/biliary colic, GI spasm"),
        ("Dose",        "1 tablet (Dicyclomine 20mg + Paracetamol 500mg)"),
        ("Route",       "Oral"),
        ("Frequency",   "TDS — 3 times daily"),
        ("Duration",    "3–5 days or till pain resolves"),
    ],
    "ci":   ["Closed-angle glaucoma","Urinary retention / BPH","Myasthenia gravis",
             "Obstructive GI disease","Children < 6 months"],
    "hl":   "Do NOT use in suspected surgical abdomen (appendicitis, peritonitis). Stop and refer.",
  },
  {
    "num": 2, "name": "METRONIDAZOLE 400mg",
    "subtitle": "Antiprotozoal / Anaerobic Antibiotic",
    "quick": "Amoebic dysentery, Giardiasis, infected wounds, anaerobic infections",
    "params": [
        ("Indication",  "Amoebic dysentery, Giardiasis, anaerobic infections, infected wounds, dental infections, trichomonas"),
        ("Dose",        "400mg (adult)  |  7.5 mg/kg in children"),
        ("Route",       "Oral"),
        ("Frequency",   "TDS — 3 times daily"),
        ("Duration",    "5–7 days (dysentery)  |  7–10 days (severe infection)"),
    ],
    "ci":   ["First trimester pregnancy","Active epilepsy / CNS disease (caution)",
             "Hepatic encephalopathy (dose reduce)","Hypersensitivity to nitroimidazoles"],
    "hl":   "AVOID ALCOHOL during treatment and 48 hrs after — disulfiram-like reaction. Warn patient of metallic taste.",
  },
  {
    "num": 3, "name": "GELUSIL",
    "subtitle": "Aluminium Hydroxide + Magnesium Hydroxide + Simethicone",
    "quick": "Antacid — acidity, gastritis, heartburn, GERD, flatulence",
    "params": [
        ("Indication",  "Hyperacidity, gastritis, GERD, peptic ulcer symptoms, flatulence"),
        ("Dose",        "1–2 tablets (chewed) or 1–2 tsp syrup"),
        ("Route",       "Oral"),
        ("Frequency",   "After meals and at bedtime — QID"),
        ("Duration",    "5–7 days or as needed"),
    ],
    "ci":   ["Severe renal failure (Mg accumulation)","Hypophosphatemia","Bowel obstruction"],
    "hl":   "Take AFTER meals. Separate from other drugs by at least 2 hours — reduces their absorption.",
  },
  {
    "num": 4, "name": "CIPROFLOXACIN 500mg",
    "subtitle": "Fluoroquinolone Broad-Spectrum Antibiotic",
    "quick": "UTI, traveler's diarrhea, skin infections, typhoid, respiratory infections",
    "params": [
        ("Indication",  "UTI, traveler's diarrhea, typhoid, infected wounds, skin & soft tissue infections, respiratory infections"),
        ("Dose",        "500mg (adult)"),
        ("Route",       "Oral"),
        ("Frequency",   "BD — twice daily"),
        ("Duration",    "3–7 days (UTI)  |  7–14 days (other infections)"),
    ],
    "ci":   ["Children & adolescents < 18 yrs (cartilage damage)","Pregnancy & breastfeeding",
             "Myasthenia gravis","Epilepsy (lowers seizure threshold)","Known QT prolongation"],
    "hl":   "Avoid antacids within 2 hrs. Can cause tendon rupture — warn elderly. Causes photosensitivity — advise sun protection.",
  },
  {
    "num": 5, "name": "MULTIVITAMIN",
    "subtitle": "A, B-complex, C, D, E + Minerals",
    "quick": "Nutritional deficiency, weakness, convalescence — give to all malnourished patients",
    "params": [
        ("Indication",  "Nutritional deficiency, general weakness, malnutrition, convalescence, pregnancy supplementation"),
        ("Dose",        "1 tablet"),
        ("Route",       "Oral"),
        ("Frequency",   "OD — once daily"),
        ("Duration",    "30 days or as advised"),
    ],
    "ci":   ["Hypervitaminosis A or D","Hypercalcemia"],
    "hl":   "Best taken after meals. Give routinely to children, pregnant women, elderly, patients with anemia or weakness.",
  },
  {
    "num": 6, "name": "EMSET 4mg  (Ondansetron)",
    "subtitle": "5-HT3 Receptor Antagonist Anti-emetic",
    "quick": "Nausea & vomiting from any cause — gastroenteritis, drug-induced, heat illness",
    "params": [
        ("Indication",  "Nausea and vomiting — gastroenteritis, drug-induced, motion sickness, post-procedure"),
        ("Dose",        "4mg adult  |  0.1 mg/kg children"),
        ("Route",       "Oral (dissolve under tongue) — IV if available"),
        ("Frequency",   "BD–TDS (every 8 hrs in severe vomiting)"),
        ("Duration",    "1–3 days or till vomiting stops"),
    ],
    "ci":   ["Congenital long QT syndrome","Hypersensitivity to ondansetron",
             "Hepatic impairment (dose reduce)","Children < 2 years (limited data)"],
    "hl":   "Give BEFORE starting ORS in patients with vomiting to ensure ORS retention. Max 16mg/day.",
  },
  {
    "num": 7, "name": "DICLOMOL",
    "subtitle": "Diclofenac 50mg + Paracetamol 500mg",
    "quick": "NSAID + Antipyretic combination — fever with bodyache, joint pain, injury pain",
    "params": [
        ("Indication",  "Fever with body ache, musculoskeletal pain, joint pain, headache, dental pain, injury pain"),
        ("Dose",        "1 tablet"),
        ("Route",       "Oral — ALWAYS after food"),
        ("Frequency",   "BD–TDS"),
        ("Duration",    "3–5 days"),
    ],
    "ci":   ["Active peptic ulcer / GI bleed","Severe renal or hepatic disease",
             "Bleeding disorders","Asthma exacerbated by NSAIDs",
             "Pregnancy (3rd trimester)","Children < 14 years"],
    "hl":   "ALWAYS take after food — prevent GI ulceration. For fever in children use plain Paracetamol only, NOT Diclomol.",
  },
  {
    "num": 8, "name": "PARACETAMOL 500mg",
    "subtitle": "Analgesic / Antipyretic",
    "quick": "Safest fever & pain drug — use in all ages, pregnancy, when NSAIDs are contraindicated",
    "params": [
        ("Indication",  "Fever, headache, body ache, mild-moderate pain (especially when NSAIDs contraindicated)"),
        ("Dose",        "500mg–1g adult  |  10–15 mg/kg/dose children"),
        ("Route",       "Oral"),
        ("Frequency",   "Every 4–6 hours  (Max 4g/day adult  |  5 doses/day children)"),
        ("Duration",    "3–5 days or till fever resolves"),
    ],
    "ci":   ["Severe hepatic disease (dose reduce)","Alcoholism (hepatotoxicity risk)","Hypersensitivity"],
    "hl":   "Safest for fever in pregnancy and children. Do NOT exceed 4g/day. Warn: Diclomol already contains paracetamol — avoid double dosing.",
  },
  {
    "num": 9, "name": "AMLODIPINE 5mg  (Amlo 5mg)",
    "subtitle": "Calcium Channel Blocker (Dihydropyridine)",
    "quick": "Hypertension (most common camp use) and stable angina — once daily",
    "params": [
        ("Indication",  "Hypertension, stable angina"),
        ("Dose",        "5mg (can be increased to 10mg by physician)"),
        ("Route",       "Oral"),
        ("Frequency",   "OD — once daily"),
        ("Duration",    "Long-term / chronic — do not stop without medical advice"),
    ],
    "ci":   ["Severe hypotension (BP < 90/60)","Cardiogenic shock",
             "Severe aortic stenosis","Hypersensitivity to dihydropyridines"],
    "hl":   "Do NOT stop abruptly in angina — risk of rebound ischemia. Side effects: pedal edema, flushing, headache. Check for drug duplication in known hypertensives.",
  },
  {
    "num": 10, "name": "RANTAC 150mg  (Ranitidine equivalent)",
    "subtitle": "H2-Receptor Blocker — Acid Reducer",
    "quick": "Acidity, GERD, peptic ulcer, gastric protection with NSAIDs",
    "params": [
        ("Indication",  "Peptic ulcer disease, GERD, gastritis, drug-induced gastric irritation"),
        ("Dose",        "150mg"),
        ("Route",       "Oral"),
        ("Frequency",   "BD — morning and bedtime"),
        ("Duration",    "4–8 weeks (ulcer)  |  Ongoing for GERD"),
    ],
    "ci":   ["Hypersensitivity","Renal impairment (dose reduce)","Porphyria"],
    "hl":   "Take 30 minutes before meals for best effect. Routinely co-prescribe with NSAIDs (Diclomol, Ciprofloxacin) to protect gastric mucosa.",
  },
  {
    "num": 11, "name": "CETIRIZINE 10mg",
    "subtitle": "Second-Generation H1 Antihistamine",
    "quick": "Allergic rhinitis, urticaria, skin allergy, insect bites, allergic conjunctivitis",
    "params": [
        ("Indication",  "Allergic rhinitis, urticaria (hives), atopic dermatitis, allergic conjunctivitis, insect bites"),
        ("Dose",        "10mg adult  |  5mg children 2–6 years"),
        ("Route",       "Oral"),
        ("Frequency",   "OD — preferably at night"),
        ("Duration",    "5–7 days (acute allergy) or as needed"),
    ],
    "ci":   ["Severe renal failure (dose reduce)","Hypersensitivity to cetirizine/hydroxyzine",
             "Children < 2 years"],
    "hl":   "CAUSES DROWSINESS — warn patients, especially drivers/machine operators. Advise at bedtime. Minimal anticholinergic effects vs older antihistamines.",
  },
  {
    "num": 12, "name": "BISACODYL 5mg",
    "subtitle": "Stimulant Laxative",
    "quick": "Constipation — short-term use only, rule out obstruction first",
    "params": [
        ("Indication",  "Constipation, bowel evacuation before procedures"),
        ("Dose",        "5–10mg (1–2 tablets)"),
        ("Route",       "Oral"),
        ("Frequency",   "OD at bedtime"),
        ("Duration",    "2–3 days MAX"),
    ],
    "ci":   ["Acute abdomen / appendicitis — NEVER GIVE","Intestinal obstruction",
             "Acute IBD / colitis","Severe unexplained abdominal pain",
             "Children < 3 years","Pregnancy (1st trimester)"],
    "hl":   "CRITICAL: Rule out surgical/obstructive cause before prescribing. Takes 6–12 hrs to act. Do not crush enteric-coated tablets. Avoid prolonged use.",
  },
  {
    "num": 13, "name": "B-COMPLEX",
    "subtitle": "B1, B2, B3, B5, B6, B12 + Folic Acid",
    "quick": "Weakness, peripheral neuropathy, nutritional deficiency, supplement for diabetics & TB patients",
    "params": [
        ("Indication",  "B-vitamin deficiency, peripheral neuropathy, weakness, anemia, alcoholic neuropathy, pregnancy"),
        ("Dose",        "1–2 tablets"),
        ("Route",       "Oral"),
        ("Frequency",   "OD or BD"),
        ("Duration",    "30–90 days (deficiency states)"),
    ],
    "ci":   ["Hypersensitivity (rare)","Hypervitaminosis B"],
    "hl":   "Give to elderly, malnourished, diabetics, and patients on isoniazid (TB) to prevent neuropathy. Safe in pregnancy.",
  },
  {
    "num": 14, "name": "CALCIUM  (Calcium Carbonate 500mg–1g)",
    "subtitle": "Mineral Supplement",
    "quick": "Bone health, hypocalcemia, pregnancy & lactation, elderly patients, muscle cramps",
    "params": [
        ("Indication",  "Osteoporosis, calcium deficiency, pregnancy & lactation, growing children, post-menopausal women, muscle cramps"),
        ("Dose",        "500mg–1g (elemental calcium)"),
        ("Route",       "Oral"),
        ("Frequency",   "BD — split doses for better absorption"),
        ("Duration",    "30–90 days or long-term"),
    ],
    "ci":   ["Hypercalcemia","Renal stones (calcium oxalate — caution)","Severe renal failure",
             "Sarcoidosis / hyperparathyroidism"],
    "hl":   "Take with or after meals. Separate from iron supplements by 2 hrs. Combine with Vitamin D for optimal absorption.",
  },
  {
    "num": 15, "name": "COUGH SYRUP",
    "subtitle": "Expectorant (Bromhexine/Ambroxol) or Antitussive (Dextromethorphan)",
    "quick": "Productive cough = expectorant; Dry irritating cough = antitussive",
    "params": [
        ("Indication",  "Dry cough (antitussive) or productive cough (expectorant), URTI, bronchitis"),
        ("Dose",        "10ml (2 tsp) adult  |  5ml children 6–12 years"),
        ("Route",       "Oral"),
        ("Frequency",   "TDS — 3 times daily"),
        ("Duration",    "3–5 days"),
    ],
    "ci":   ["Dextromethorphan: avoid with MAO inhibitors","Codeine: avoid in children < 12, asthma",
             "Alcohol-containing: avoid in pregnancy, children, liver disease"],
    "hl":   "Do NOT suppress productive (mucus-producing) cough — give expectorant. Antitussive for dry, irritating cough only.",
  },
  {
    "num": 16, "name": "LOPERAMIDE 2mg  (Clonramide)",
    "subtitle": "Opioid Receptor Agonist — Anti-diarrheal",
    "quick": "Watery non-infective diarrhea only — NOT for bloody diarrhea or high fever",
    "params": [
        ("Indication",  "Non-infective acute watery diarrhea, traveler's diarrhea (no blood), IBS diarrhea"),
        ("Dose",        "4mg initially, then 2mg after each loose stool"),
        ("Route",       "Oral"),
        ("Frequency",   "After each loose stool (as needed)"),
        ("Duration",    "Max 2 days  |  Max 16mg/day"),
    ],
    "ci":   ["Bloody diarrhea / dysentery — NEVER GIVE (toxic megacolon risk)",
             "Children under 2 years — NEVER",
             "High fever with diarrhea","Acute ulcerative colitis / pseudomembranous colitis",
             "Suspected bowel obstruction"],
    "hl":   "RULE: Diarrhea + fever + blood = Metronidazole + ORS. Watery diarrhea, no fever, no blood = Loperamide + ORS. Always hydrate!",
  },
  {
    "num": 17, "name": "CIPRO EYE DROPS  (Ciprofloxacin 0.3%)",
    "subtitle": "Fluoroquinolone Ophthalmic Antibiotic",
    "quick": "Bacterial conjunctivitis (pink eye), post-trauma eye infection, corneal ulcer",
    "params": [
        ("Indication",  "Bacterial conjunctivitis, post-trauma eye infection, corneal ulcer"),
        ("Dose",        "1–2 drops per affected eye"),
        ("Route",       "Topical (ophthalmic)"),
        ("Frequency",   "Every 4 hours (Q4H) — 4–6 times daily"),
        ("Duration",    "5–7 days"),
    ],
    "ci":   ["Viral eye infections e.g. herpes keratitis — will worsen","Fungal eye infections",
             "Hypersensitivity to fluoroquinolones","Do not wear contact lenses during treatment"],
    "hl":   "Pull lower lid, instill in conjunctival sac, press inner corner 30 sec. Tip must NOT touch eye. RED EYE + VISION LOSS + SEVERE PAIN = REFER immediately.",
  },
  {
    "num": 18, "name": "CLOTRIMAZOLE OINTMENT 1%",
    "subtitle": "Imidazole Antifungal — Topical",
    "quick": "Ringworm (Tinea), Candida skin infections, Pityriasis versicolor",
    "params": [
        ("Indication",  "Tinea corporis (ringworm), Tinea cruris (groin), Tinea pedis (athlete's foot), Candidal skin infection, Pityriasis versicolor"),
        ("Dose",        "Thin layer over affected area + 1 cm beyond margin"),
        ("Route",       "Topical"),
        ("Frequency",   "BD — twice daily"),
        ("Duration",    "2–4 weeks (continue 1 week after lesion clears to prevent relapse)"),
    ],
    "ci":   ["Ophthalmic use — do not use near eyes","Hypersensitivity",
             "Nail infections alone — needs systemic treatment"],
    "hl":   "Common at camp: ring-shaped, itchy, scaly lesions in body folds. Advise: keep area clean and dry, use own towel, wear loose cotton clothes.",
  },
  {
    "num": 19, "name": "DICLO GEL 1%  (Diclofenac Gel)",
    "subtitle": "Topical NSAID — Localized Pain Relief",
    "quick": "Joint pain, sprains, strains, back pain, knee pain — use locally without GI risk",
    "params": [
        ("Indication",  "Localized musculoskeletal pain, joint pain, sprains, strains, back pain, mild osteoarthritis"),
        ("Dose",        "1–2g (small amount) per application"),
        ("Route",       "Topical"),
        ("Frequency",   "TDS–QID (3–4 times daily)"),
        ("Duration",    "5–7 days"),
    ],
    "ci":   ["Open wounds or broken skin","Eyes or mucous membranes",
             "Children < 6 years","NSAID sensitivity/allergy"],
    "hl":   "Wash hands after application. Do NOT cover with occlusive bandage. Useful for elderly where oral NSAIDs are risky.",
  },
  {
    "num": 20, "name": "DICLO SPRAY  (Diclofenac Spray)",
    "subtitle": "Topical NSAID — Spray Formulation",
    "quick": "Same as Diclo Gel — use for hard-to-reach areas (shoulder, back)",
    "params": [
        ("Indication",  "Musculoskeletal pain, sprains, strains — especially shoulders, back, hard-to-reach areas"),
        ("Dose",        "1–3 sprays on affected area"),
        ("Route",       "Topical"),
        ("Frequency",   "TDS–QID"),
        ("Duration",    "5–7 days"),
    ],
    "ci":   ["Open wounds","Eyes, mouth, nose","NSAID allergy"],
    "hl":   "Spray from 10–15 cm distance. Keep away from face. Let air dry before covering.",
  },
]

for drug in drugs:
    block = []
    # Drug heading
    num_style = sty("_num","Normal", fontSize=9, textColor=WHITE,
                    fontName="Helvetica-Bold", leading=13)
    name_style= sty("_nm", "Normal", fontSize=12, textColor=WHITE,
                    fontName="Helvetica-Bold", leading=16)
    sub_style = sty("_sb", "Normal", fontSize=9,  textColor=LIGHT_BLUE,
                    fontName="Helvetica",      leading=12)
    hdr = Table(
        [[Paragraph(f"Drug {drug['num']:02d}", num_style),
          Paragraph(drug['name'], name_style),
          Paragraph(drug['subtitle'], sub_style)]],
        colWidths=[1.6*cm, 6.5*cm, PAGE_W-2*MARGIN-8.1*cm],
        style=TableStyle([
            ("BACKGROUND",    (0,0), (-1,-1), DARK_BLUE),
            ("TOPPADDING",    (0,0), (-1,-1), 7),
            ("BOTTOMPADDING", (0,0), (-1,-1), 7),
            ("LEFTPADDING",   (0,0), (-1,-1), 8),
            ("VALIGN",        (0,0), (-1,-1), "MIDDLE"),
        ])
    )
    block.append(hdr)
    block.append(Table([[Paragraph("🔑 " + drug['quick'], s_quick)]],
        colWidths=[PAGE_W-2*MARGIN],
        style=TableStyle([
            ("BACKGROUND",(0,0),(-1,-1), TEAL_LIGHT),
            ("TOPPADDING",(0,0),(-1,-1), 5),
            ("BOTTOMPADDING",(0,0),(-1,-1), 5),
            ("LEFTPADDING",(0,0),(-1,-1), 8),
        ])))
    block.append(drug_table(drug['params']))
    block.append(ci_box(drug['ci']))
    block.append(highlight_box(drug['hl']))
    block.append(sp(8))
    story.append(KeepTogether(block))

story.append(PageBreak())

# ═══════════════════════════════════════════════════════════════════════════
# CONSUMABLES TABLE
# ═══════════════════════════════════════════════════════════════════════════
story.append(section_banner("CONSUMABLES & SUPPLIES QUICK REFERENCE"))
story.append(sp(8))

cons_data = [
    [Paragraph("Item", s_bold), Paragraph("Use", s_bold), Paragraph("Key Point", s_bold)],
    ["ORS", "Dehydration from diarrhea/vomiting/heat", "200–400 ml after each loose stool; dissolve 1 packet in 1 litre water"],
    ["Normal Saline (NS)", "IV fluids / wound irrigation", "For wound cleaning and IV replacement in severe dehydration"],
    ["Glucon-D", "Hypoglycemia, heat exhaustion, energy depletion", "Mix 2 tbsp in 200 ml water; for conscious patients only"],
    ["H2O2 3%", "Infected wound cleaning", "Dilute 1:1 with water; not for clean wounds — use NS instead"],
    ["Roller Bandage 4\"", "Upper limb wounds, dressing", "Wrap firmly but not too tight — check capillary refill"],
    ["Roller Bandage 6\"", "Lower limb wounds, splinting", "4\" for upper, 6\" for lower limb as rule of thumb"],
    ["Sterile Gauze Pad", "Wound coverage, dressing", "Change every 24–48 hrs; use NS to moisten if adherent"],
    ["Cotton Roll", "Padding under bandage, wound care", "Place between skin and bandage to prevent pressure sores"],
    ["Surgical Tape", "Securing dressings", "Do not apply over blisters or broken skin"],
    ["Gloves", "Universal precautions", "Wear for ALL wound procedures and examinations"],
    ["Diclo Spray", "Sprains, strains, topical pain", "Keep away from face; 10–15 cm spray distance"],
]
cons_table = Table(
    [[Paragraph(str(r[0]) if i==0 else r[0], s_bold if i==0 else s_body),
      Paragraph(str(r[1]), s_bold if i==0 else s_body),
      Paragraph(str(r[2]), s_bold if i==0 else s_body)]
     for i, r in enumerate(cons_data)],
    colWidths=[3.8*cm, 5.2*cm, PAGE_W-2*MARGIN-9*cm],
    style=TableStyle([
        ("BACKGROUND",    (0,0), (-1,0),  DARK_BLUE),
        ("TEXTCOLOR",     (0,0), (-1,0),  WHITE),
        ("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, GRAY_LIGHT]),
        ("GRID",          (0,0), (-1,-1), 0.4, GRAY_MID),
        ("TOPPADDING",    (0,0), (-1,-1), 5),
        ("BOTTOMPADDING", (0,0), (-1,-1), 5),
        ("LEFTPADDING",   (0,0), (-1,-1), 6),
        ("VALIGN",        (0,0), (-1,-1), "TOP"),
    ])
)
story.append(cons_table)
story.append(PageBreak())

# ═══════════════════════════════════════════════════════════════════════════
# PART 2 — COMMON DISEASES
# ═══════════════════════════════════════════════════════════════════════════
story.append(section_banner("PART 2  |  COMMON CAMP CONDITIONS  (12 Diseases)", bg=TEAL))
story.append(sp(10))

diseases = [
  {
    "num":1, "name":"ACUTE GASTROENTERITIS / DIARRHEA",
    "symptoms":"Loose watery stools, vomiting, cramps, mild fever",
    "rx":[
        ("Watery diarrhea, no fever, no blood", "ORS + Loperamide 4mg then 2mg/stool + Emset 4mg BD"),
        ("Diarrhea + fever (no blood)",         "ORS + Ciprofloxacin 500mg BD x 5 days"),
        ("Blood/mucus in stool (Dysentery)",     "ORS + Metronidazole 400mg TDS x 7 days"),
        ("Severe vomiting, can't take ORS",      "Emset 4mg ODT first — then ORS when vomiting eases"),
        ("Profuse watery / cholera-like",        "IV Normal Saline + URGENT REFERRAL"),
    ],
    "flag": "Referral: Profuse watery stool + severe dehydration, altered consciousness, BP < 90/60"
  },
  {
    "num":2, "name":"FEVER (Viral / Non-specific)",
    "symptoms":"Temperature > 38°C, body ache, headache, fatigue, sore throat",
    "rx":[
        ("Simple viral fever",                        "Paracetamol 500mg–1g TDS x 3 days"),
        ("Fever + body ache (adult)",                 "Diclomol 1 tab BD x 3 days AFTER FOOD + Rantac 150mg BD"),
        ("Fever in children",                         "Paracetamol syrup 10–15 mg/kg Q4–6H only — NOT Diclomol"),
        ("Fever + cough + sore throat",               "Paracetamol + Cough syrup TDS + Rantac 150mg BD"),
        ("Fever > 3 days / rigors / chills",          "Suspect Malaria — refer for RDT/blood smear"),
    ],
    "flag": "Referral: Petechiae, confusion, neck stiffness, continuous vomiting, SpO2 < 94%, BP drop"
  },
  {
    "num":3, "name":"UPPER RESPIRATORY TRACT INFECTION (URTI / Common Cold)",
    "symptoms":"Runny nose, sneezing, sore throat, mild cough, low-grade fever",
    "rx":[
        ("Standard URTI",   "Cetirizine 10mg OD night + Paracetamol 500mg TDS (if fever) + Cough syrup TDS"),
        ("Productive cough","Expectorant cough syrup TDS x 5 days"),
        ("Dry cough only",  "Antitussive cough syrup TDS x 5 days"),
        ("GI protection",   "Rantac 150mg BD if on multiple drugs"),
    ],
    "flag": "Advise: Warm fluids, steam inhalation, rest, hand hygiene. Refer if dyspnea or SpO2 < 94%"
  },
  {
    "num":4, "name":"MUSCULOSKELETAL PAIN / BACK PAIN / JOINT PAIN",
    "symptoms":"Pain in back, knees, feet, joints — especially after long walking (pilgrims)",
    "rx":[
        ("Mild localized pain",      "Diclo Gel or Diclo Spray TDS–QID"),
        ("Moderate–severe pain",     "Diclomol 1 tab BD after food + Rantac 150mg BD x 5 days"),
        ("Elderly with bone pain",   "Calcium 1g OD + B-Complex BD (nutritional support)"),
        ("Ankle sprain",             "RICE: Rest, Ice, Compression (roller bandage), Elevation"),
    ],
    "flag": "Referral: Foot drop, incontinence + back pain, unilateral leg weakness = suspect disc prolapse"
  },
  {
    "num":5, "name":"HYPERTENSION",
    "symptoms":"Headache, dizziness, raised BP — often detected on screening",
    "rx":[
        ("BP 140–160 / known patient ran out of meds", "Amlodipine 5mg OD — continue existing regimen"),
        ("BP 140–160 / first detected",                "Lifestyle counseling + refer to PHC for full workup"),
        ("BP > 180/110, no symptoms (urgency)",        "Amlodipine 5mg stat + monitor + refer"),
        ("BP > 180/110 + symptoms",                    "EMERGENCY REFERRAL immediately"),
    ],
    "flag": "Never restart antihypertensives without knowing prior drug history. Check for duplication."
  },
  {
    "num":6, "name":"FUNGAL SKIN INFECTIONS (Tinea / Ringworm)",
    "symptoms":"Ring-shaped, scaly, itchy lesion with central clearing — groin, body, feet",
    "rx":[
        ("Standard treatment",  "Clotrimazole 1% ointment BD x 2–4 weeks"),
        ("Severe itching",      "Cetirizine 10mg OD night x 5–7 days"),
        ("No oral antifungal",  "If no systemic drug available — refer for Fluconazole 150mg weekly x 4 weeks"),
    ],
    "flag": "Advise: Keep area dry, loose cotton clothes, separate towels. Highly contagious in camp."
  },
  {
    "num":7, "name":"HEAT EXHAUSTION / HEAT STROKE",
    "symptoms":"Muscle cramps, dizziness, weakness, nausea, heavy sweating, or absent sweating (heat stroke)",
    "rx":[
        ("Heat cramps",      "Rest, shade, ORS / Glucon-D, cool compresses"),
        ("Heat exhaustion",  "Move to shade, ORS, cool with wet cloth, rest"),
        ("Heat stroke (T > 40°C, confusion, no sweating)", "EMERGENCY: Cool immediately, IV NS, URGENT REFERRAL"),
    ],
    "flag": "Heat stroke = Medical Emergency. Do NOT delay referral. Remove excess clothing, fan vigorously."
  },
  {
    "num":8, "name":"WOUNDS / LACERATIONS / ABRASIONS",
    "symptoms":"Cuts, abrasions, lacerations — from falls, footwear injuries, sharp objects",
    "rx":[
        ("Clean/minor wound",        "Irrigate with NS, cover with sterile gauze + bandage"),
        ("Dirty/contaminated wound", "Irrigate NS → clean with diluted H2O2 → Ciprofloxacin 500mg BD x 5–7 days"),
        ("Pain management",          "Diclomol 1 tab BD after food + Rantac 150mg BD"),
        ("Tetanus",                  "Ask vaccination history — if unknown/unvaccinated, refer for TT injection"),
    ],
    "flag": "Referral: Deep wounds needing suturing, suspected tendon/nerve injury, arterial bleed."
  },
  {
    "num":9, "name":"ALLERGIC REACTIONS / URTICARIA",
    "symptoms":"Itchy rash/hives, sneezing, watery eyes, running nose — from food, insect bites, pollen",
    "rx":[
        ("Mild — urticaria only",         "Cetirizine 10mg OD x 5–7 days"),
        ("Moderate — widespread hives",   "Cetirizine 10mg BD + monitor"),
        ("Anaphylaxis (throat tightening, breathlessness, BP drop)", "EMERGENCY — Epinephrine (if available) + immediate referral"),
    ],
    "flag": "Any throat swelling or difficulty breathing = ANAPHYLAXIS = immediate emergency."
  },
  {
    "num":10, "name":"CONSTIPATION",
    "symptoms":"No bowel movement > 2 days, hard stools, straining — common with dietary change, dehydration",
    "rx":[
        ("First line",    "Increase fluids (8–10 glasses/day) + fresh fruits + vegetables"),
        ("Drug treatment","Bisacodyl 5–10mg at bedtime x 2–3 days"),
        ("Exclusion",     "RULE OUT obstruction/acute abdomen before prescribing ANY laxative"),
    ],
    "flag": "Do NOT give Bisacodyl if patient has abdominal pain, distension, or not passing flatus."
  },
  {
    "num":11, "name":"EYE INFECTIONS (Bacterial Conjunctivitis)",
    "symptoms":"Red eye, purulent discharge, gritty sensation — no vision loss, no severe pain",
    "rx":[
        ("Bacterial conjunctivitis",  "Cipro Eye Drops 2 drops Q4H x 7 days (both eyes if bilateral)"),
        ("Allergic conjunctivitis",   "Cetirizine 10mg OD + lubricant eye drops (if available)"),
        ("Clean discharge",           "Clean from inner to outer corner with clean wet cloth"),
    ],
    "flag": "RED EYE + VISION LOSS + SEVERE PAIN + PHOTOPHOBIA = REFER IMMEDIATELY — suspect corneal ulcer/uveitis."
  },
  {
    "num":12, "name":"ABDOMINAL PAIN / COLIC",
    "symptoms":"Cramp-like, colicky abdominal pain, bloating, gas, gurgling",
    "rx":[
        ("Spasmodic colic / IBS",     "Cyclopam 1 tab TDS x 3–5 days"),
        ("Gastritis / heartburn",     "Gelusil after meals QID + Rantac 150mg BD"),
        ("Suspected infective cause", "Metronidazole 400mg TDS x 5 days"),
    ],
    "flag": "REFERRAL: Guarding, rigidity, rebound tenderness, no bowel movement, vomiting bile, constant non-colicky pain = surgical emergency."
  },
]

for d in diseases:
    block = []
    hdr = Table(
        [[Paragraph(f"  {d['num']:02d}  ", sty("_dn","Normal",fontSize=11,
                    textColor=WHITE, fontName="Helvetica-Bold", leading=14)),
          Paragraph(d['name'], sty("_dns","Normal",fontSize=11,
                    textColor=WHITE, fontName="Helvetica-Bold", leading=14)),
          Paragraph(d['symptoms'], sty("_dss","Normal",fontSize=8.5,
                    textColor=TEAL_LIGHT, fontName="Helvetica-Oblique", leading=12))]],
        colWidths=[1.3*cm, 6.0*cm, PAGE_W-2*MARGIN-7.3*cm],
        style=TableStyle([
            ("BACKGROUND",    (0,0), (-1,-1), TEAL),
            ("TOPPADDING",    (0,0), (-1,-1), 7),
            ("BOTTOMPADDING", (0,0), (-1,-1), 7),
            ("LEFTPADDING",   (0,0), (-1,-1), 8),
            ("VALIGN",        (0,0), (-1,-1), "MIDDLE"),
        ])
    )
    block.append(hdr)
    # Rx table
    rx_rows = [[Paragraph("Scenario", s_bold), Paragraph("Treatment", s_bold)]]
    for sc, tx in d['rx']:
        rx_rows.append([Paragraph(sc, s_body), Paragraph(tx, s_body)])
    rx_t = Table(rx_rows,
        colWidths=[5.0*cm, PAGE_W-2*MARGIN-5.0*cm],
        style=TableStyle([
            ("BACKGROUND",    (0,0), (-1,0),  TEAL_LIGHT),
            ("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, GRAY_LIGHT]),
            ("GRID",          (0,0), (-1,-1), 0.4, GRAY_MID),
            ("TOPPADDING",    (0,0), (-1,-1), 4),
            ("BOTTOMPADDING", (0,0), (-1,-1), 4),
            ("LEFTPADDING",   (0,0), (-1,-1), 6),
            ("VALIGN",        (0,0), (-1,-1), "TOP"),
        ]))
    block.append(rx_t)
    block.append(Table(
        [[Paragraph("⚑  " + d['flag'],
                    sty("_flag","Normal",fontSize=8.5,textColor=RED,
                        fontName="Helvetica-Bold",leading=12))]],
        colWidths=[PAGE_W-2*MARGIN],
        style=TableStyle([
            ("BACKGROUND",(0,0),(-1,-1), RED_LIGHT),
            ("BOX",(0,0),(-1,-1),0.6, RED),
            ("TOPPADDING",(0,0),(-1,-1), 4),
            ("BOTTOMPADDING",(0,0),(-1,-1), 4),
            ("LEFTPADDING",(0,0),(-1,-1), 8),
        ])))
    block.append(sp(8))
    story.append(KeepTogether(block))

story.append(PageBreak())

# ═══════════════════════════════════════════════════════════════════════════
# QUICK REFERENCE CARD
# ═══════════════════════════════════════════════════════════════════════════
story.append(section_banner("QUICK PRESCRIBING REFERENCE CARD", bg=ORANGE))
story.append(sp(8))

qr_data = [
    [Paragraph("Condition", s_bold), Paragraph("First-Line Drug(s)", s_bold)],
    ["Watery loose motions (no blood)", "ORS + Loperamide 2–4mg + Emset 4mg"],
    ["Bloody/mucus diarrhea (dysentery)", "ORS + Metronidazole 400mg TDS x 7 days"],
    ["Fever (all ages)", "Paracetamol — 500mg–1g adult / 10–15 mg/kg child"],
    ["Fever + body ache (adult only)", "Diclomol 1 tab BD after food + Rantac 150mg BD"],
    ["Acidity / heartburn / gastritis", "Gelusil after meals OR Rantac 150mg BD"],
    ["Allergic rash / running nose", "Cetirizine 10mg OD at night"],
    ["Bacterial conjunctivitis (red eye)", "Cipro Eye Drops 2 drops Q4H x 7 days"],
    ["Fungal skin infection (ringworm)", "Clotrimazole 1% ointment BD x 3–4 weeks"],
    ["Productive cough", "Expectorant cough syrup 10ml TDS"],
    ["Dry irritating cough", "Antitussive cough syrup 10ml TDS"],
    ["Colicky abdominal pain", "Cyclopam 1 tab TDS x 3–5 days"],
    ["Nausea / vomiting", "Emset (Ondansetron) 4mg BD–TDS"],
    ["Localized joint/back pain", "Diclo Gel or Diclo Spray TDS + Diclomol if severe"],
    ["UTI / infected wound", "Ciprofloxacin 500mg BD x 5–7 days"],
    ["Hypertension (known patient)", "Amlodipine 5mg OD — continue"],
    ["Constipation", "Bisacodyl 5–10mg at bedtime (rule out obstruction first)"],
    ["Weakness / nutritional deficiency", "Multivitamin OD + B-Complex BD"],
    ["Bone pain / elderly / pregnancy", "Calcium 1g BD"],
    ["Heat exhaustion", "Shade + ORS + Glucon-D + cool compresses"],
    ["Heat stroke (T > 40°C, confusion)", "IV NS + EMERGENCY REFERRAL"],
]

col_w = PAGE_W - 2*MARGIN
qr_table = Table(
    [[Paragraph(str(r[0]), s_bold if i==0 else s_body),
      Paragraph(str(r[1]), s_bold if i==0 else s_body)]
     for i, r in enumerate(qr_data)],
    colWidths=[5.5*cm, col_w - 5.5*cm],
    style=TableStyle([
        ("BACKGROUND",    (0,0), (-1,0),  ORANGE),
        ("TEXTCOLOR",     (0,0), (-1,0),  WHITE),
        ("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, ORANGE_LIGHT]),
        ("GRID",          (0,0), (-1,-1), 0.4, GRAY_MID),
        ("TOPPADDING",    (0,0), (-1,-1), 4),
        ("BOTTOMPADDING", (0,0), (-1,-1), 4),
        ("LEFTPADDING",   (0,0), (-1,-1), 6),
        ("VALIGN",        (0,0), (-1,-1), "TOP"),
    ])
)
story.append(qr_table)
story.append(sp(14))

# Emergency box
story.append(section_banner("⚠  EMERGENCY REFERRAL CRITERIA", bg=RED))
story.append(sp(4))
emergency_items = [
    "Altered consciousness / confusion",
    "Chest pain or severe breathlessness",
    "SpO2 < 92% on air",
    "BP > 180/120 with symptoms",
    "Temperature > 40°C (heat stroke)",
    "Rigid abdomen — peritonitis / surgical emergency",
    "Throat swelling / stridor — anaphylaxis",
    "Profuse uncontrolled bleeding",
    "Vision loss with red eye",
    "Suspected fracture with neurovascular compromise",
]
em_text = "  •  ".join(emergency_items)
story.append(Table(
    [[Paragraph(em_text, sty("_em","Normal",fontSize=9,textColor=RED,
                              fontName="Helvetica-Bold",leading=14))]],
    colWidths=[PAGE_W-2*MARGIN],
    style=TableStyle([
        ("BACKGROUND",(0,0),(-1,-1), RED_LIGHT),
        ("BOX",(0,0),(-1,-1),1.2,RED),
        ("TOPPADDING",(0,0),(-1,-1), 8),
        ("BOTTOMPADDING",(0,0),(-1,-1), 8),
        ("LEFTPADDING",(0,0),(-1,-1), 10),
    ])
))

story.append(sp(14))
story.append(Table(
    [[Paragraph(
        "Manual prepared for Wari Medical Camp | MIMER Medical College &amp; Dr. BSTR Hospital, Talegaon Dabhade | 15 July 2026<br/>"
        "For use by qualified healthcare professionals only.",
        sty("_footer","Normal",fontSize=8,textColor=GRAY_MID,
            fontName="Helvetica-Oblique",alignment=TA_CENTER,leading=12)
    )]],
    colWidths=[PAGE_W-2*MARGIN],
    style=TableStyle([
        ("TOPPADDING",(0,0),(-1,-1),5),
    ])
))

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

cd /tmp/workspace/wari-camp && python generate_manual.py 2>&1

Running Command

ls -lh /tmp/workspace/wari-camp/Wari_Camp_Drug_Manual.pdf

Your print-ready PDF is ready. Download it here:

Wari Camp Drug Manual

PDF Document · PDF

What's inside the PDF (print-ready, A4):
  • Cover page with camp name, hospital, and date
  • Part 1 - 20 Drug Profiles, each with a colour-coded card:
    • Dark blue header (drug number + name)
    • Teal quick-summary strip (key point at a glance)
    • Parameter table (Indication / Dose / Route / Frequency / Duration)
    • Red contraindication box
    • Yellow highlight box for the most important clinical pearl
  • Consumables Reference Table
  • Part 2 - 12 Common Camp Diseases with scenario-based treatment tables and referral flags
  • Quick Prescribing Reference Card - the full condition-to-drug table on one page
  • Emergency Referral Criteria in a prominent red box
  • Header and page numbers on every page
Best of luck at the Wari Medical Camp tomorrow!
This is a shared conversation. Sign in to Orris to start your own chat.