/* global React, Icon, MOUNJARO, WEGOVY, fmtMoney, initials, calcAge, productById, formatDate, StatusBadge */
const { useState: uS2, useMemo: uM2 } = React;

// ===== Patient list =====
function PatientList({ patients, setRoute, openPatient, onNewPatient }) {
  const [q, setQ] = uS2("");
  const [filter, setFilter] = uS2("all");
  const filtered = patients.filter(p => {
    if (filter !== "all" && p.status !== filter) return false;
    if (q && !(p.first + " " + p.last).toLowerCase().includes(q.toLowerCase())) return false;
    return true;
  });

  return (
    <div className="page">
      <div className="page-header">
        <div>
          <div className="page-eyebrow">Caseload</div>
          <h1 className="page-title">Patients</h1>
          <p className="page-sub">{patients.length} on your caseload · {patients.filter(p => p.status === "active").length} active</p>
        </div>
        <div className="page-actions">
          <button className="btn btn-ghost">Import CSV</button>
          <button className="btn btn-accent" onClick={onNewPatient}><Icon.New /> Add patient</button>
        </div>
      </div>

      <div style={{ display: "flex", gap: 12, marginBottom: 16, alignItems: "center" }}>
        <div className="search-bar" style={{ maxWidth: 320, flex: "0 0 auto" }}>
          <Icon.Search />
          <input value={q} onChange={(e) => setQ(e.target.value)} placeholder="Find a patient…" />
        </div>
        <div style={{ display: "flex", gap: 4, padding: 4, background: "var(--paper)", border: "1px solid var(--line)", borderRadius: 8 }}>
          {[["all","All"],["active","Active"],["review","Review"],["paused","Paused"],["draft","Draft"]].map(([k, l]) => (
            <button key={k} className="btn btn-sm" style={{
              background: filter === k ? "var(--ink)" : "transparent",
              color: filter === k ? "#fff" : "var(--ink-3)",
              border: "none",
            }} onClick={() => setFilter(k)}>{l}</button>
          ))}
        </div>
        <div style={{ flex: 1 }} />
        <button className="btn btn-ghost btn-sm">Sort: Recent <Icon.Chevron /></button>
      </div>

      <div className="tbl-card">
        <table className="tbl">
          <thead>
            <tr>
              <th>Patient</th><th>DOB · Age</th><th>BMI</th><th>GP</th><th>Last order</th><th>Status</th><th></th>
            </tr>
          </thead>
          <tbody>
            {filtered.map(p => (
              <tr key={p.id} onClick={() => openPatient(p.id)}>
                <td>
                  <div className="patient-cell">
                    <div className="patient-avatar">{initials(p.first, p.last)}</div>
                    <div>
                      <div className="patient-name">{p.first} {p.last}</div>
                      <div className="patient-meta">{p.email}</div>
                    </div>
                  </div>
                </td>
                <td className="tnum">{formatDate(p.dob)} <span className="muted">· {calcAge(p.dob)}</span></td>
                <td className="tnum"><strong>{p.bmi.toFixed(1)}</strong> <span className="muted" style={{ fontSize: 11 }}>· {p.weight}kg</span></td>
                <td><span className="muted">{p.gp}</span></td>
                <td className="tnum">{formatDate(p.lastOrder)}</td>
                <td><StatusBadge status={p.status} /></td>
                <td className="right"><Icon.ChevronR style={{ color: "var(--ink-4)" }} /></td>
              </tr>
            ))}
          </tbody>
        </table>
        {filtered.length === 0 && (
          <div style={{ padding: 60, textAlign: "center", color: "var(--ink-3)" }}>
            No patients match your filters.
          </div>
        )}
      </div>
    </div>
  );
}

// ===== New prescription wizard (Step 1: pick / add patient) =====
function NewPrescriptionWizard({ patients, setRoute, addPatient, addOrder, prefillPatientId }) {
  const [step, setStep] = uS2(prefillPatientId ? 2 : 1);
  const [mode, setMode] = uS2(prefillPatientId ? "existing" : "new"); // "existing" | "new"
  const [selectedPatient, setSelectedPatient] = uS2(prefillPatientId || null);
  const [newPatient, setNewPatient] = uS2({
    first: "", last: "", dob: "", phone: "", email: "",
    address: "", postcode: "",
    height: "", weight: "",
    gpName: "", gpSurgery: "",
  });
  const [cart, setCart] = uS2([]); // [{pid, qty}]
  const [productTab, setProductTab] = uS2("mounjaro");

  const subtotal = cart.reduce((s, ci) => s + (productById(ci.pid)?.price || 0) * ci.qty, 0);
  const shipping = subtotal > 0 ? 4.95 : 0;
  const tax = 0;
  const total = subtotal + shipping + tax;

  const bmi = newPatient.height && newPatient.weight
    ? (newPatient.weight / Math.pow(newPatient.height / 100, 2)).toFixed(1)
    : "—";

  const updateCart = (pid, delta) => {
    setCart(prev => {
      const found = prev.find(c => c.pid === pid);
      if (!found && delta > 0) return [...prev, { pid, qty: 1 }];
      if (!found) return prev;
      const newQty = found.qty + delta;
      if (newQty <= 0) return prev.filter(c => c.pid !== pid);
      return prev.map(c => c.pid === pid ? { ...c, qty: newQty } : c);
    });
  };
  const setQty = (pid, qty) => {
    setCart(prev => {
      if (qty <= 0) return prev.filter(c => c.pid !== pid);
      const found = prev.find(c => c.pid === pid);
      if (!found) return [...prev, { pid, qty }];
      return prev.map(c => c.pid === pid ? { ...c, qty } : c);
    });
  };

  const products = productTab === "mounjaro" ? MOUNJARO : WEGOVY;
  const currentPatient = selectedPatient ? patients.find(p => p.id === selectedPatient) : null;

  const submitOrder = () => {
    let pid = selectedPatient;
    if (mode === "new") {
      const newP = addPatient({
        ...newPatient,
        bmi: bmi !== "—" ? parseFloat(bmi) : 0,
        height: parseFloat(newPatient.height) || 0,
        weight: parseFloat(newPatient.weight) || 0,
        gp: newPatient.gpName + " · " + newPatient.gpSurgery,
      });
      pid = newP.id;
    }
    const orderId = addOrder({ patientId: pid, items: cart, total });
    setRoute({ name: "order-confirmation", orderId });
  };

  return (
    <div className="page">
      <div className="page-header">
        <div>
          <div className="page-eyebrow">New prescription</div>
          <h1 className="page-title">Submit a prescription</h1>
          <p className="page-sub">Three steps — patient details, treatment, then payment. Dispensing begins as soon as we receive your sign-off.</p>
        </div>
        <div className="page-actions">
          <button className="btn btn-ghost">Save as draft</button>
        </div>
      </div>

      <div className="stepper">
        <div className={"step" + (step === 1 ? " active" : step > 1 ? " done" : "")}>
          <div className="step-num">{step > 1 ? <Icon.Check /> : "1"}</div>
          Patient
        </div>
        <div className="step-divider" />
        <div className={"step" + (step === 2 ? " active" : step > 2 ? " done" : "")}>
          <div className="step-num">{step > 2 ? <Icon.Check /> : "2"}</div>
          Treatment
        </div>
        <div className="step-divider" />
        <div className={"step" + (step === 3 ? " active" : "")}>
          <div className="step-num">3</div>
          Review & pay
        </div>
      </div>

      {step === 1 && (
        <div style={{ display: "grid", gridTemplateColumns: "1.5fr 1fr", gap: 16 }}>
          <div className="card" style={{ padding: 0 }}>
            <div style={{ display: "grid", gridTemplateColumns: "1fr 1fr", borderBottom: "1px solid var(--line)" }}>
              <button className="pay-tab" style={{ borderBottom: mode === "existing" ? "2px solid var(--accent)" : "2px solid transparent", background: mode === "existing" ? "var(--paper)" : "var(--canvas-2)", color: mode === "existing" ? "var(--ink)" : "var(--ink-3)" }} onClick={() => setMode("existing")}>
                Existing patient
              </button>
              <button className="pay-tab" style={{ borderBottom: mode === "new" ? "2px solid var(--accent)" : "2px solid transparent", background: mode === "new" ? "var(--paper)" : "var(--canvas-2)", color: mode === "new" ? "var(--ink)" : "var(--ink-3)" }} onClick={() => setMode("new")}>
                New patient
              </button>
            </div>

            {mode === "existing" ? (
              <div style={{ padding: "20px 24px" }}>
                <div className="search-bar" style={{ maxWidth: "100%", marginBottom: 16 }}>
                  <Icon.Search />
                  <input placeholder="Search your caseload…" />
                </div>
                <div style={{ display: "flex", flexDirection: "column", gap: 6, maxHeight: 480, overflow: "auto" }}>
                  {patients.map(p => (
                    <button key={p.id} onClick={() => setSelectedPatient(p.id)} style={{
                      textAlign: "left",
                      padding: "12px 14px",
                      background: selectedPatient === p.id ? "var(--accent-soft)" : "transparent",
                      border: "1px solid " + (selectedPatient === p.id ? "var(--accent)" : "var(--line)"),
                      borderRadius: 10,
                      cursor: "pointer",
                      fontFamily: "inherit",
                      display: "flex",
                      gap: 12,
                      alignItems: "center",
                    }}>
                      <div className="patient-avatar">{initials(p.first, p.last)}</div>
                      <div style={{ flex: 1 }}>
                        <div style={{ fontWeight: 500 }}>{p.first} {p.last}</div>
                        <div style={{ fontSize: 11, color: "var(--ink-4)" }}>DOB {formatDate(p.dob)} · BMI {p.bmi.toFixed(1)} · {p.orders} prior orders</div>
                      </div>
                      {selectedPatient === p.id && <div style={{ color: "var(--accent)" }}><Icon.Check /></div>}
                    </button>
                  ))}
                </div>
              </div>
            ) : (
              <div>
                <NewPatientForm patient={newPatient} setPatient={setNewPatient} bmi={bmi} />
              </div>
            )}
          </div>

          <div>
            <SidePanel title="Why we ask">
              <p style={{ fontSize: 13, color: "var(--ink-3)", lineHeight: 1.55, margin: "0 0 14px" }}>
                Patient details are stored against your clinic record so you can re-prescribe without re-entering information. Demographics support the pharmacist's clinical check.
              </p>
              <div style={{ borderTop: "1px solid var(--line)", paddingTop: 14, marginTop: 14 }}>
                <div style={{ fontSize: 11, textTransform: "uppercase", letterSpacing: "0.1em", color: "var(--ink-4)", marginBottom: 8 }}>Required for GLP-1</div>
                <ul style={{ margin: 0, padding: 0, listStyle: "none", fontSize: 12, color: "var(--ink-2)", display: "flex", flexDirection: "column", gap: 6 }}>
                  <li>✓ Age, height, weight (BMI ≥ 27)</li>
                  <li>✓ Confirmed delivery address</li>
                  <li>✓ Registered GP</li>
                  <li>✓ Prescriber sign-off (you)</li>
                </ul>
              </div>
            </SidePanel>
          </div>
        </div>
      )}

      {step === 2 && (
        <div style={{ display: "grid", gridTemplateColumns: "1.5fr 1fr", gap: 16 }}>
          <div className="card">
            <div className="product-tabs">
              <button className={"product-tab" + (productTab === "mounjaro" ? " active" : "")} onClick={() => setProductTab("mounjaro")}>Mounjaro · Tirzepatide</button>
              <button className={"product-tab" + (productTab === "wegovy" ? " active" : "")} onClick={() => setProductTab("wegovy")}>Wegovy · Semaglutide</button>
            </div>

            <div className="strength-grid">
              {products.map(p => {
                const inCart = cart.find(c => c.pid === p.id);
                return (
                  <div key={p.id} className={"strength-card" + (inCart ? " selected" : "") + (p.stock === "out" ? " disabled" : "")} onClick={() => p.stock !== "out" && updateCart(p.id, inCart ? 0 : 1)}>
                    <div className={"strength-stock " + ("stock-" + p.stock)}>{p.stock === "in" ? "In stock" : p.stock === "low" ? "Low stock" : "Out of stock"}</div>
                    <div className="strength-img">
                      {p.img ? <img src={p.img} alt={p.strength} /> : <div className="placeholder" style={{ width: "100%", height: "100%" }}>{"<pen-photo>"}</div>}
                    </div>
                    <div>
                      <div className="strength-name">{p.strength}</div>
                      <div className="strength-meta">{p.name} · 4 doses {p.line === "starter" ? "· starter dose" : ""}</div>
                    </div>
                    <div style={{ display: "flex", justifyContent: "space-between", alignItems: "center", marginTop: 4 }}>
                      <div className="strength-price tnum">{fmtMoney(p.price)}</div>
                      {inCart ? (
                        <div className="qty" onClick={(e) => e.stopPropagation()}>
                          <button className="qty-btn" onClick={() => updateCart(p.id, -1)}>−</button>
                          <div className="qty-val tnum">{inCart.qty}</div>
                          <button className="qty-btn" onClick={() => updateCart(p.id, 1)}>+</button>
                        </div>
                      ) : (
                        <button className="btn btn-ghost btn-sm" onClick={(e) => { e.stopPropagation(); if (p.stock !== "out") setQty(p.id, 1); }} disabled={p.stock === "out"}>Add</button>
                      )}
                    </div>
                  </div>
                );
              })}
            </div>

            <div className="divider" />
            <div style={{ display: "flex", gap: 12 }}>
              <div style={{ flex: 1 }}>
                <div className="field">
                  <label>Prescriber notes (optional)</label>
                  <textarea className="textarea" rows={3} placeholder="e.g. Patient is up-titrating from 2.5mg after 4 weeks, no significant side effects reported." />
                </div>
              </div>
            </div>
          </div>

          <SidePanel title="For" patient={currentPatient || newPatient}>
            <CartSummary cart={cart} subtotal={subtotal} shipping={shipping} total={total} />
          </SidePanel>
        </div>
      )}

      <div style={{ display: "flex", justifyContent: "space-between", marginTop: 24 }}>
        <button className="btn btn-ghost" onClick={() => step > 1 ? setStep(step - 1) : setRoute("dashboard")}>
          ← {step > 1 ? "Back" : "Cancel"}
        </button>
        {step === 1 && (
          <button className="btn btn-primary" disabled={mode === "existing" ? !selectedPatient : !newPatient.first} onClick={() => setStep(2)}>
            Continue to treatment <Icon.ChevronR />
          </button>
        )}
        {step === 2 && (
          <button className="btn btn-primary" disabled={cart.length === 0} onClick={() => setRoute({ name: "checkout", cart, patient: mode === "new" ? newPatient : currentPatient, mode, total, subtotal, shipping, onSubmit: submitOrder })}>
            Continue to payment · <span className="tnum">{fmtMoney(total)}</span> <Icon.ChevronR />
          </button>
        )}
      </div>
    </div>
  );
}

function NewPatientForm({ patient, setPatient, bmi }) {
  const u = (k) => (e) => setPatient({ ...patient, [k]: e.target.value });
  return (
    <>
      <div className="form-section">
        <h3>Identity</h3>
        <div className="form-section-sub">Legal name as on photo ID. We'll match against the GP record.</div>
        <div className="field-row">
          <div className="field"><label>First name</label><input className="input" value={patient.first} onChange={u("first")} placeholder="Sarah" /></div>
          <div className="field"><label>Last name</label><input className="input" value={patient.last} onChange={u("last")} placeholder="Khalid" /></div>
        </div>
        <div className="field-row" style={{ marginTop: 14 }}>
          <div className="field"><label>Date of birth</label><input className="input" type="date" value={patient.dob} onChange={u("dob")} /></div>
          <div className="field"><label>Sex assigned at birth</label>
            <select className="select"><option>Female</option><option>Male</option><option>Prefer not to say</option></select>
          </div>
        </div>
      </div>

      <div className="form-section">
        <h3>Contact</h3>
        <div className="form-section-sub">Used for delivery confirmation and pharmacist follow-up only.</div>
        <div className="field-row">
          <div className="field"><label>Phone</label><input className="input" value={patient.phone} onChange={u("phone")} placeholder="+44 7700 900 000" /></div>
          <div className="field"><label>Email</label><input className="input" value={patient.email} onChange={u("email")} placeholder="patient@email.co.uk" /></div>
        </div>
        <div className="field-row" style={{ marginTop: 14, gridTemplateColumns: "2fr 1fr" }}>
          <div className="field"><label>Delivery address</label><input className="input" value={patient.address} onChange={u("address")} placeholder="Street, town" /></div>
          <div className="field"><label>Postcode</label><input className="input" value={patient.postcode} onChange={u("postcode")} placeholder="M14 5GP" /></div>
        </div>
      </div>

      <div className="form-section">
        <h3>Clinical</h3>
        <div className="form-section-sub">Required for the pharmacist's BMI eligibility check.</div>
        <div className="field-row-3">
          <div className="field"><label>Height (cm)</label><input className="input tnum" value={patient.height} onChange={u("height")} placeholder="168" /></div>
          <div className="field"><label>Weight (kg)</label><input className="input tnum" value={patient.weight} onChange={u("weight")} placeholder="92" /></div>
          <div className="field"><label>BMI <span className="hint">computed</span></label>
            <div style={{ padding: "10px 12px", background: "var(--canvas-2)", borderRadius: 8, fontWeight: 600, fontFamily: "'Newsreader', serif", fontSize: 18, letterSpacing: "-0.02em" }} className="tnum">{bmi}</div>
          </div>
        </div>
      </div>

      <div className="form-section">
        <h3>Registered GP</h3>
        <div className="form-section-sub">We'll notify the GP that a private prescription has been issued, in line with GMC guidance.</div>
        <div className="field-row">
          <div className="field"><label>GP name</label><input className="input" placeholder="Dr. M. Fielding" onChange={u("gpName")} value={patient.gpName} /></div>
          <div className="field"><label>Surgery</label><input className="input" placeholder="Beaumont Surgery" onChange={u("gpSurgery")} value={patient.gpSurgery} /></div>
        </div>
      </div>
    </>
  );
}

function SidePanel({ title, patient, children }) {
  return (
    <div className="card">
      <div className="section-h"><h2>{title}</h2></div>
      {patient && patient.first && (
        <div style={{ display: "flex", alignItems: "center", gap: 10, marginBottom: 14, paddingBottom: 14, borderBottom: "1px solid var(--line)" }}>
          <div className="patient-avatar" style={{ width: 38, height: 38 }}>{initials(patient.first || "?", patient.last || "?")}</div>
          <div>
            <div style={{ fontWeight: 500 }}>{patient.first} {patient.last}</div>
            <div style={{ fontSize: 11, color: "var(--ink-4)" }}>{patient.dob ? formatDate(patient.dob) + " · " : ""}{patient.bmi ? "BMI " + (typeof patient.bmi === "number" ? patient.bmi.toFixed(1) : patient.bmi) : ""}</div>
          </div>
        </div>
      )}
      {children}
    </div>
  );
}

function CartSummary({ cart, subtotal, shipping, total }) {
  return (
    <div>
      {cart.length === 0 ? (
        <div style={{ textAlign: "center", padding: "40px 0", color: "var(--ink-4)", fontSize: 13 }}>
          No items added yet.<br /><span style={{ fontSize: 11 }}>Pick a strength to begin.</span>
        </div>
      ) : (
        <>
          {cart.map(c => {
            const p = productById(c.pid);
            return (
              <div key={c.pid} className="order-line">
                <div className="order-line-img">
                  {p.img ? <img src={p.img} alt={p.strength} /> : <div style={{ fontSize: 9, color: "var(--ink-4)" }}>{p.strength}</div>}
                </div>
                <div className="order-line-body">
                  <div className="order-line-title">{p.name}</div>
                  <div className="order-line-sub">{p.strength} · 4 doses · qty {c.qty}</div>
                </div>
                <div className="order-line-price tnum">{fmtMoney(p.price * c.qty)}</div>
              </div>
            );
          })}
          <div className="divider" />
          <div className="summary-line"><span>Subtotal</span><span className="v tnum">{fmtMoney(subtotal)}</span></div>
          <div className="summary-line"><span>Tracked delivery</span><span className="v tnum">{fmtMoney(shipping)}</span></div>
          <div className="summary-line"><span>VAT</span><span className="v muted">included</span></div>
          <div className="summary-line total"><span>Total</span><span className="v tnum">{fmtMoney(total)}</span></div>
        </>
      )}
    </div>
  );
}

window.PatientList = PatientList;
window.NewPrescriptionWizard = NewPrescriptionWizard;
window.SidePanel = SidePanel;
window.CartSummary = CartSummary;
