/* global React, Icon, kDb, kStorage, PRODUCT, applyProductConfig, printSlipWithQR */
const { useState, useEffect, useMemo } = React;

// ── Line chart (pure SVG) ───────────────────────────────────────────────────
function LineChart({ data, yFmt = v => "$" + v.toFixed(0), color = "var(--accent)" }) {
  const W = 800, H = 160;
  const pL = 44, pR = 8, pT = 10, pB = 30;
  const cW = W - pL - pR, cH = H - pT - pB;
  const vals = data.map(d => d.v);
  const max  = Math.max(...vals, 1);

  const cx = i  => pL + (i / Math.max(data.length - 1, 1)) * cW;
  const cy = v  => pT + cH - (v / max) * cH;

  const linePts = data.map((d, i) => `${i ? "L" : "M"} ${cx(i).toFixed(1)} ${cy(d.v).toFixed(1)}`).join(" ");
  const area    = `${linePts} L ${cx(data.length - 1).toFixed(1)} ${(pT + cH).toFixed(1)} L ${pL} ${(pT + cH).toFixed(1)} Z`;

  const gridYs = [0, 0.25, 0.5, 0.75, 1].map(t => ({ yy: pT + t * cH, val: max * (1 - t) }));
  const step   = Math.max(1, Math.ceil(data.length / 7));
  const xTicks = data.map((d, i) => ({ d, i })).filter(({ i }) => i % step === 0 || i === data.length - 1);

  return (
    <svg viewBox={`0 0 ${W} ${H}`} style={{ width: "100%", height: "auto", display: "block" }}>
      {gridYs.map((g, k) => (
        <g key={k}>
          <line x1={pL} y1={g.yy.toFixed(1)} x2={W - pR} y2={g.yy.toFixed(1)} stroke="var(--line)" strokeWidth="1" />
          <text x={pL - 4} y={g.yy + 3} textAnchor="end" fontSize="9" fill="var(--fg-muted)" fontFamily="monospace">{yFmt(g.val)}</text>
        </g>
      ))}
      {xTicks.map(({ d, i }) => (
        <text key={i} x={cx(i)} y={H - 4} textAnchor="middle" fontSize="9" fill="var(--fg-muted)" fontFamily="monospace">{d.label}</text>
      ))}
      <path d={area}    fill={color} opacity="0.1" />
      <path d={linePts} fill="none"  stroke={color} strokeWidth="1.5" strokeLinejoin="round" strokeLinecap="round" />
      {data.map((d, i) => d.v > 0
        ? <circle key={i} cx={cx(i)} cy={cy(d.v)} r="2.5" fill={color} />
        : null
      )}
    </svg>
  );
}

// ── Analytics section ───────────────────────────────────────────────────────
function AnalyticsSection({ orders }) {
  const [range, setRange] = useState(30);         // 7 | 30 | 90 | 0 = all time
  const [chart, setChart] = useState("revenue");  // "revenue" | "count"

  const cutoff = useMemo(() => {
    if (range === 0) return null;
    const d = new Date(); d.setDate(d.getDate() - range); d.setHours(0, 0, 0, 0);
    return d;
  }, [range]);

  const filtered = useMemo(() =>
    cutoff ? orders.filter(o => { const d = o.createdAt?.toDate?.(); return d && d >= cutoff; }) : orders,
    [orders, cutoff]
  );

  // ── Metrics ────────────────────────────────────────────────────────────────
  const totalRevenue  = filtered.reduce((s, o) => s + (o.total    || 0), 0);
  const totalDiscount = filtered.reduce((s, o) => s + (o.discount || 0), 0);
  const totalOrders   = filtered.length;
  const avgOrder      = totalOrders > 0 ? totalRevenue / totalOrders : 0;

  // ── Daily timeline ─────────────────────────────────────────────────────────
  const days = range > 0 ? range : 90;
  const dayData = useMemo(() => {
    const today = new Date(); today.setHours(0, 0, 0, 0);
    return Array.from({ length: days }, (_, i) => {
      const d   = new Date(today); d.setDate(d.getDate() - (days - 1 - i));
      const key = d.toISOString().slice(0, 10);
      const dayOrders = orders.filter(o => o.createdAt?.toDate?.()?.toISOString().slice(0, 10) === key);
      return {
        key,
        label:   d.toLocaleDateString("en-US", { month: "short", day: "numeric" }),
        revenue: dayOrders.reduce((s, o) => s + (o.total || 0), 0),
        count:   dayOrders.length,
      };
    });
  }, [orders, days]);

  const chartData = dayData.map(d => ({ label: d.label, v: chart === "revenue" ? d.revenue : d.count }));

  // ── Status breakdown ───────────────────────────────────────────────────────
  const statusBreakdown = Object.entries(STATUS_LABEL).map(([k, label]) => ({
    label: `${STATUS_KH[k]} · ${label}`,
    value: filtered.filter(o => o.status === k).length,
    color: STATUS_COLOR[k],
  })).filter(s => s.value > 0);

  // ── Variant performance ────────────────────────────────────────────────────
  const variantPerf = PRODUCT.sizes.map(s => {
    const qty = filtered.reduce((sum, o) =>
      sum + (o.items || []).filter(it => it.sizeId === s.id).reduce((a, it) => a + it.qty, 0), 0);
    const rev = filtered.reduce((sum, o) =>
      sum + (o.items || []).filter(it => it.sizeId === s.id).reduce((a, it) => a + it.qty * (it.price || 0), 0), 0);
    return { ...s, qty, rev };
  });
  const maxRev = Math.max(...variantPerf.map(v => v.rev), 1);

  // ── Stat card ──────────────────────────────────────────────────────────────
  const StatCard = ({ kh, en, val, accent }) => (
    <div style={{ border: "1px solid var(--line)", borderRadius: 12, padding: "20px 24px", background: "var(--bg-2)" }}>
      <div className="col gap-8">
        <span className="mono text-muted" style={{ fontSize: "var(--text-2xs)", letterSpacing: "0.1em", textTransform: "uppercase" }}>
          <span className="km-sans" style={{ textTransform: "none", letterSpacing: 0 }}>{kh}</span> · {en}
        </span>
        <span className="serif" style={{ fontSize: "var(--text-3xl)", color: accent ? "var(--accent)" : "var(--fg)" }}>
          {val}
        </span>
      </div>
    </div>
  );

  return (
    <div className="col gap-32" style={{ paddingTop: 32 }}>

      {/* ── Range + chart toggle ── */}
      <div className="row justify-between items-center flex-wrap gap-12">
        <div className="seg">
          {[[7,"7D"],[30,"30D"],[90,"90D"],[0,"All"]].map(([v, l]) => (
            <button key={v} type="button" className={range === v ? "is-on" : ""} onClick={() => setRange(v)}>{l}</button>
          ))}
        </div>
        <span className="mono text-muted" style={{ fontSize: "var(--text-2xs)", letterSpacing: "0.08em" }}>
          {filtered.length} ORDERS · {{ 7:"7 days",30:"30 days",90:"90 days",0:"All time" }[range]}
        </span>
      </div>

      {/* ── Metrics ── */}
      <div className="admin-stats-4" style={{ display: "grid", gridTemplateColumns: "repeat(3, 1fr)", gap: 16 }}>
        <StatCard kh="ចំណូលសរុប"    en="Revenue"   val={`$${totalRevenue.toFixed(2)}`} />
        <StatCard kh="ការបញ្ជាទិញ"   en="Orders"    val={totalOrders} />
        <StatCard kh="មធ្យមភាគ"       en="Avg order" val={`$${avgOrder.toFixed(2)}`} />
      </div>

      {/* ── Chart ── */}
      <div style={{ border: "1px solid var(--line)", borderRadius: 12, padding: "24px 24px 16px", background: "var(--bg-2)" }}>
        <div className="row justify-between items-center" style={{ marginBottom: 20 }}>
          <span className="mono text-muted" style={{ fontSize: "var(--text-2xs)", letterSpacing: "0.1em", textTransform: "uppercase" }}>
            <span className="km-sans" style={{ textTransform: "none", letterSpacing: 0 }}>
              {chart === "revenue" ? "ចំណូល" : "ចំនួនការបញ្ជាទិញ"}
            </span>
            {" · "}{chart === "revenue" ? "Revenue over time" : "Orders over time"}
          </span>
          <div className="seg">
            <button type="button" className={chart === "revenue" ? "is-on" : ""} onClick={() => setChart("revenue")}>Revenue</button>
            <button type="button" className={chart === "count"   ? "is-on" : ""} onClick={() => setChart("count")}>Orders</button>
          </div>
        </div>
        {chartData.every(d => d.v === 0)
          ? <div style={{ padding: "48px 0", textAlign: "center" }}>
              <span className="mono text-muted" style={{ fontSize: "var(--text-xs)" }}>No data in this period.</span>
            </div>
          : <LineChart
              data={chartData}
              yFmt={chart === "revenue" ? v => `$${v.toFixed(0)}` : v => String(Math.round(v))}
              color={chart === "revenue" ? "var(--accent)" : "#2563eb"}
            />
        }
      </div>

      {/* ── Status + Variants ── */}
      <div style={{ display: "grid", gridTemplateColumns: "1fr 1fr", gap: 24 }}>

        <div style={{ border: "1px solid var(--line)", borderRadius: 12, padding: "20px 24px", background: "var(--bg-2)" }}>
          <span className="mono text-muted" style={{ fontSize: "var(--text-2xs)", letterSpacing: "0.1em", textTransform: "uppercase", display: "block", marginBottom: 20 }}>
            <span className="km-sans" style={{ textTransform: "none", letterSpacing: 0 }}>ស្ថានភាព</span> · By status
          </span>
          {statusBreakdown.length === 0
            ? <span className="mono text-muted" style={{ fontSize: "var(--text-xs)" }}>No orders.</span>
            : <div className="col gap-14">
                {statusBreakdown.map(s => (
                  <div key={s.label} className="col gap-5">
                    <div className="row justify-between">
                      <span style={{ fontSize: "var(--text-xs)" }}>{s.label}</span>
                      <span className="mono" style={{ fontSize: "var(--text-xs)", color: s.color }}>{s.value}</span>
                    </div>
                    <div style={{ height: 6, background: "var(--bg-3)", borderRadius: 99, overflow: "hidden" }}>
                      <div style={{ height: "100%", borderRadius: 99, background: s.color, transition: "width 500ms ease",
                        width: `${(s.value / Math.max(filtered.length, 1)) * 100}%` }} />
                    </div>
                  </div>
                ))}
              </div>
          }
        </div>

        <div style={{ border: "1px solid var(--line)", borderRadius: 12, padding: "20px 24px", background: "var(--bg-2)" }}>
          <span className="mono text-muted" style={{ fontSize: "var(--text-2xs)", letterSpacing: "0.1em", textTransform: "uppercase", display: "block", marginBottom: 20 }}>
            <span className="km-sans" style={{ textTransform: "none", letterSpacing: 0 }}>ប្រភេទ</span> · Variant performance
          </span>
          <div className="col gap-18">
            {variantPerf.map(v => (
              <div key={v.id} className="col gap-8">
                <div className="row justify-between items-end">
                  <div className="col gap-1">
                    <span className="km-sans" style={{ fontSize: "var(--text-xs)" }}>{v.labelKh}</span>
                    <span className="mono text-muted" style={{ fontSize: "var(--text-2xs)" }}>{v.label} · {v.qty} units</span>
                  </div>
                  <span className="serif" style={{ fontSize: "var(--text-xl)" }}>${v.rev.toFixed(2)}</span>
                </div>
                <div style={{ height: 6, background: "var(--bg-3)", borderRadius: 99, overflow: "hidden" }}>
                  <div style={{ height: "100%", borderRadius: 99, background: "var(--accent)", transition: "width 500ms ease",
                    width: `${(v.rev / maxRev) * 100}%` }} />
                </div>
              </div>
            ))}
          </div>
        </div>

      </div>

      {/* ── Discount summary ── */}
      {totalDiscount > 0 && (
        <div style={{ border: "1px solid var(--line)", borderRadius: 12, padding: "16px 24px", background: "var(--bg-2)" }}>
          <div className="row justify-between items-center">
            <span className="mono text-muted" style={{ fontSize: "var(--text-xs)" }}>
              <span className="km-sans" style={{ letterSpacing: 0 }}>បញ្ចុះតម្លៃសរុប</span> · Total discounts given
            </span>
            <span className="serif" style={{ fontSize: "var(--text-2xl)", color: "var(--primary)" }}>−${totalDiscount.toFixed(2)}</span>
          </div>
        </div>
      )}

    </div>
  );
}

const STATUS_NEXT   = { pending: "confirmed", pending_payment: "confirmed", confirmed: "shipped", shipped: "delivered" };
const STATUS_LABEL  = { pending: "Pending", pending_payment: "Awaiting Payment", confirmed: "Confirmed", shipped: "Shipped", delivered: "Delivered" };
const STATUS_KH     = { pending: "រង់ចាំ", pending_payment: "រង់ចាំABA", confirmed: "បញ្ជាក់", shipped: "កំពុងដឹក", delivered: "បានដឹក" };
const STATUS_COLOR  = { pending: "var(--accent)", pending_payment: "#f59e0b", confirmed: "#2563eb", shipped: "#7c3aed", delivered: "var(--primary)" };
const STATUS_ACTION = { pending: "Confirm order", pending_payment: "Confirm manually", confirmed: "Mark shipped", shipped: "Mark delivered" };

// ── Shared field ────────────────────────────────────────────────────────────
function AField({ label, value, onChange, type = "text", placeholder, mono }) {
  return (
    <div className="col gap-4">
      <label style={{
        fontSize: "var(--text-2xs)", fontFamily: "var(--font-mono)",
        letterSpacing: "0.08em", textTransform: "uppercase", color: "var(--fg-muted)"
      }}>{label}</label>
      <input
        type={type}
        value={value}
        onChange={onChange}
        placeholder={placeholder}
        style={{
          padding: "8px 12px", width: "100%", boxSizing: "border-box",
          background: "var(--bg)", border: "1px solid var(--line-strong)",
          borderRadius: 6, font: "inherit", outline: "none",
          fontSize: "var(--text-sm)", color: "var(--fg)",
          fontFamily: mono ? "var(--font-mono)" : "inherit",
        }}
      />
    </div>
  );
}

// ── Promos section ──────────────────────────────────────────────────────────
function PromosSection() {
  const [promos,    setPromos]    = useState([]);
  const [loading,   setLoading]   = useState(true);
  const [newForm,   setNewForm]   = useState({ code: "", type: "percent", value: "", minOrder: "0" });
  const [creating,  setCreating]  = useState(false);
  const [createErr, setCreateErr] = useState("");
  const [actioning, setActioning] = useState(null);

  useEffect(() => {
    const unsub = kDb.collection("promos").onSnapshot(
      snap => {
        const list = snap.docs.map(d => ({ id: d.id, ...d.data() }));
        list.sort((a, b) => a.code > b.code ? 1 : -1);
        setPromos(list);
        setLoading(false);
      },
      () => setLoading(false)
    );
    return unsub;
  }, []);

  const setNF = k => e => setNewForm(f => ({ ...f, [k]: e.target.value }));

  const createPromo = async () => {
    const code = newForm.code.trim().toUpperCase();
    if (!code)       { setCreateErr("Code is required.");  return; }
    if (!newForm.value || isNaN(newForm.value)) { setCreateErr("Value is required."); return; }
    setCreating(true); setCreateErr("");
    try {
      await kDb.collection("promos").doc(code).set({
        code,
        type:     newForm.type,
        value:    parseFloat(newForm.value),
        minOrder: parseFloat(newForm.minOrder) || 0,
        active:   true,
        uses:     0,
      });
      setNewForm({ code: "", type: "percent", value: "", minOrder: "0" });
    } catch { setCreateErr("Could not create. Try again."); }
    finally  { setCreating(false); }
  };

  const toggle = async (p) => {
    setActioning(p.id);
    await kDb.collection("promos").doc(p.id).update({ active: !p.active }).catch(() => {});
    setActioning(null);
  };

  const del = async (p) => {
    if (!window.confirm(`Delete promo code "${p.code}"?`)) return;
    setActioning(p.id);
    await kDb.collection("promos").doc(p.id).delete().catch(() => {});
    setActioning(null);
  };

  const sectionHead = (kh, en) => (
    <div style={{ borderBottom: "1px solid var(--line-strong)", paddingBottom: 10, marginBottom: 16 }}>
      <span className="mono text-muted" style={{ fontSize: "var(--text-2xs)", letterSpacing: "0.1em", textTransform: "uppercase" }}>
        <span className="km-sans" style={{ textTransform: "none", letterSpacing: 0 }}>{kh}</span> · {en}
      </span>
    </div>
  );

  return (
    <div className="col gap-32" style={{ paddingTop: 32 }}>

      {/* ── Create ── */}
      <div>
        {sectionHead("បង្កើតកូដថ្មី", "Create promo code")}
        <div style={{ display: "grid", gridTemplateColumns: "1fr auto auto 1fr", gap: 12, alignItems: "end" }}>
          <AField label="Code"      value={newForm.code}     onChange={e => setNewForm(f => ({ ...f, code: e.target.value.toUpperCase() }))} placeholder="SAVE10" mono />
          <div className="col gap-4">
            <label style={{ fontSize: "var(--text-2xs)", fontFamily: "var(--font-mono)", letterSpacing: "0.08em", textTransform: "uppercase", color: "var(--fg-muted)" }}>Type</label>
            <div className="seg">
              <button type="button" className={newForm.type === "percent" ? "is-on" : ""} onClick={() => setNewForm(f => ({ ...f, type: "percent" }))}>% Off</button>
              <button type="button" className={newForm.type === "flat"    ? "is-on" : ""} onClick={() => setNewForm(f => ({ ...f, type: "flat"    }))}>$ Off</button>
            </div>
          </div>
          <AField label={newForm.type === "percent" ? "Value (%)" : "Value ($)"} value={newForm.value}    onChange={setNF("value")}    placeholder={newForm.type === "percent" ? "10" : "5"} type="number" mono />
          <AField label="Min order ($)" value={newForm.minOrder} onChange={setNF("minOrder")} placeholder="0" type="number" mono />
        </div>
        {createErr && <div style={{ marginTop: 8, fontSize: "var(--text-xs)", color: "var(--accent)", fontFamily: "var(--font-mono)" }}>{createErr}</div>}
        <div style={{ marginTop: 14 }}>
          <button type="button" className="btn btn-primary" onClick={createPromo} disabled={creating}>
            {creating ? "…" : <><span className="km-sans">បង្កើត</span> · Create promo <Icon name="arrow-right" size={14} /></>}
          </button>
        </div>
      </div>

      {/* ── List ── */}
      <div>
        {sectionHead("កូដបញ្ចុះតម្លៃ", "Existing promo codes")}
        {loading && <span className="mono text-muted" style={{ fontSize: "var(--text-xs)" }}>Loading…</span>}
        {!loading && promos.length === 0 && (
          <span className="mono text-muted" style={{ fontSize: "var(--text-xs)" }}>No promo codes yet.</span>
        )}
        {!loading && promos.length > 0 && (
          <div className="admin-table-scroll"><div className="admin-table-inner" style={{ minWidth: 580 }}>
          <>
            <div style={{ display: "grid", gridTemplateColumns: "120px 80px 80px 100px 60px 80px 1fr", gap: 12, padding: "8px 0", borderBottom: "1px solid var(--line-strong)" }}>
              {["CODE","TYPE","VALUE","MIN ORDER","USES","STATUS",""].map(h => (
                <span key={h} className="mono text-muted" style={{ fontSize: "var(--text-2xs)", letterSpacing: "0.1em" }}>{h}</span>
              ))}
            </div>
            {promos.map(p => (
              <div key={p.id} style={{ display: "grid", gridTemplateColumns: "120px 80px 80px 100px 60px 80px 1fr", gap: 12, padding: "14px 0", borderBottom: "1px solid var(--line)", alignItems: "center" }}>
                <span className="mono" style={{ fontSize: "var(--text-xs)", letterSpacing: "0.08em", fontWeight: 600 }}>{p.code}</span>
                <span className="mono text-muted" style={{ fontSize: "var(--text-2xs)" }}>{p.type === "percent" ? "%" : "$"} off</span>
                <span className="mono" style={{ fontSize: "var(--text-xs)" }}>{p.type === "percent" ? `${p.value}%` : `$${p.value}`}</span>
                <span className="mono text-muted" style={{ fontSize: "var(--text-2xs)" }}>${p.minOrder || 0} min</span>
                <span className="mono" style={{ fontSize: "var(--text-xs)" }}>{p.uses || 0}</span>
                <span style={{
                  display: "inline-flex", alignItems: "center", gap: 4,
                  padding: "2px 8px", borderRadius: 999, alignSelf: "start",
                  border: "1px solid " + (p.active ? "var(--primary)" : "var(--line-strong)"),
                  color: p.active ? "var(--primary)" : "var(--fg-muted)",
                  fontFamily: "var(--font-mono)", fontSize: "var(--text-2xs)"
                }}>
                  {p.active ? "Active" : "Paused"}
                </span>
                <div className="row gap-8">
                  <button type="button" className="btn" style={{ fontSize: "var(--text-2xs)", padding: "4px 10px" }}
                    onClick={() => toggle(p)} disabled={actioning === p.id}>
                    {p.active ? "Pause" : "Activate"}
                  </button>
                  <button type="button" className="btn" style={{ fontSize: "var(--text-2xs)", padding: "4px 10px", color: "var(--accent)", borderColor: "var(--accent)" }}
                    onClick={() => del(p)} disabled={actioning === p.id}>
                    Delete
                  </button>
                </div>
              </div>
            ))}
          </>
          </div></div>
        )}
      </div>

    </div>
  );
}

// ── Products section ────────────────────────────────────────────────────────
function ProductsSection() {
  const fileInputRef = React.useRef(null);
  const [images,         setImages]         = useState(() => PRODUCT.images || []);
  const [uploading,      setUploading]      = useState(false);
  const [uploadProgress, setUploadProgress] = useState(0);
  const [form, setForm] = useState(() => ({
    nameKh:    PRODUCT.nameKh    || "",
    name:      PRODUCT.name      || "",
    taglineKh: PRODUCT.taglineKh || "",
    tagline:   PRODUCT.tagline   || "",
    sizes: PRODUCT.sizes.map(s => ({
      id:          s.id,
      labelKh:     s.labelKh  || "",
      label:       s.label    || "",
      descKh:      s.descKh   || "",
      desc:        s.desc     || "",
      priceUsd:    String(s.priceUsd || ""),
      popular:     !!s.popular,
      save:        s.save     || "",
      buyingPrice: "",
      profitType:  "pct",
      profitValue: "",
    })),
  }));

  const [storeForm, setStoreForm] = useState(() => {
    const cfg = window.STORE_CONFIG || {};
    return {
      shippingFreeThreshold: String(cfg.shippingFreeThreshold ?? 75),
      shippingRate:          String(cfg.shippingRate          ?? 9),
    };
  });

  const [saving,     setSaving]     = useState(false);
  const [saved,      setSaved]      = useState(false);
  const [err,        setErr]        = useState("");
  const [invForm,    setInvForm]    = useState(() => {
    const inv = window.INVENTORY || {};
    return Object.fromEntries(PRODUCT.sizes.map(s => [s.id, inv[s.id] != null ? String(inv[s.id]) : ""]));
  });
  const [invSaving,  setInvSaving]  = useState(false);
  const [invSaved,   setInvSaved]   = useState(false);

  const saveImageList = async (newImages) => {
    await kDb.collection("config").doc("product").set({ images: newImages }, { merge: true });
    PRODUCT.images = newImages;
    if (newImages.length) {
      window.PRODUCT_SHOTS = newImages.map((src, i) => ({ src, c: `PRODUCT · IMAGE ${i + 1}` }));
    }
  };

  const handleUpload = async (e) => {
    const files = Array.from(e.target.files);
    if (!files.length) return;
    setUploading(true); setUploadProgress(0);
    try {
      const urls = [];
      for (let i = 0; i < files.length; i++) {
        const f = files[i];
        const ref = kStorage.ref(`product-images/${Date.now()}-${f.name.replace(/[^a-zA-Z0-9._-]/g, "_")}`);
        await ref.put(f);
        const url = await ref.getDownloadURL();
        urls.push(url);
        setUploadProgress(Math.round(((i + 1) / files.length) * 100));
      }
      const next = [...images, ...urls];
      setImages(next);
      await saveImageList(next);
    } catch (err) { console.error("Upload failed", err); }
    finally { setUploading(false); setUploadProgress(0); e.target.value = ""; }
  };

  const deleteImage = async (url) => {
    const next = images.filter(u => u !== url);
    setImages(next);
    await saveImageList(next);
    try { await kStorage.refFromURL(url).delete(); } catch {} // fire-and-forget
  };

  const moveImage = async (i, dir) => {
    const next = [...images];
    const j = i + dir;
    if (j < 0 || j >= next.length) return;
    [next[i], next[j]] = [next[j], next[i]];
    setImages(next);
    await saveImageList(next);
  };

  const setF = (key) => (e) => setForm(f => ({ ...f, [key]: e.target.value }));
  const setSize = (idx, key) => (e) => setForm(f => {
    const sizes = [...f.sizes];
    sizes[idx] = { ...sizes[idx], [key]: e.target.value };
    return { ...f, sizes };
  });
  const setSizeCheck = (idx, key) => (e) => setForm(f => {
    const sizes = [...f.sizes];
    sizes[idx] = { ...sizes[idx], [key]: e.target.checked };
    return { ...f, sizes };
  });

  const setProfit = (idx, key, val) => setForm(f => {
    const sizes = [...f.sizes];
    const s = { ...sizes[idx], [key]: val };
    const cost = parseFloat(s.buyingPrice);
    const pv   = parseFloat(s.profitValue);
    if (!isNaN(cost) && cost > 0 && !isNaN(pv) && pv >= 0) {
      const price = s.profitType === "pct" ? cost * (1 + pv / 100) : cost + pv;
      s.priceUsd = price.toFixed(2);
    }
    sizes[idx] = s;
    return { ...f, sizes };
  });

  const saveInventory = async () => {
    setInvSaving(true);
    try {
      const data = {};
      PRODUCT.sizes.forEach(s => {
        const v = parseInt(invForm[s.id], 10);
        data[s.id] = isNaN(v) ? 999 : Math.max(0, v);
      });
      await kDb.collection("config").doc("inventory").set(data);
      Object.assign(window.INVENTORY, data);
      setInvSaved(true);
      setTimeout(() => setInvSaved(false), 3000);
    } catch { /* silent */ }
    finally { setInvSaving(false); }
  };

  const handleSave = async () => {
    setSaving(true); setErr("");
    try {
      const productData = {
        ...form,
        sizes: form.sizes.map(s => ({ ...s, priceUsd: parseFloat(s.priceUsd) || 0 })),
      };
      const storeData = {
        shippingFreeThreshold: parseFloat(storeForm.shippingFreeThreshold) || 75,
        shippingRate:          parseFloat(storeForm.shippingRate)          || 9,
      };
      await Promise.all([
        kDb.collection("config").doc("product").set(productData),
        kDb.collection("config").doc("store").set(storeData),
      ]);
      applyProductConfig(productData);
      Object.assign(window.STORE_CONFIG, storeData);
      setSaved(true);
      setTimeout(() => setSaved(false), 3000);
    } catch (e) {
      setErr("Save failed — please try again.");
    } finally {
      setSaving(false);
    }
  };

  const sectionHead = (kh, en) => (
    <div style={{ borderBottom: "1px solid var(--line-strong)", paddingBottom: 10, marginBottom: 16 }}>
      <span className="mono text-muted" style={{ fontSize: "var(--text-2xs)", letterSpacing: "0.1em", textTransform: "uppercase" }}>
        <span className="km-sans" style={{ textTransform: "none", letterSpacing: 0 }}>{kh}</span> · {en}
      </span>
    </div>
  );

  return (
    <div className="col gap-40" style={{ paddingTop: 32 }}>

      {/* ── Product name + tagline ── */}
      <div>
        {sectionHead("ផលិតផល", "Product")}
        <div style={{ display: "grid", gridTemplateColumns: "1fr 1fr", gap: 16 }}>
          <AField label="ឈ្មោះ · Name (KH)"        value={form.nameKh}    onChange={setF("nameKh")} />
          <AField label="Name (EN)"                   value={form.name}      onChange={setF("name")} />
          <AField label="ពាក្យស្លោក · Tagline (KH)" value={form.taglineKh} onChange={setF("taglineKh")} />
          <AField label="Tagline (EN)"                value={form.tagline}   onChange={setF("tagline")} />
        </div>
      </div>

      {/* ── Sizes ── */}
      <div>
        {sectionHead("ប្រភេទ", "Variants")}
        <div className="col gap-24">
          {form.sizes.map((s, idx) => (
            <div key={s.id} style={{
              border: "1px solid var(--line)", borderRadius: 10,
              padding: "20px 20px 16px", background: "var(--bg-2)"
            }}>
              <div style={{ marginBottom: 14 }}>
                <span className="mono" style={{ fontSize: "var(--text-2xs)", letterSpacing: "0.08em", textTransform: "uppercase", color: "var(--fg-muted)" }}>
                  VARIANT {idx + 1} · {s.id}
                </span>
              </div>
              <div style={{ display: "grid", gridTemplateColumns: "1fr 1fr", gap: 12 }}>
                <AField label="Label (KH)"      value={s.labelKh}  onChange={setSize(idx, "labelKh")} />
                <AField label="Label (EN)"      value={s.label}    onChange={setSize(idx, "label")} />
                <AField label="Desc (KH)"       value={s.descKh}   onChange={setSize(idx, "descKh")} />
                <AField label="Desc (EN)"       value={s.desc}     onChange={setSize(idx, "desc")} />
                <AField label="Price (USD) $"   value={s.priceUsd} onChange={setSize(idx, "priceUsd")} type="number" placeholder="0.00" mono />
                <AField label='Save badge (e.g. "Save $4")' value={s.save} onChange={setSize(idx, "save")} placeholder="Save $4" />
              </div>

              {/* ── Profit calculator ── */}
              <div style={{ marginTop: 14, paddingTop: 14, borderTop: "1px dashed var(--line)" }}>
                <div style={{ fontSize: "var(--text-2xs)", fontFamily: "var(--font-mono)", letterSpacing: "0.08em", textTransform: "uppercase", color: "var(--fg-muted)", marginBottom: 10 }}>
                   គណនាតម្លៃ · Price calculator
                </div>
                <div style={{ display: "grid", gridTemplateColumns: "1fr auto 1fr", gap: 10, alignItems: "end" }}>
                  <AField
                    label="Buying price ($)"
                    value={s.buyingPrice}
                    onChange={e => setProfit(idx, "buyingPrice", e.target.value)}
                    type="number" placeholder="0.00" mono
                  />
                  <div className="col gap-4">
                    <label style={{ fontSize: "var(--text-2xs)", fontFamily: "var(--font-mono)", letterSpacing: "0.08em", textTransform: "uppercase", color: "var(--fg-muted)" }}>Type</label>
                    <div className="seg">
                      <button type="button" className={s.profitType === "pct" ? "is-on" : ""} onClick={() => setProfit(idx, "profitType", "pct")}>% Off</button>
                      <button type="button" className={s.profitType === "amt" ? "is-on" : ""} onClick={() => setProfit(idx, "profitType", "amt")}>$ Off</button>
                    </div>
                  </div>
                  <AField
                    label={s.profitType === "pct" ? "Profit (%)" : "Profit ($)"}
                    value={s.profitValue}
                    onChange={e => setProfit(idx, "profitValue", e.target.value)}
                    type="number" placeholder={s.profitType === "pct" ? "30" : "5"} mono
                  />
                </div>
                {s.buyingPrice && s.profitValue && (
                  <div style={{ marginTop: 8, fontSize: "var(--text-xs)", color: "var(--fg-muted)" }}>
                    <span className="mono" style={{ color: "var(--accent)" }}>${s.priceUsd}</span>
                    {" "}= ${parseFloat(s.buyingPrice || 0).toFixed(2)} cost +{" "}
                    {s.profitType === "pct"
                      ? `${s.profitValue}% profit`
                      : `$${parseFloat(s.profitValue || 0).toFixed(2)} profit`}
                  </div>
                )}
              </div>

              <label style={{
                display: "inline-flex", alignItems: "center", gap: 8, marginTop: 12,
                cursor: "pointer", fontSize: "var(--text-xs)", color: "var(--fg-muted)"
              }}>
                <input
                  type="checkbox"
                  checked={s.popular}
                  onChange={setSizeCheck(idx, "popular")}
                  style={{ width: 14, height: 14, accentColor: "var(--accent)" }}
                />
                <span className="mono" style={{ fontSize: "var(--text-2xs)", letterSpacing: "0.06em", textTransform: "uppercase" }}>
                  Mark as popular
                </span>
              </label>
            </div>
          ))}
        </div>
      </div>

      {/* ── Shipping ── */}
      <div>
        {sectionHead("ការដឹកជញ្ជូន", "Shipping")}
        <div style={{ display: "grid", gridTemplateColumns: "1fr 1fr", gap: 16 }}>
          <AField
            label="Free shipping on orders over ($)"
            value={storeForm.shippingFreeThreshold}
            onChange={e => setStoreForm(f => ({ ...f, shippingFreeThreshold: e.target.value }))}
            type="number" placeholder="75" mono
          />
          <AField
            label="Flat shipping rate ($)"
            value={storeForm.shippingRate}
            onChange={e => setStoreForm(f => ({ ...f, shippingRate: e.target.value }))}
            type="number" placeholder="9" mono
          />
        </div>
      </div>

      {/* ── Inventory ── */}
      <div>
        {sectionHead("ស្តុក", "Inventory")}
        <div style={{ display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(200px, 1fr))", gap: 16, marginBottom: 16 }}>
          {PRODUCT.sizes.map(s => {
            const stock = invForm[s.id] === "" ? null : parseInt(invForm[s.id], 10);
            const oos   = stock === 0;
            const low   = stock !== null && stock > 0 && stock <= 10;
            return (
              <div key={s.id} style={{ border: "1px solid var(--line)", borderRadius: 10, padding: "16px 20px", background: "var(--bg-2)" }}>
                <div className="col gap-10">
                  <div className="row justify-between items-center">
                    <span style={{ fontSize: "var(--text-sm)", fontWeight: 500 }}>{s.label}</span>
                    {oos && <span className="chip mono" style={{ fontSize: "var(--text-2xs)", padding: "2px 7px", color: "var(--accent)", borderColor: "var(--accent)" }}>OUT OF STOCK</span>}
                    {low && <span className="chip mono" style={{ fontSize: "var(--text-2xs)", padding: "2px 7px", color: "#d97706", borderColor: "#d97706" }}>LOW</span>}
                  </div>
                  <AField
                    label="Stock (units)"
                    value={invForm[s.id]}
                    onChange={e => setInvForm(f => ({ ...f, [s.id]: e.target.value }))}
                    type="number"
                    placeholder="999 = unlimited"
                    mono
                  />
                </div>
              </div>
            );
          })}
        </div>
        <div className="row gap-12 items-center">
          <button type="button" className="btn" onClick={saveInventory} disabled={invSaving}>
            {invSaving ? "…" : <><span className="km-sans">រក្សាស្តុក</span> · Save inventory</>}
          </button>
          {invSaved && <span style={{ fontSize: "var(--text-xs)", color: "var(--primary)", fontFamily: "var(--font-mono)" }}>Saved ✓</span>}
        </div>
      </div>

      {/* ── Images ── */}
      <div>
        {sectionHead("រូបភាពផលិតផល", "Product images")}
        <input ref={fileInputRef} type="file" accept="image/*" multiple style={{ display: "none" }} onChange={handleUpload} />

        {images.length > 0 ? (
          <div style={{ display: "grid", gridTemplateColumns: "repeat(auto-fill, minmax(140px, 1fr))", gap: 12, marginBottom: 16 }}>
            {images.map((url, i) => (
              <div key={url} style={{ position: "relative", borderRadius: 8, overflow: "hidden", border: "1px solid var(--line)", background: "#f5f1ea" }}>
                <img src={url} alt={`Product ${i + 1}`} style={{ width: "100%", aspectRatio: "1/1", objectFit: "cover", display: "block" }} />
                <div style={{ position: "absolute", top: 6, right: 6, display: "flex", flexDirection: "column", gap: 4 }}>
                  {i > 0 && (
                    <button type="button" onClick={() => moveImage(i, -1)} title="Move left" style={{
                      width: 22, height: 22, borderRadius: 4, border: 0,
                      background: "rgba(0,0,0,0.55)", color: "#fff", cursor: "pointer", fontSize: 11,
                      display: "flex", alignItems: "center", justifyContent: "center"
                    }}>←</button>
                  )}
                  <button type="button" onClick={() => deleteImage(url)} title="Delete" style={{
                    width: 22, height: 22, borderRadius: 4, border: 0,
                    background: "rgba(180,0,0,0.7)", color: "#fff", cursor: "pointer", fontSize: 14, fontWeight: 600,
                    display: "flex", alignItems: "center", justifyContent: "center"
                  }}>×</button>
                </div>
                {i === 0 && (
                  <div style={{ position: "absolute", bottom: 0, left: 0, right: 0, background: "rgba(0,0,0,0.5)", padding: "3px 0", textAlign: "center" }}>
                    <span style={{ color: "#fff", fontSize: 8, fontFamily: "var(--font-mono)", letterSpacing: "0.12em" }}>HERO</span>
                  </div>
                )}
              </div>
            ))}
          </div>
        ) : (
          <div style={{ marginBottom: 16, padding: "14px 0" }}>
            <span className="mono text-muted" style={{ fontSize: "var(--text-xs)" }}>
              No uploaded images. Using default local photos.
            </span>
          </div>
        )}

        <div className="row gap-12 items-center flex-wrap">
          <button type="button" className="btn" onClick={() => fileInputRef.current?.click()} disabled={uploading}>
            {uploading
              ? `Uploading… ${uploadProgress}%`
              : <><span className="km-sans">បន្ថែមរូបភាព</span> · Upload images</>
            }
          </button>
          {uploading && (
            <div style={{ flex: 1, height: 4, background: "var(--bg-3)", borderRadius: 99, overflow: "hidden", minWidth: 80 }}>
              <div style={{ height: "100%", background: "var(--accent)", width: `${uploadProgress}%`, transition: "width 200ms" }} />
            </div>
          )}
          <span className="mono text-muted" style={{ fontSize: "var(--text-2xs)" }}>
            JPG · PNG · WEBP · First image = hero
          </span>
        </div>
      </div>

      {/* ── Save ── */}
      <div className="col gap-10" style={{ borderTop: "1px solid var(--line)", paddingTop: 24 }}>
        {err && (
          <div style={{
            padding: "10px 14px", borderRadius: 6,
            background: "color-mix(in oklab, var(--accent) 10%, transparent)",
            border: "1px solid var(--accent)"
          }}>
            <span className="mono" style={{ fontSize: "var(--text-xs)", color: "var(--accent)" }}>{err}</span>
          </div>
        )}
        {saved && (
          <div style={{
            padding: "10px 14px", borderRadius: 6,
            background: "color-mix(in oklab, var(--primary) 10%, transparent)",
            border: "1px solid var(--primary)"
          }}>
            <span className="mono" style={{ fontSize: "var(--text-xs)", color: "var(--primary)" }}>
              <span className="km-sans" style={{ letterSpacing: 0 }}>រក្សាទុករួចរាល់</span> · Saved successfully.
            </span>
          </div>
        )}
        <div>
          <button
            type="button"
            className="btn btn-primary"
            onClick={handleSave}
            disabled={saving}
            style={{ minWidth: 180 }}
          >
            {saving
              ? <span className="km-sans">កំពុងរក្សាទុក…</span>
              : <><span className="km-sans">រក្សាទុក</span> · Save changes <Icon name="arrow-right" size={14} /></>
            }
          </button>
        </div>
      </div>

    </div>
  );
}

// ── Notifications section ───────────────────────────────────────────────────
const WEBHOOK_URL = "https://telegramwebhook-qsn4ilcqva-uc.a.run.app";

function NotificationsSection() {
  const [form,    setForm]    = useState({ telegramBotToken: "", telegramChatId: "" });
  const [loading, setLoading] = useState(true);
  const [saving,  setSaving]  = useState(false);
  const [saved,   setSaved]   = useState(false);
  const [testing, setTesting] = useState(false);
  const [testMsg, setTestMsg] = useState("");
  const [hooking, setHooking] = useState(false);
  const [hookMsg, setHookMsg] = useState("");

  useEffect(() => {
    kDb.collection("config").doc("notifications").get()
      .then(doc => {
        if (doc.exists) {
          const d = doc.data();
          setForm({ telegramBotToken: d.telegramBotToken || "", telegramChatId: String(d.telegramChatId || "") });
        }
        setLoading(false);
      })
      .catch(() => setLoading(false));
  }, []);

  const setF = k => e => setForm(f => ({ ...f, [k]: e.target.value }));

  const save = async () => {
    setSaving(true); setSaved(false);
    try {
      await kDb.collection("config").doc("notifications").set({
        telegramBotToken: form.telegramBotToken.trim(),
        telegramChatId:   form.telegramChatId.trim(),
      });
      setSaved(true);
      setTimeout(() => setSaved(false), 3000);
    } catch {}
    finally { setSaving(false); }
  };

  const test = async () => {
    setTesting(true); setTestMsg("");
    const chatIds = form.telegramChatId.split(",").map(s => s.trim()).filter(Boolean);
    try {
      const results = await Promise.all(chatIds.map(id =>
        fetch(`https://api.telegram.org/bot${form.telegramBotToken.trim()}/sendMessage`, {
          method: "POST",
          headers: { "Content-Type": "application/json" },
          body: JSON.stringify({ chat_id: id, text: "✅ Kshop test — Telegram notifications are connected!" }),
        }).then(r => r.json())
      ));
      const failed = results.filter(d => !d.ok);
      setTestMsg(failed.length === 0 ? "success" : `Error on some IDs: ${failed.map(d => d.description).join(", ")}`);
    } catch (e) {
      setTestMsg("Failed to connect: " + e.message);
    } finally { setTesting(false); }
  };

  const registerWebhook = async () => {
    setHooking(true); setHookMsg("");
    try {
      const r = await fetch(
        `https://api.telegram.org/bot${form.telegramBotToken.trim()}/setWebhook`,
        { method: "POST", headers: { "Content-Type": "application/json" },
          body: JSON.stringify({ url: WEBHOOK_URL }) }
      );
      const d = await r.json();
      setHookMsg(d.ok ? "success" : `Error: ${d.description}`);
    } catch (e) {
      setHookMsg("Failed: " + e.message);
    } finally { setHooking(false); }
  };

  if (loading) return <div style={{ padding: "40px 0" }}><span className="mono text-muted" style={{ fontSize: "var(--text-xs)" }}>Loading…</span></div>;

  return (
    <div className="col gap-32" style={{ paddingTop: 32 }}>
      <div className="col gap-20">
        <div style={{
          padding: "14px 16px", borderRadius: 8,
          background: "color-mix(in oklab, #2196F3 8%, var(--bg-2))",
          border: "1px solid color-mix(in oklab, #2196F3 25%, transparent)"
        }}>
          <div className="col gap-6">
            <span className="mono" style={{ fontSize: "var(--text-2xs)", letterSpacing: "0.1em", textTransform: "uppercase", color: "#1565C0" }}>SETUP GUIDE</span>
            <span style={{ fontSize: "var(--text-xs)", lineHeight: 1.7, color: "var(--fg-muted)" }}>
              1. Message <strong style={{ color: "var(--fg)" }}>@BotFather</strong> on Telegram → /newbot → copy the token.<br/>
              2. Add your bot to a group, or get your personal chat ID via <strong style={{ color: "var(--fg)" }}>@userinfobot</strong>.<br/>
              3. Paste both below → Save → Test.
            </span>
          </div>
        </div>

        <div className="col gap-12">
          <AField label="Bot Token" value={form.telegramBotToken} onChange={setF("telegramBotToken")} placeholder="123456789:AABBcc…" mono />
          <AField label="Chat IDs (comma-separated for multiple)" value={form.telegramChatId} onChange={setF("telegramChatId")} placeholder="6850751816, -1001234567890" mono />
        </div>

        {testMsg && (
          <div style={{
            padding: "10px 14px", borderRadius: 6,
            background: testMsg === "success" ? "color-mix(in oklab, var(--primary) 10%, transparent)" : "color-mix(in oklab, var(--accent) 10%, transparent)",
            border: "1px solid " + (testMsg === "success" ? "var(--primary)" : "var(--accent)")
          }}>
            <span className="mono" style={{ fontSize: "var(--text-xs)", color: testMsg === "success" ? "var(--primary)" : "var(--accent)" }}>
              {testMsg === "success" ? "✓ Test message sent! Check your Telegram." : testMsg}
            </span>
          </div>
        )}

        <div className="row gap-12 items-center flex-wrap">
          <button type="button" className="btn btn-primary" onClick={save} disabled={saving}>
            {saving ? "…" : <><span className="km-sans">រក្សាទុក</span> · Save settings</>}
          </button>
          <button type="button" className="btn" onClick={test} disabled={testing || !form.telegramBotToken.trim() || !form.telegramChatId.trim()}>
            {testing ? "Sending…" : "Send test message"}
          </button>
          <button type="button" className="btn" onClick={registerWebhook} disabled={hooking || !form.telegramBotToken.trim()}>
            {hooking ? "Registering…" : "Register webhook"}
          </button>
          {saved   && <span style={{ fontSize: "var(--text-xs)", color: "var(--primary)", fontFamily: "var(--font-mono)" }}>Saved ✓</span>}
          {hookMsg && (
            <span style={{ fontSize: "var(--text-xs)", fontFamily: "var(--font-mono)",
              color: hookMsg === "success" ? "var(--primary)" : "var(--accent)" }}>
              {hookMsg === "success" ? "Webhook registered ✓" : hookMsg}
            </span>
          )}
        </div>
      </div>
    </div>
  );
}

// ── Bakong section ──────────────────────────────────────────────────────────
function BakongSection() {
  const [bkForm,   setBkForm]   = useState({ accountId: "", token: "", merchantName: "KSHOP", currency: "USD" });
  const [loading,  setLoading]  = useState(true);
  const [bkSaving, setBkSaving] = useState(false);
  const [bkSaved,  setBkSaved]  = useState(false);

  useEffect(() => {
    kDb.collection("config").doc("bakong").get()
      .then(doc => {
        if (doc.exists) {
          const d = doc.data();
          setBkForm({ accountId: d.accountId || "", token: d.token || "", merchantName: d.merchantName || "KSHOP", currency: d.currency || "USD" });
        }
        setLoading(false);
      })
      .catch(() => setLoading(false));
  }, []);

  const setBk = k => e => setBkForm(f => ({ ...f, [k]: e.target.value }));

  const saveBakong = async () => {
    setBkSaving(true); setBkSaved(false);
    try {
      await kDb.collection("config").doc("bakong").set({
        accountId:    bkForm.accountId.trim(),
        token:        bkForm.token.trim(),
        merchantName: bkForm.merchantName.trim() || "KSHOP",
        currency:     bkForm.currency,
      });
      setBkSaved(true);
      setTimeout(() => setBkSaved(false), 3000);
    } catch {}
    finally { setBkSaving(false); }
  };

  if (loading) return <div style={{ padding: "40px 0" }}><span className="mono text-muted" style={{ fontSize: "var(--text-xs)" }}>Loading…</span></div>;

  return (
    <div className="col gap-20" style={{ paddingTop: 32 }}>
      <div style={{
        padding: "14px 16px", borderRadius: 8,
        background: "color-mix(in oklab, #e05b2e 8%, var(--bg-2))",
        border: "1px solid color-mix(in oklab, #e05b2e 25%, transparent)"
      }}>
        <span style={{ fontSize: "var(--text-xs)", lineHeight: 1.7, color: "var(--fg-muted)" }}>
          Get your <strong style={{ color: "var(--fg)" }}>Account ID</strong> from the Bakong Business app (format: <code style={{ fontFamily: "monospace" }}>username@bankcode</code>) and your <strong style={{ color: "var(--fg)" }}>API Token</strong> from the Bakong Open API portal.
        </span>
      </div>

      <div className="col gap-12">
        <AField label="Account ID" value={bkForm.accountId} onChange={setBk("accountId")} placeholder="sunhuot_khean@bkrt" mono />
        <AField label="API Token (Bearer)" value={bkForm.token} onChange={setBk("token")} placeholder="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9…" mono />
        <AField label="Merchant Name (max 25 chars)" value={bkForm.merchantName} onChange={setBk("merchantName")} placeholder="KSHOP" mono />
        <div className="col gap-6">
          <span className="mono text-muted" style={{ fontSize: "var(--text-2xs)", letterSpacing: "0.08em", textTransform: "uppercase" }}>Currency</span>
          <div className="row gap-8">
            {["USD", "KHR"].map(c => (
              <button
                key={c}
                type="button"
                onClick={() => setBkForm(f => ({ ...f, currency: c }))}
                style={{
                  padding: "8px 20px", borderRadius: 6, cursor: "pointer", fontFamily: "var(--font-mono)",
                  fontSize: "var(--text-xs)", letterSpacing: "0.08em",
                  border: "1.5px solid " + (bkForm.currency === c ? "var(--accent)" : "var(--line-strong)"),
                  background: bkForm.currency === c ? "color-mix(in oklab, var(--accent) 10%, var(--bg))" : "var(--bg-2)",
                  color: "var(--fg)", transition: "all 120ms"
                }}
              >{c}</button>
            ))}
          </div>
        </div>
      </div>

      <div className="row gap-12 items-center">
        <button type="button" className="btn btn-primary" onClick={saveBakong} disabled={bkSaving}>
          {bkSaving ? "…" : <><span className="km-sans">រក្សាទុក</span> · Save Bakong config</>}
        </button>
        {bkSaved && <span style={{ fontSize: "var(--text-xs)", color: "var(--primary)", fontFamily: "var(--font-mono)" }}>Saved ✓</span>}
      </div>
    </div>
  );
}

// ── Admin panel ─────────────────────────────────────────────────────────────
function AdminPanel({ user, setRoute }) {
  const [isAdmin,  setIsAdmin]  = useState(null); // null=checking, true/false=resolved

  const [section,  setSection]  = useState("orders");
  const [orders,   setOrders]   = useState([]);
  const [loading,  setLoading]  = useState(true);
  const [filter,   setFilter]   = useState("all");
  const [updating, setUpdating] = useState(null);
  const [expanded, setExpanded] = useState(null);

  useEffect(() => {
    if (!user) { setIsAdmin(false); return; }
    kDb.collection("admins").doc(user.uid).get()
      .then(() => setIsAdmin(true))
      .catch(() => setIsAdmin(false));
  }, [user]);

  useEffect(() => {
    if (isAdmin !== true) { if (isAdmin === false) setLoading(false); return; }
    const unsub = kDb.collection("orders").onSnapshot(
      snap => {
        const list = snap.docs.map(d => ({ id: d.id, ...d.data() }));
        list.sort((a, b) => (b.createdAt?.toMillis?.() || 0) - (a.createdAt?.toMillis?.() || 0));
        setOrders(list);
        setLoading(false);
      },
      () => setLoading(false)
    );
    return unsub;
  }, [isAdmin]);

  const advanceStatus = async (order) => {
    const next = STATUS_NEXT[order.status];
    if (!next) return;
    setUpdating(order.id);
    try {
      await kDb.collection("orders").doc(order.id).update({ status: next });
    } finally {
      setUpdating(null);
    }
  };

  // ── Access denied ──────────────────────────────────────────────────────────
  if (!isAdmin) {
    return (
      <main style={{ padding: "80px 0", textAlign: "center" }}>
        <div className="col gap-16 items-center">
          <h1 className="display-lg km">គ្មានការអនុញ្ញាត</h1>
          <span className="serif text-muted" style={{ fontSize: "var(--text-2xl)" }}><em>Access denied.</em></span>
          <button type="button" className="btn" onClick={() => setRoute("home")}>
            <span className="km-sans">ទំព័រដើម</span> · Home
          </button>
        </div>
      </main>
    );
  }

  const filtered = filter === "all" ? orders : orders.filter(o => o.status === filter);
  const confirmed = orders.filter(o => o.status === "confirmed").length;
  const revenue  = orders.reduce((s, o) => s + (o.total || 0), 0);

  return (
    <main style={{ padding: "48px 0 96px" }}>
      <div className="wrap">

        {/* Header */}
        <div className="col gap-8" style={{ marginBottom: 32 }}>
          <span className="eyebrow">— <span className="km-sans">ផ្ទាំងគ្រប់គ្រង</span> · Admin</span>
          <h1 className="display-lg km">ការគ្រប់គ្រង។</h1>
          <span className="serif text-muted" style={{ fontSize: "var(--text-2xl)" }}><em>Management.</em></span>
        </div>

        {/* Section tabs */}
        <div className="row" style={{ borderBottom: "1px solid var(--line)", marginBottom: 0 }}>
          {[
            { id: "orders",    kh: "ការបញ្ជាទិញ", en: "Orders",    badge: confirmed > 0 ? confirmed : null },
            { id: "products",  kh: "ផលិតផល",       en: "Products",  badge: null },
            { id: "promos",    kh: "បញ្ចុះតម្លៃ",  en: "Promos",    badge: null },
            { id: "analytics",     kh: "វិភាគ",         en: "Analytics",      badge: null },
            { id: "notifications", kh: "ការជូនដំណឹង",  en: "Notifications",  badge: null },
            { id: "bakong",        kh: "បាគង KHQR",    en: "Bakong",         badge: null },
          ].map(({ id, kh, en, badge }) => (
            <button
              key={id}
              type="button"
              onClick={() => setSection(id)}
              style={{
                background: "transparent", border: 0, cursor: "pointer",
                padding: "10px 16px", font: "inherit",
                color: section === id ? "var(--fg)" : "var(--fg-muted)",
                borderBottom: "2px solid " + (section === id ? "var(--accent)" : "transparent"),
                marginBottom: -1, display: "flex", alignItems: "center", gap: 6
              }}
            >
              <span className="km-sans" style={{ fontSize: "var(--text-xs)" }}>{kh}</span>
              <span style={{ fontFamily: "var(--font-mono)", fontSize: "var(--text-2xs)", opacity: 0.55 }}>· {en}</span>
              {badge !== null && badge > 0 && (
                <span style={{
                  background: section === id ? "var(--accent)" : "var(--bg-3)",
                  color: section === id ? "#fff" : "var(--fg-muted)",
                  borderRadius: 999, padding: "1px 7px",
                  fontFamily: "var(--font-mono)", fontSize: "var(--text-2xs)"
                }}>{badge}</span>
              )}
            </button>
          ))}
        </div>

        {/* ── Orders section ── */}
        {section === "orders" && (
          <>
            {/* Stats */}
            <div className="admin-stats-3" style={{ display: "grid", gridTemplateColumns: "repeat(3, 1fr)", gap: 16, margin: "32px 0" }}>
              {[
                { kh: "ការបញ្ជាទិញសរុប", en: "Total orders",  val: orders.length,           serif: false, accent: false },
                { kh: "បញ្ជាក់",            en: "Confirmed",     val: confirmed,                serif: false, accent: confirmed > 0 },
                { kh: "ចំណូលសរុប",        en: "Revenue",       val: `$${revenue.toFixed(2)}`, serif: true,  accent: false },
              ].map(s => (
                <div key={s.en} style={{ border: "1px solid var(--line)", borderRadius: 12, padding: "20px 24px", background: "var(--bg-2)" }}>
                  <div className="col gap-8">
                    <span className="mono text-muted" style={{ fontSize: "var(--text-2xs)", letterSpacing: "0.1em", textTransform: "uppercase" }}>
                      <span className="km-sans" style={{ textTransform: "none", letterSpacing: 0 }}>{s.kh}</span> · {s.en}
                    </span>
                    <span className={s.serif ? "serif" : "mono"} style={{ fontSize: s.serif ? "var(--text-3xl)" : "var(--text-2xl)", color: s.accent ? "var(--accent)" : "var(--fg)" }}>
                      {s.val}
                    </span>
                  </div>
                </div>
              ))}
            </div>

            {/* Filter tabs */}
            <div className="row" style={{ borderBottom: "1px solid var(--line)", marginBottom: 0 }}>
              {[
                ["all",             "ទាំងអស់",                    "All"],
                ["pending_payment", STATUS_KH.pending_payment, STATUS_LABEL.pending_payment],
                ["confirmed",       STATUS_KH.confirmed,       STATUS_LABEL.confirmed],
                ["shipped",         STATUS_KH.shipped,         STATUS_LABEL.shipped],
                ["delivered",       STATUS_KH.delivered,       STATUS_LABEL.delivered],
              ].map(([id, kh, en]) => {
                const count = id === "all" ? orders.length : orders.filter(o => o.status === id).length;
                return (
                  <button
                    key={id}
                    type="button"
                    onClick={() => setFilter(id)}
                    style={{
                      background: "transparent", border: 0, cursor: "pointer",
                      padding: "10px 16px", font: "inherit",
                      color: filter === id ? "var(--fg)" : "var(--fg-muted)",
                      borderBottom: "2px solid " + (filter === id ? "var(--accent)" : "transparent"),
                      marginBottom: -1, display: "flex", alignItems: "center", gap: 6
                    }}
                  >
                    <span className="km-sans" style={{ fontSize: "var(--text-xs)" }}>{kh}</span>
                    <span style={{ fontFamily: "var(--font-mono)", fontSize: "var(--text-2xs)", opacity: 0.55 }}>· {en}</span>
                    {count > 0 && (
                      <span style={{
                        background: filter === id ? "var(--accent)" : "var(--bg-3)",
                        color: filter === id ? "#fff" : "var(--fg-muted)",
                        borderRadius: 999, padding: "1px 7px",
                        fontFamily: "var(--font-mono)", fontSize: "var(--text-2xs)"
                      }}>{count}</span>
                    )}
                  </button>
                );
              })}
            </div>

            {/* Loading */}
            {loading && (
              <div style={{ padding: "80px 0", display: "flex", alignItems: "center", justifyContent: "center" }}>
                <div style={{ width: 32, height: 32, borderRadius: "50%", border: "2px solid var(--line-strong)", borderTopColor: "var(--accent)", animation: "ks-spin 0.8s linear infinite" }} />
              </div>
            )}

            <div className="admin-table-scroll">
            <div className="admin-table-inner">

            {/* Table header */}
            {!loading && filtered.length > 0 && (
              <div style={{
                display: "grid",
                gridTemplateColumns: "20px 130px 90px 200px 1fr 70px 180px",
                gap: 16, padding: "10px 20px",
                borderBottom: "1px solid var(--line-strong)", marginTop: 0
              }}>
                {["", "ORDER ID", "DATE", "CUSTOMER", "ITEMS + ADDRESS", "TOTAL", "STATUS"].map(h => (
                  <span key={h} className="mono text-muted" style={{ fontSize: "var(--text-2xs)", letterSpacing: "0.1em" }}>{h}</span>
                ))}
              </div>
            )}

            {/* Empty state */}
            {!loading && filtered.length === 0 && (
              <div className="col gap-8 items-center" style={{ padding: "64px 0", color: "var(--fg-muted)", textAlign: "center" }}>
                <span className="km-sans" style={{ fontSize: "var(--text-base)" }}>គ្មានការបញ្ជាទិញ</span>
                <span style={{ fontSize: "var(--text-sm)" }}>No orders in this category.</span>
              </div>
            )}

            {/* Order rows */}
            {!loading && filtered.map(o => {
              const date       = o.createdAt?.toDate?.().toLocaleDateString("en-US", { month: "short", day: "numeric", year: "numeric" }) || "—";
              const nextStatus = STATUS_NEXT[o.status];
              const isUpdating = updating === o.id;
              const isExpanded = expanded === o.id;

              return (
                <div key={o.id} style={{ borderBottom: "1px solid var(--line)" }}>

                  {/* ── Summary row (clickable) ── */}
                  <div
                    role="button"
                    tabIndex={0}
                    onClick={() => setExpanded(isExpanded ? null : o.id)}
                    onKeyDown={e => (e.key === "Enter" || e.key === " ") && setExpanded(isExpanded ? null : o.id)}
                    style={{
                      display: "grid",
                      gridTemplateColumns: "20px 130px 90px 200px 1fr 70px 180px",
                      gap: 16, padding: "20px 20px",
                      alignItems: "start", cursor: "pointer",
                      background: isExpanded ? "var(--bg-2)" : "transparent",
                    }}
                  >
                    {/* Chevron */}
                    <span style={{
                      fontSize: "var(--text-2xs)", color: "var(--fg-muted)",
                      paddingTop: 2, transition: "transform 140ms",
                      display: "inline-block",
                      transform: isExpanded ? "rotate(90deg)" : "rotate(0deg)"
                    }}>▶</span>

                    <span className="mono" style={{ fontSize: "var(--text-2xs)", letterSpacing: "0.08em", wordBreak: "break-all" }}>
                      KS-{o.id.slice(0, 8).toUpperCase()}
                    </span>
                    <span className="text-muted" style={{ fontSize: "var(--text-xs)" }}>{date}</span>
                    <div className="col gap-3">
                      <span style={{ fontSize: "var(--text-xs)", fontWeight: 500 }}>{o.name || "—"}</span>
                      <span className="mono text-muted" style={{ fontSize: "var(--text-2xs)" }}>{o.phone || "—"}</span>
                    </div>
                    <div className="col gap-4">
                      {(o.items || []).map((it, i) => (
                        <span key={i} className="km-sans" style={{ fontSize: "var(--text-xs)" }}>
                          {it.labelKh || it.label}
                          <span className="mono text-muted" style={{ letterSpacing: "0.06em" }}> ×{it.qty}</span>
                        </span>
                      ))}
                      {o.address && (
                        <span className="text-muted" style={{ fontSize: "var(--text-2xs)", marginTop: 2 }}>{o.address}</span>
                      )}
                    </div>
                    <span className="serif" style={{ fontSize: "var(--text-lg)" }}>${Number(o.total || 0).toFixed(2)}</span>
                    <div className="col gap-8" onClick={e => e.stopPropagation()}>
                      <span style={{
                        display: "inline-flex", alignItems: "center", gap: 5, alignSelf: "start",
                        padding: "3px 10px", borderRadius: 999,
                        border: "1px solid " + (STATUS_COLOR[o.status] || "var(--line-strong)"),
                        color: STATUS_COLOR[o.status] || "var(--fg)",
                        fontFamily: "var(--font-mono)", fontSize: "var(--text-2xs)", letterSpacing: "0.06em"
                      }}>
                        <span className="km-sans" style={{ letterSpacing: 0 }}>{STATUS_KH[o.status] || o.status}</span>
                        · {(STATUS_LABEL[o.status] || o.status).toUpperCase()}
                      </span>
                      {nextStatus && (
                        <button
                          type="button"
                          className="btn"
                          style={{ fontSize: "var(--text-2xs)", padding: "5px 10px", alignSelf: "start" }}
                          onClick={() => advanceStatus(o)}
                          disabled={isUpdating}
                        >
                          {isUpdating ? "…" : STATUS_ACTION[o.status]}
                        </button>
                      )}
                      {o.status === "delivered" && (
                        <div className="row gap-4 items-center" style={{ color: "var(--primary)" }}>
                          <Icon name="check" size={12} />
                          <span className="mono" style={{ fontSize: "var(--text-2xs)", letterSpacing: "0.06em" }}>COMPLETE</span>
                        </div>
                      )}
                    </div>
                  </div>

                  {/* ── Expanded detail panel ── */}
                  {isExpanded && (
                    <div style={{
                      background: "var(--bg-2)", borderTop: "1px solid var(--line)",
                      padding: "24px 28px 24px 56px"
                    }}>
                      <div style={{ display: "grid", gridTemplateColumns: "1fr 1fr", gap: 32 }}>

                        {/* Left: customer + items */}
                        <div className="col gap-20">
                          <div className="col gap-8">
                            <span className="mono text-muted" style={{ fontSize: "var(--text-2xs)", letterSpacing: "0.1em", textTransform: "uppercase" }}>
                              ទំនាក់ទំនង · Customer
                            </span>
                            <div style={{ display: "grid", gridTemplateColumns: "80px 1fr", gap: "4px 12px" }}>
                              {[
                                ["Name",    o.name    || "—"],
                                ["Phone",   o.phone   || "—"],
                                ["Address", o.address || "—"],
                                ["Payment", o.paymentMethod === "cod" ? "Cash on Delivery" : (o.paymentMethod || "—").toUpperCase()],
                              ].map(([k, v]) => (
                                <React.Fragment key={k}>
                                  <span className="mono text-muted" style={{ fontSize: "var(--text-2xs)" }}>{k}</span>
                                  <span style={{ fontSize: "var(--text-xs)" }}>{v}</span>
                                </React.Fragment>
                              ))}
                            </div>
                            {o.notes && (
                              <div style={{
                                marginTop: 4, padding: "8px 12px",
                                background: "var(--bg-3)", borderRadius: 6,
                                fontSize: "var(--text-xs)", fontStyle: "italic", color: "var(--fg-muted)"
                              }}>
                                "{o.notes}"
                              </div>
                            )}
                          </div>

                          <div className="col gap-8">
                            <span className="mono text-muted" style={{ fontSize: "var(--text-2xs)", letterSpacing: "0.1em", textTransform: "uppercase" }}>
                              ទំនិញ · Items
                            </span>
                            {(o.items || []).map((it, i) => (
                              <div key={i} style={{
                                display: "grid", gridTemplateColumns: "1fr auto auto",
                                gap: 12, alignItems: "center",
                                padding: "6px 0", borderBottom: "1px solid var(--line)"
                              }}>
                                <span className="km-sans" style={{ fontSize: "var(--text-xs)" }}>
                                  {it.labelKh || it.label}
                                </span>
                                <span className="mono text-muted" style={{ fontSize: "var(--text-2xs)" }}>×{it.qty}</span>
                                <span className="mono" style={{ fontSize: "var(--text-xs)" }}>
                                  ${Number((it.price || 0) * it.qty).toFixed(2)}
                                </span>
                              </div>
                            ))}
                          </div>
                        </div>

                        {/* Right: totals + print */}
                        <div className="col gap-20">
                          <div className="col gap-8">
                            <span className="mono text-muted" style={{ fontSize: "var(--text-2xs)", letterSpacing: "0.1em", textTransform: "uppercase" }}>
                              ការទូទាត់ · Totals
                            </span>
                            {[
                              ["Subtotal",  `$${Number(o.subtotal || 0).toFixed(2)}`],
                              ["Shipping",  Number(o.shipping || 0) === 0 ? "Free" : `$${Number(o.shipping || 0).toFixed(2)}`],
                              ["Total",     `$${Number(o.total || 0).toFixed(2)}`],
                            ].map(([k, v], i) => (
                              <div key={k} style={{
                                display: "flex", justifyContent: "space-between",
                                padding: "5px 0",
                                borderTop: i === 2 ? "1px solid var(--line-strong)" : "none",
                                paddingTop: i === 2 ? 10 : 5,
                                marginTop: i === 2 ? 4 : 0
                              }}>
                                <span className="mono text-muted" style={{ fontSize: "var(--text-xs)" }}>{k}</span>
                                <span className={i === 2 ? "serif" : "mono"} style={{
                                  fontSize: i === 2 ? "var(--text-xl)" : "var(--text-xs)"
                                }}>{v}</span>
                              </div>
                            ))}
                          </div>

                          <div className="col gap-10">
                            <span className="mono text-muted" style={{ fontSize: "var(--text-2xs)", letterSpacing: "0.1em", textTransform: "uppercase" }}>
                              Order ID
                            </span>
                            <span className="mono" style={{ fontSize: "var(--text-xs)", letterSpacing: "0.06em" }}>
                              KS-{o.id.slice(0, 8).toUpperCase()}
                            </span>
                          </div>

                          <button
                            type="button"
                            className="btn"
                            style={{ alignSelf: "start", gap: 6 }}
                            onClick={() => printSlipWithQR(o)}
                          >
                            <Icon name="printer" size={13} />
                            <span className="km-sans">បោះពុម្ព</span> · Print slip
                          </button>
                        </div>

                      </div>
                    </div>
                  )}

                </div>
              );
            })}

            </div>{/* admin-table-inner */}
            </div>{/* admin-table-scroll */}
          </>
        )}

        {/* ── Products section ── */}
        {section === "products" && <ProductsSection />}

        {/* ── Promos section ── */}
        {section === "promos" && <PromosSection />}

        {/* ── Analytics section ── */}
        {section === "analytics" && <AnalyticsSection orders={orders} />}

        {/* ── Notifications section ── */}
        {section === "notifications" && <NotificationsSection />}

        {/* ── Bakong section ── */}
        {section === "bakong" && <BakongSection />}

      </div>
    </main>
  );
}

Object.assign(window, { AdminPanel });
