/* Tenant Outbound: dashboard + new-campaign wizard */
const { useEffect, useMemo, useState } = React;

const OUTBOUND_TEMPLATES = [
  { id: "appointment_reminders", icon: "calendar", name: "Appointment reminders", desc: "Call to confirm upcoming appointments. Reschedule if needed.", avg: "42s", conv: "72%" },
  { id: "payment_followup", icon: "card", name: "Payment follow-up", desc: "Polite reminder for outstanding invoices. Accepts M-Pesa pay.", avg: "1m 12s", conv: "48%" },
  { id: "lead_qualification", icon: "sparkles", name: "Lead qualification", desc: "Call new inbound leads within 60s. Qualify BANT. Book handoff.", avg: "2m 08s", conv: "31%" },
  { id: "customer_checkin", icon: "bot", name: "Customer check-in", desc: "Proactive NPS-style call post-service. Flag detractors.", avg: "58s", conv: "64%" },
  { id: "renewal_outreach", icon: "clock", name: "Renewal outreach", desc: "Auto-call 30/14/3 days before subscription ends.", avg: "1m 24s", conv: "58%" },
  { id: "custom_campaign", icon: "sparkles", name: "Custom campaign", desc: "Start from a blank script. Use this when nothing above fits.", avg: "—", conv: "—" },
];

const DIAL_DAY_LABELS = ["M", "T", "W", "T", "F", "S", "S"];
const WIZARD_STEPS = [
  { id: 1, title: "Pick a template" },
  { id: 2, title: "Who to call" },
  { id: 3, title: "Review script" },
  { id: 4, title: "When to dial" },
];

const formatPercent = (v) => `${Math.max(0, Math.round(Number(v || 0) * 100))}%`;

const OutboundPage = () => {
  const store = MK_USE();
  const tenantNumbers = Array.isArray(store.tenantNumbers) ? store.tenantNumbers : [];

  const [busy, setBusy] = useState(false);
  const [error, setError] = useState("");

  const [campaignFilter, setCampaignFilter] = useState("all");
  const [search, setSearch] = useState("");
  const [campaigns, setCampaigns] = useState([]);

  const [mode, setMode] = useState("dashboard"); // dashboard | wizard
  const [step, setStep] = useState(1);
  const [selectedTemplateId, setSelectedTemplateId] = useState("appointment_reminders");
  const [audienceSource, setAudienceSource] = useState("upload_csv");
  const [uploadedCsvName, setUploadedCsvName] = useState("");
  const [scriptDraft, setScriptDraft] = useState({
    campaignName: "Appointment reminders",
    opening: "Hi {{name}}, it's Mikaka from {{business}}. Just confirming your appointment {{when}}. Still works for you?",
    tone: "Friendly, brief - no upsell.",
  });
  const [dialWindow, setDialWindow] = useState({
    timeOfDay: "Business hours (9am - 6pm EAT)",
    days: [0, 1, 2, 3, 4],
    startDialing: "Now",
    quietHours: true,
    maxAttempts: true,
    honorOptOut: true,
    requireApproval: false,
  });

  const activeTemplate = useMemo(
    () => OUTBOUND_TEMPLATES.find((t) => t.id === selectedTemplateId) || OUTBOUND_TEMPLATES[0],
    [selectedTemplateId]
  );

  const safeRun = async (fn) => {
    setError("");
    setBusy(true);
    try {
      return await fn();
    } catch (err) {
      setError(err?.message || "Something went wrong.");
      throw err;
    } finally {
      setBusy(false);
    }
  };

  const loadCampaigns = async () => {
    const status = campaignFilter === "all" ? undefined : campaignFilter;
    const rows = await api.outbound.listCampaigns({ status });
    setCampaigns(Array.isArray(rows) ? rows : []);
  };

  useEffect(() => {
    loadCampaigns().catch(() => {});
  }, [campaignFilter]);

  const filteredCampaigns = useMemo(() => {
    const term = search.trim().toLowerCase();
    if (!term) return campaigns;
    return campaigns.filter((c) => String(c.name || "").toLowerCase().includes(term));
  }, [campaigns, search]);

  const campaignStats = useMemo(() => {
    const active = campaigns.filter((c) => c.status === "active").length;
    const queued = campaigns.reduce((sum, c) => sum + Number(c.metadata?.queue_count || c.metadata?.queued || 0), 0);
    const completed = campaigns.reduce((sum, c) => sum + Number(c.metadata?.completed_7d || 0), 0);
    const pickupRateAvg =
      campaigns.length > 0
        ? campaigns.reduce((sum, c) => sum + Number(c.metadata?.pickup_rate || 0), 0) / campaigns.length
        : 0.65;
    return { active, queued, completed, pickupRateAvg };
  }, [campaigns]);

  const statusCount = useMemo(() => {
    const counts = { all: campaigns.length, active: 0, paused: 0, draft: 0 };
    campaigns.forEach((c) => {
      const s = String(c.status || "");
      if (s === "active") counts.active += 1;
      if (s === "paused") counts.paused += 1;
      if (s === "draft") counts.draft += 1;
    });
    return counts;
  }, [campaigns]);

  const handleStepContinue = () => {
    if (step >= 4) return;
    setStep((s) => s + 1);
  };

  const handleStepBack = () => {
    if (step <= 1) {
      setMode("dashboard");
      return;
    }
    setStep((s) => s - 1);
  };

  const handleLaunchCampaign = async () => {
    const fallbackNumberId = tenantNumbers[0]?.id ? String(tenantNumbers[0].id) : "";
    if (!fallbackNumberId) {
      toast({ title: "Add a number first", body: "You need at least one tenant number to launch campaigns." });
      return;
    }

    await safeRun(async () => {
      const payload = {
        name: scriptDraft.campaignName.trim(),
        description: activeTemplate.desc,
        mode: "campaign",
        source_number_id: fallbackNumberId,
        industry_slug: "generic",
        call_type: activeTemplate.id === "lead_qualification" ? "lead_qualification" : "generic_follow_up",
        warmth: "warm",
        objective: "inform_and_progress",
        max_concurrent_calls: 1,
        metadata: {
          audience_source: audienceSource,
          uploaded_csv_name: uploadedCsvName || null,
          pickup_rate: 0,
          queue_count: uploadedCsvName ? 540 : 0,
        },
        script: {
          opening: scriptDraft.opening,
          tone_guidance: scriptDraft.tone,
          reason_summary_template: scriptDraft.opening,
        },
        schedule: {
          time_of_day: dialWindow.timeOfDay,
          days_of_week: dialWindow.days,
          start_dialing: dialWindow.startDialing,
          quiet_hours: dialWindow.quietHours,
        },
      };
      await api.outbound.createCampaign(payload);
      toast({ title: "Campaign launched", body: `${payload.name} is ready.` });
      setMode("dashboard");
      setStep(1);
      await loadCampaigns();
    });
  };

  const stepDone = (n) => step > n;
  const stepActive = (n) => step === n;

  const StatCard = ({ label, value, note, noteClass = "" }) => (
    <div className="card stat">
      <div className="k">{label}</div>
      <div className="v">{value}</div>
      <div className={"d " + noteClass}>{note}</div>
    </div>
  );

  const CampaignCard = ({ campaign }) => {
    const queue = Number(campaign.metadata?.queue_count || campaign.metadata?.queued || 0);
    const completed = Number(campaign.metadata?.completed || 0);
    const total = Math.max(queue + completed, 1);
    const progress = Math.min(100, Math.round((completed / total) * 100));
    const pickupRate = Number(campaign.metadata?.pickup_rate || 0.41);
    const lastRun = campaign.updated_at ? new Date(campaign.updated_at).toLocaleString() : "—";
    const badgeColor =
      campaign.status === "active" ? "var(--mk-success)" : campaign.status === "paused" ? "var(--mk-warning)" : "var(--fg-muted)";

    return (
      <div className="card" style={{ padding: 16 }}>
        <div className="row" style={{ justifyContent: "space-between", gap: 10 }}>
          <div style={{ minWidth: 0 }}>
            <div style={{ fontWeight: 600, fontSize: 16 }}>{campaign.name}</div>
            <div style={{ fontSize: 12, color: "var(--fg-muted)", marginTop: 4 }}>
              {(campaign.schedule?.time_of_day || "Daily")} · {(campaign.schedule?.timezone || "EAT")}
            </div>
          </div>
          <span
            style={{
              fontSize: 12,
              color: badgeColor,
              border: "1px solid color-mix(in srgb, " + badgeColor + " 45%, var(--border))",
              background: "color-mix(in srgb, " + badgeColor + " 12%, transparent)",
              borderRadius: 999,
              padding: "4px 8px",
              whiteSpace: "nowrap",
            }}
          >
            {campaign.status}
          </span>
        </div>

        <div style={{ marginTop: 12 }}>
          <div style={{ height: 4, borderRadius: 999, background: "var(--bg-sunken)", overflow: "hidden" }}>
            <div style={{ width: `${progress}%`, height: "100%", background: "var(--mk-orange)" }} />
          </div>
          <div className="row" style={{ justifyContent: "space-between", marginTop: 6, fontSize: 11, color: "var(--fg-muted)" }}>
            <span>{completed} of {total}</span>
            <span>{progress}%</span>
          </div>
        </div>

        <div className="grid grid-3" style={{ marginTop: 14 }}>
          <div>
            <div style={{ fontSize: 10, letterSpacing: ".08em", textTransform: "uppercase", color: "var(--fg-faint)" }}>Queue</div>
            <div style={{ fontWeight: 600, marginTop: 3 }}>{queue}</div>
          </div>
          <div>
            <div style={{ fontSize: 10, letterSpacing: ".08em", textTransform: "uppercase", color: "var(--fg-faint)" }}>Pickup</div>
            <div style={{ fontWeight: 600, marginTop: 3, color: "var(--mk-success)" }}>{formatPercent(pickupRate)}</div>
          </div>
          <div>
            <div style={{ fontSize: 10, letterSpacing: ".08em", textTransform: "uppercase", color: "var(--fg-faint)" }}>Last run</div>
            <div style={{ fontWeight: 600, marginTop: 3 }}>{lastRun}</div>
          </div>
        </div>
      </div>
    );
  };

  const TemplateCard = ({ template, selected, onClick }) => (
    <button
      className="card"
      onClick={onClick}
      style={{
        textAlign: "left",
        padding: 18,
        border: selected ? "1px solid color-mix(in srgb, var(--mk-orange) 55%, var(--border))" : "1px solid var(--border)",
        boxShadow: selected ? "0 0 0 1px color-mix(in srgb, var(--mk-orange) 30%, transparent)" : "none",
        background: selected ? "color-mix(in srgb, var(--mk-orange) 5%, var(--bg-elev))" : "var(--bg-elev)",
      }}
    >
      <div className="row" style={{ justifyContent: "space-between", alignItems: "flex-start" }}>
        <Icon name={template.icon} />
        {selected ? (
          <span style={{ color: "var(--mk-orange)" }}>
            <Icon name="check" size={14} />
          </span>
        ) : null}
      </div>
      <div style={{ marginTop: 10, fontWeight: 600 }}>{template.name}</div>
      <div style={{ marginTop: 6, fontSize: 13, color: "var(--fg-muted)", lineHeight: 1.5 }}>{template.desc}</div>
      <div style={{ marginTop: 10, fontSize: 12, color: "var(--fg-faint)" }}>
        avg {template.avg} · conv <span style={{ color: "var(--mk-orange)" }}>{template.conv}</span>
      </div>
    </button>
  );

  const WizardStepPills = () => (
    <div className="row" style={{ gap: 14, flexWrap: "wrap", marginBottom: 22 }}>
      {WIZARD_STEPS.map((s) => {
        const done = stepDone(s.id);
        const active = stepActive(s.id);
        const dotBg = done ? "var(--mk-success)" : active ? "var(--mk-orange)" : "var(--bg-sunken)";
        const dotColor = done || active ? "#fff" : "var(--fg-faint)";
        return (
          <div key={s.id} className="row" style={{ gap: 8 }}>
            <div
              style={{
                width: 22,
                height: 22,
                borderRadius: "50%",
                display: "flex",
                alignItems: "center",
                justifyContent: "center",
                background: dotBg,
                color: dotColor,
                fontSize: 11,
                border: "1px solid var(--border)",
              }}
            >
              {done ? <Icon name="check" size={12} /> : s.id}
            </div>
            <div style={{ fontSize: 13, color: active ? "var(--fg)" : "var(--fg-muted)", fontWeight: active ? 600 : 500 }}>{s.title}</div>
          </div>
        );
      })}
    </div>
  );

  if (mode === "wizard") {
    return (
      <div className="page page-mount">
        <div style={{ fontSize: 13, color: "var(--fg-muted)" }}>Outbound</div>
        <h1 className="page-title" style={{ marginTop: 4 }}>New outbound campaign</h1>
        <WizardStepPills />

        {step === 1 ? (
          <>
            <div style={{ color: "var(--fg-muted)", marginBottom: 14 }}>Pick a starting point. You can edit every word of the script in the next steps.</div>
            <div className="grid grid-3">
              {OUTBOUND_TEMPLATES.map((t) => (
                <TemplateCard key={t.id} template={t} selected={selectedTemplateId === t.id} onClick={() => {
                  setSelectedTemplateId(t.id);
                  setScriptDraft((s) => ({ ...s, campaignName: t.name }));
                }} />
              ))}
            </div>
          </>
        ) : null}

        {step === 2 ? (
          <>
            <div style={{ color: "var(--fg-muted)", marginBottom: 14 }}>Where do the numbers come from?</div>
            <div className="grid grid-2" style={{ gap: 12 }}>
              {[
                { id: "upload_csv", title: "Upload CSV", desc: "One phone number per row. 1,000 max for starter plan." },
                { id: "google_sheets", title: "Google Sheets", desc: "Auto-refresh from a live sheet every hour." },
                { id: "from_crm", title: "From CRM", desc: "Pull a saved segment from HubSpot / Salesforce / Zoho." },
                { id: "filter_existing", title: "Filter existing", desc: "Past callers who match a filter. No import needed." },
              ].map((source) => (
                <button
                  key={source.id}
                  className="card"
                  onClick={() => setAudienceSource(source.id)}
                  style={{
                    textAlign: "left",
                    padding: 14,
                    border: audienceSource === source.id ? "1px solid color-mix(in srgb, var(--mk-orange) 55%, var(--border))" : "1px solid var(--border)",
                  }}
                >
                  <div style={{ fontWeight: 600 }}>{source.title}</div>
                  <div style={{ fontSize: 12, color: "var(--fg-muted)", marginTop: 5 }}>{source.desc}</div>
                </button>
              ))}
            </div>

            <div
              className="card"
              style={{
                marginTop: 14,
                padding: "34px 20px",
                borderStyle: "dashed",
                borderColor: "color-mix(in srgb, var(--mk-orange) 50%, var(--border))",
                textAlign: "center",
              }}
            >
              <div style={{ color: "var(--fg-muted)", marginBottom: 8 }}>Drop your CSV or click to pick</div>
              <div style={{ fontSize: 12, color: "var(--fg-faint)", marginBottom: 12 }}>Columns: name, phone (E.164), {{when}}, {{ref}}</div>
              <button
                className="btn btn-outline btn-sm"
                onClick={() => setUploadedCsvName("appointments_november.csv · 540 rows")}
              >
                <Icon name="download" /> Simulate upload
              </button>
              {uploadedCsvName ? (
                <div style={{ marginTop: 10, color: "var(--mk-success)", fontSize: 12 }}>
                  <Icon name="check" size={12} /> {uploadedCsvName}
                </div>
              ) : null}
            </div>
          </>
        ) : null}

        {step === 3 ? (
          <>
            <div style={{ color: "var(--fg-muted)", marginBottom: 14 }}>
              Edit the opening line. Mikaka adapts everything after based on what the caller says.
            </div>
            <div className="grid grid-2">
              <div className="stack gap-3">
                <div className="field">
                  <label>Campaign name</label>
                  <input className="input" value={scriptDraft.campaignName} onChange={(e) => setScriptDraft((s) => ({ ...s, campaignName: e.target.value }))} />
                </div>
                <div className="field">
                  <label>Opening line</label>
                  <textarea className="input" rows={4} value={scriptDraft.opening} onChange={(e) => setScriptDraft((s) => ({ ...s, opening: e.target.value }))} />
                  <div style={{ marginTop: 6, fontSize: 12, color: "var(--fg-faint)" }}>Variables: {"{{name}}, {{business}}, {{when}}"}</div>
                </div>
                <div className="field">
                  <label>Tone guidance</label>
                  <textarea className="input" rows={3} value={scriptDraft.tone} onChange={(e) => setScriptDraft((s) => ({ ...s, tone: e.target.value }))} />
                </div>
              </div>
              <div className="card" style={{ padding: 14, background: "var(--bg-sunken)" }}>
                <div style={{ fontSize: 11, letterSpacing: ".09em", textTransform: "uppercase", color: "var(--fg-faint)" }}>Preview</div>
                <div className="card" style={{ marginTop: 10, padding: 12, borderLeft: "2px solid var(--mk-orange)" }}>
                  <div style={{ fontSize: 12, color: "var(--fg-faint)" }}>Mikaka · 0:02</div>
                  <div style={{ marginTop: 6 }}>{scriptDraft.opening.replace("{{name}}", "Jane").replace("{{business}}", "Acme Dentistry").replace("{{when}}", "tomorrow at 10am")}</div>
                </div>
                <div className="card" style={{ marginTop: 10, padding: 12, borderLeft: "2px solid #7255ff" }}>
                  <div style={{ fontSize: 12, color: "var(--fg-faint)" }}>Jane · 0:06</div>
                  <div style={{ marginTop: 6, color: "var(--fg-muted)", fontStyle: "italic" }}>...caller response will be generated live...</div>
                </div>
              </div>
            </div>
          </>
        ) : null}

        {step === 4 ? (
          <>
            <div style={{ color: "var(--fg-muted)", marginBottom: 14 }}>When should Mikaka dial?</div>
            <div className="grid grid-2">
              <div className="card" style={{ padding: 16 }}>
                <div style={{ fontWeight: 600, marginBottom: 12 }}>Dial window</div>
                <div className="field">
                  <label>Time of day</label>
                  <select className="input" value={dialWindow.timeOfDay} onChange={(e) => setDialWindow((d) => ({ ...d, timeOfDay: e.target.value }))}>
                    <option>Business hours (9am - 6pm EAT)</option>
                    <option>Morning only (8am - 12pm EAT)</option>
                    <option>Afternoon (12pm - 5pm EAT)</option>
                  </select>
                </div>
                <div style={{ marginTop: 12 }}>
                  <div style={{ fontSize: 12, color: "var(--fg-muted)", marginBottom: 8 }}>Days of week</div>
                  <div className="row" style={{ gap: 8 }}>
                    {DIAL_DAY_LABELS.map((label, idx) => {
                      const enabled = dialWindow.days.includes(idx);
                      return (
                        <button
                          key={idx}
                          className="btn btn-sm"
                          style={{
                            minWidth: 32,
                            background: enabled ? "var(--mk-orange)" : "var(--bg-sunken)",
                            color: enabled ? "#fff" : "var(--fg-muted)",
                          }}
                          onClick={() =>
                            setDialWindow((d) => ({
                              ...d,
                              days: enabled ? d.days.filter((v) => v !== idx) : [...d.days, idx].sort((a, b) => a - b),
                            }))
                          }
                        >
                          {label}
                        </button>
                      );
                    })}
                  </div>
                </div>
                <div className="field" style={{ marginTop: 12 }}>
                  <label>Start dialing</label>
                  <select className="input" value={dialWindow.startDialing} onChange={(e) => setDialWindow((d) => ({ ...d, startDialing: e.target.value }))}>
                    <option>Now</option>
                    <option>In 4 minutes</option>
                    <option>Tomorrow 9:00am</option>
                  </select>
                </div>
              </div>

              <div className="card" style={{ padding: 16 }}>
                <div style={{ fontWeight: 600, marginBottom: 12 }}>Safety rails</div>
                {[
                  ["quietHours", "Quiet hours", "No calls before 9am or after 6pm local"],
                  ["maxAttempts", "Max 3 attempts per contact", "Spaced 3 hours apart"],
                  ["honorOptOut", "Honor opt-outs globally", "Across all current and future campaigns"],
                  ["requireApproval", "Require human approval", "For scripts flagged as high-risk"],
                ].map(([key, title, hint]) => (
                  <div key={key} className="row" style={{ justifyContent: "space-between", marginBottom: 12 }}>
                    <div>
                      <div style={{ fontWeight: 500 }}>{title}</div>
                      <div style={{ fontSize: 12, color: "var(--fg-muted)" }}>{hint}</div>
                    </div>
                    <button
                      className="btn btn-sm"
                      onClick={() => setDialWindow((d) => ({ ...d, [key]: !d[key] }))}
                      style={{
                        minWidth: 52,
                        background: dialWindow[key] ? "var(--mk-orange)" : "var(--bg-sunken)",
                        color: dialWindow[key] ? "#fff" : "var(--fg-muted)",
                      }}
                    >
                      {dialWindow[key] ? "On" : "Off"}
                    </button>
                  </div>
                ))}
              </div>
            </div>

            <div className="card" style={{ marginTop: 14, padding: 14 }}>
              <div style={{ fontSize: 11, letterSpacing: ".09em", textTransform: "uppercase", color: "var(--fg-faint)" }}>Ready to launch</div>
              <div className="grid grid-4" style={{ marginTop: 10 }}>
                <div><div style={{ fontSize: 11, color: "var(--fg-faint)" }}>Template</div><div style={{ fontWeight: 600, marginTop: 3 }}>{activeTemplate.name}</div></div>
                <div><div style={{ fontSize: 11, color: "var(--fg-faint)" }}>Audience</div><div style={{ fontWeight: 600, marginTop: 3 }}>{uploadedCsvName ? "540 contacts" : "—"}</div></div>
                <div><div style={{ fontSize: 11, color: "var(--fg-faint)" }}>First dial</div><div style={{ fontWeight: 600, marginTop: 3 }}>{dialWindow.startDialing}</div></div>
                <div><div style={{ fontSize: 11, color: "var(--fg-faint)" }}>Est. completion</div><div style={{ fontWeight: 600, marginTop: 3 }}>~3 days</div></div>
              </div>
            </div>
          </>
        ) : null}

        <div className="row" style={{ justifyContent: "space-between", marginTop: 20 }}>
          <button className="btn btn-ghost" onClick={handleStepBack}>
            <Icon name="chevron-left" /> {step === 1 ? "Cancel" : "Back"}
          </button>
          <div className="row gap-2">
            {step === 4 ? (
              <>
                <button className="btn btn-outline" onClick={() => setMode("dashboard")}>Save as draft</button>
                <button className="btn btn-accent" onClick={handleLaunchCampaign} disabled={busy}>
                  <Icon name="phone" /> Launch campaign
                </button>
              </>
            ) : (
              <button className="btn btn-accent" onClick={handleStepContinue}>
                Next <Icon name="arrow-right" />
              </button>
            )}
          </div>
        </div>
        {error ? <div style={{ color: "var(--mk-danger)", marginTop: 10, fontSize: 13 }}>{error}</div> : null}
      </div>
    );
  }

  return (
    <div className="page page-mount">
      <div className="page-header">
        <div>
          <h1 className="page-title">Outbound</h1>
          <p className="page-sub">Proactive AI-driven calls. Appointment reminders, follow-ups, lead qualification - at scale.</p>
        </div>
        <div className="row gap-2">
          <button className="btn btn-outline"><Icon name="list" /> View call log</button>
          <button className="btn btn-accent" onClick={() => { setMode("wizard"); setStep(1); }}>
            <Icon name="plus" /> New campaign
          </button>
        </div>
      </div>

      <div className="grid grid-4" style={{ marginBottom: 16 }}>
        <StatCard label="Active campaigns" value={campaignStats.active} note="running now" noteClass="up" />
        <StatCard label="Calls in queue" value={campaignStats.queued} note="Next dial in 4 min" />
        <StatCard label="Completed (7d)" value={campaignStats.completed} note="↑ 18% vs last week" noteClass="up" />
        <StatCard label="Avg pickup rate" value={formatPercent(campaignStats.pickupRateAvg)} note="Benchmark: 52%" />
      </div>

      <div className="row" style={{ justifyContent: "space-between", marginBottom: 14, gap: 12, flexWrap: "wrap" }}>
        <div className="seg">
          {[
            ["all", `All ${statusCount.all}`],
            ["active", `Running ${statusCount.active}`],
            ["paused", `Paused ${statusCount.paused}`],
            ["draft", `Draft ${statusCount.draft}`],
          ].map(([key, label]) => (
            <button key={key} className={campaignFilter === key ? "on" : ""} onClick={() => setCampaignFilter(key)}>
              {label}
            </button>
          ))}
        </div>
        <div className="row" style={{ gap: 8 }}>
          <Icon name="search" style={{ color: "var(--fg-faint)" }} />
          <input className="input" placeholder="Search campaigns..." value={search} onChange={(e) => setSearch(e.target.value)} style={{ minWidth: 220 }} />
        </div>
      </div>

      <div className="grid grid-3">
        {filteredCampaigns.map((campaign) => (
          <CampaignCard key={String(campaign.id)} campaign={campaign} />
        ))}
        {filteredCampaigns.length === 0 ? (
          <div className="empty" style={{ gridColumn: "1 / -1" }}>
            <div className="illus"><Icon name="phone" /></div>
            <div style={{ fontWeight: 600, marginBottom: 6 }}>No campaigns yet</div>
            <div style={{ color: "var(--fg-muted)", fontSize: 13 }}>Start from a template to launch your first outbound campaign.</div>
          </div>
        ) : null}
      </div>

      <div style={{ marginTop: 34 }}>
        <h2 style={{ fontSize: 30, margin: 0, fontWeight: 600, letterSpacing: "-0.03em" }}>Start from a template</h2>
        <div style={{ marginTop: 8, color: "var(--fg-muted)" }}>Battle-tested scripts for common outbound jobs.</div>
        <div className="grid grid-4" style={{ marginTop: 14 }}>
          {OUTBOUND_TEMPLATES.slice(0, 5).map((t) => (
            <TemplateCard key={t.id} template={t} selected={false} onClick={() => {
              setSelectedTemplateId(t.id);
              setScriptDraft((s) => ({ ...s, campaignName: t.name }));
              setMode("wizard");
              setStep(1);
            }} />
          ))}
        </div>
      </div>

      {error ? (
        <div style={{ color: "var(--mk-danger)", marginTop: 12, fontSize: 13 }}>{error}</div>
      ) : null}
    </div>
  );
};

