// =================================================================
// pw-screens-analytics.jsx — Publisher Admin · Advanced Analytics
//   AnalyticsScreen  — paid-subscriber dashboard + AI cohort table
//   CohortDetail     — pages consumed + the broad path (journey) a cohort takes
// =================================================================

const fmtUsers = (n) => n >= 1e6 ? (n / 1e6).toFixed(n >= 1e7 ? 0 : 1) + "M" : n >= 1e3 ? Math.round(n / 1e3) + "K" : String(n);
const leaningTone = (l) => /right/i.test(l) ? "warn" : /left/i.test(l) ? "info" : /liber/i.test(l) ? "accent" : "neutral";

// ----- AI persona chip: "Male · 40s · Right-leaning" -----
const PersonaCells = ({ persona }) => (
  <div className="pw-persona">
    <span className="pw-persona-main">{persona.gender} · {persona.age}</span>
    <Pill tone={leaningTone(persona.leaning)} style={{ marginTop: 4 }}>{persona.leaning}</Pill>
  </div>
);

// ===========================================================
// Cohort detail — pages consumed + broad path
// ===========================================================
const CohortDetail = ({ cohort, onBack }) => {
  const totalViews = cohort.pages.reduce((a, p) => a + p.views, 0);
  return (
    <Screen>
      <button className="pw-back" onClick={onBack}><IconArrowL size={15}/> All cohorts</button>

      <Card>
        <div className="pw-coh-hero">
          <div style={{ minWidth: 0 }}>
            <div className="pw-coh-eyebrow"><IconBolt size={13}/> AI-aggregated cohort · {Math.round(cohort.confidence * 100)}% confidence</div>
            <h2 className="pw-coh-title">{cohort.topic}</h2>
            <div style={{ display: "flex", alignItems: "center", gap: 8, marginTop: 10, flexWrap: "wrap" }}>
              <Pill tone="neutral">{cohort.persona.gender} · {cohort.persona.age}</Pill>
              <Pill tone={leaningTone(cohort.persona.leaning)}>{cohort.persona.leaning}</Pill>
              <span style={{ fontSize: 12.5, color: "var(--muted)" }}>· {cohort.plans} · peaks {cohort.peakTime.toLowerCase()}</span>
            </div>
          </div>
          <div className="pw-coh-hero-stats">
            <MiniStat label="Cohort size" value={fmtUsers(cohort.users) + " users"}/>
            <MiniStat label="ARPU" value={fmt.currency(cohort.arpu)}/>
            <MiniStat label="Retention" value={Math.round(cohort.retention * 100) + "%"}/>
          </div>
        </div>
      </Card>

      <div className="pw-coh-grid">
        <Card title="Pages consumed" subtitle={`Top content for this cohort · ${fmtUsers(totalViews)} views`} padded={false}>
          <DataTable rows={cohort.pages} keyField="title" density="compact" defaultSort={{ key: "views", dir: "desc" }}
            columns={[
              { key: "title", label: "Page", render: r => (
                <div><div style={{ fontWeight: 500, color: "var(--ink)" }}>{r.title}</div>
                  <div style={{ fontSize: 11.5, color: "var(--muted)" }}>{r.section}</div></div>) },
              { key: "views", label: "Views", align: "right", render: r => <span style={{ fontFamily: "var(--mono)", fontSize: 12.5 }}>{fmtUsers(r.views)}</span> },
              { key: "avgMin", label: "Avg time", align: "right", render: r => <span style={{ fontFamily: "var(--mono)", fontSize: 12.5 }}>{r.avgMin}m</span> },
              { key: "completion", label: "Completion", align: "right", w: 130, render: r => (
                <div style={{ display: "flex", alignItems: "center", gap: 8, justifyContent: "flex-end" }}>
                  <div style={{ width: 56, height: 6, borderRadius: 999, background: "var(--line-2)", overflow: "hidden" }}>
                    <div style={{ width: `${Math.round(r.completion * 100)}%`, height: "100%", background: "var(--accent)" }}/>
                  </div>
                  <span style={{ fontFamily: "var(--mono)", fontSize: 12, color: "var(--muted)" }}>{Math.round(r.completion * 100)}%</span>
                </div>) },
            ]}/>
        </Card>

        <Card title="The broad path" subtitle="How this cohort typically moves through the site">
          <div className="pw-journey">
            {cohort.journey.map((s, i) => (
              <div className="pw-jstep" key={i}>
                <div className="pw-jstep-rail">
                  <span className="pw-jstep-dot" style={{ background: i === cohort.journey.length - 1 ? "var(--good)" : "var(--accent)" }}/>
                  {i < cohort.journey.length - 1 && <span className="pw-jstep-line"/>}
                </div>
                <div className="pw-jstep-body">
                  <div className="pw-jstep-head">
                    <span className="pw-jstep-name">{s.step}</span>
                    <span className="pw-jstep-share">{Math.round(s.share * 100)}%</span>
                  </div>
                  <div className="pw-jstep-bar"><div style={{ width: `${Math.round(s.share * 100)}%` }}/></div>
                  <div className="pw-jstep-note">{s.note}</div>
                </div>
              </div>
            ))}
          </div>
        </Card>
      </div>

      <style>{`
        .pw-back { display: inline-flex; align-items: center; gap: 7px; background: transparent; border: none; cursor: pointer; font: inherit; font-size: 13px; color: var(--muted); padding: 4px 0; align-self: flex-start; }
        .pw-back:hover { color: var(--accent); }
        .pw-coh-hero { display: flex; justify-content: space-between; gap: 24px; align-items: flex-start; flex-wrap: wrap; }
        .pw-coh-eyebrow { display: inline-flex; align-items: center; gap: 6px; font-size: 11.5px; text-transform: uppercase; letter-spacing: .05em; color: var(--accent); font-weight: 600; }
        .pw-coh-eyebrow svg { color: var(--warn); }
        .pw-coh-title { font-size: 22px; font-weight: 600; letter-spacing: -.02em; margin: 8px 0 0; }
        .pw-coh-hero-stats { display: flex; gap: 28px; flex-shrink: 0; }
        .pw-coh-grid { display: grid; grid-template-columns: 1.5fr 1fr; gap: var(--gap); align-items: start; }
        .pw-coh-grid > * { min-width: 0; }
        @media (max-width: 1023px) { .pw-coh-grid { grid-template-columns: 1fr; } .pw-coh-hero-stats { gap: 20px; } }
        .pw-journey { display: flex; flex-direction: column; }
        .pw-jstep { display: grid; grid-template-columns: 18px 1fr; gap: 12px; }
        .pw-jstep-rail { display: flex; flex-direction: column; align-items: center; }
        .pw-jstep-dot { width: 11px; height: 11px; border-radius: 50%; margin-top: 3px; flex-shrink: 0; box-shadow: 0 0 0 3px var(--accent-soft); }
        .pw-jstep-line { flex: 1; width: 2px; background: var(--line); margin: 3px 0; min-height: 22px; }
        .pw-jstep-body { padding-bottom: 18px; min-width: 0; }
        .pw-jstep-head { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; }
        .pw-jstep-name { font-size: 13.5px; font-weight: 600; color: var(--ink); }
        .pw-jstep-share { font-family: var(--mono); font-size: 12.5px; color: var(--ink-2); }
        .pw-jstep-bar { height: 6px; border-radius: 999px; background: var(--line-2); overflow: hidden; margin: 7px 0 5px; }
        .pw-jstep-bar > div { height: 100%; border-radius: 999px; background: linear-gradient(90deg, var(--accent), color-mix(in oklab, var(--accent) 55%, var(--panel))); }
        .pw-jstep-note { font-size: 12px; color: var(--muted); }
      `}</style>
    </Screen>
  );
};

// ===========================================================
// Analytics dashboard + cohort table
// ===========================================================
const toSeries = (rows, keys) => (rows || []).map((r) => ({
  label: r.week || r.period || "",
  value: keys.reduce((s, k) => s + Number(r[k] || 0), 0),
}));
const liveAnalyticsView = (overview, segments, fallback) => {
  if (!overview) return null;
  const k = overview.kpis || {};
  const conversions = overview.conversions_timeseries || [];
  const access = overview.access_type_breakdown || [];
  const couponPoints = overview.coupon_points || {};
  return {
    kpis: {
      paidUsers: Number(k.paying_users || 0),
      mrr: Number(k.revenue || 0),
      arpu: Number(k.arpu || 0),
      avgRetention: 0,
      paidShare: Number(k.coupon_reveal_rate || 0) / 100,
      coinsGranted: Number(k.coins_granted || 0),
      coinsSpent: Number(k.coins_spent || 0),
      adImpressions: Number(k.ad_impressions || 0),
      adClicks: Number(k.ad_clicks || 0),
    },
    revenueByDay: toSeries(conversions, ["single", "day_pass", "subscription"]).map(x => x.value),
    paidByPlan: access.map((x, i) => ({
      label: titleize(x.type || "access"),
      value: Number(x.users || 0),
      color: ["#5b5bf5", "#0fb67e", "#e0a100", "#e5654a"][i % 4],
    })),
    signupsByWeek: toSeries(conversions, ["single", "day_pass", "subscription"]),
    retentionByMonth: toSeries(overview.funnel_timeseries || [], ["views", "paywall_hits", "conversions", "exits"]),
    funnel: overview.funnel_timeseries || [],
    content: overview.content_performance || overview.top_content || [],
    couponPoints,
    fallback,
  };
};
const titleize = (s) => String(s || "").replace(/[_-]/g, " ").replace(/\b\w/g, c => c.toUpperCase());

const AnalyticsScreen = ({ data, setData }) => {
  const [selected, setSelected] = React.useState(null);
  const [load, setLoad] = React.useState({ loading: false, error: "" });
  const live = liveAnalyticsView(data.analyticsOverview, data.analyticsSegments, data.paidAnalytics);
  const a = live || data.paidAnalytics;
  const cohorts = live ? (data.analyticsSegments || []) : data.cohorts;
  const recCampaigns = data.adCampaigns || [];

  React.useEffect(() => {
    if (!window.__api?.getConfig?.().live || !setData) return;
    let cancelled = false;
    setLoad({ loading: true, error: "" });
    Promise.allSettled([
      window.__api.read("getAnalyticsOverview", { query: { limit: 25 } }),
      window.__api.read("listAnalyticsSegments", { query: { limit: 50 } }),
    ]).then(([overview, segments]) => {
      if (cancelled) return;
      const patch = {};
      if (overview.status === "fulfilled") patch.analyticsOverview = overview.value;
      if (segments.status === "fulfilled") patch.analyticsSegments = segments.value;
      if (Object.keys(patch).length) setData(d => ({ ...d, ...patch }));
      const failed = [overview, segments].filter(r => r.status === "rejected");
      setLoad({ loading: false, error: failed.length ? failed[0].reason?.message || "Analytics failed to load" : "" });
    });
    return () => { cancelled = true; };
  }, [setData]);

  if (selected) {
    const c = cohorts.find(x => x.id === selected);
    if (c && c.pages && c.pages.length) return <CohortDetail cohort={c} onBack={() => setSelected(null)}/>;
  }

  return (
    <Screen>
      <PageHead icon={IconActivity} title="Advanced Analytics"
        subtitle="Paid-subscriber performance and AI-aggregated audience cohorts."
        actions={<Pill tone={load.loading ? "neutral" : "accent"} style={{ whiteSpace: "nowrap" }}>{load.loading ? "Loading" : "Paid audience"}</Pill>}/>

      {load.error && (
        <Card>
          <div style={{ display: "flex", alignItems: "center", gap: 10, color: "var(--warn)", fontSize: 13 }}>
            <IconInfo size={16}/> {load.error}
          </div>
        </Card>
      )}

      <KpiGrid>
        <StatCard label="Paid subscribers" value={fmt.compact(a.kpis.paidUsers)} delta="+4.8%" deltaTone="good" sub="active" icon={<IconUsers size={16}/>}/>
        <StatCard label="Revenue" value={fmt.currency(a.kpis.mrr)} delta="+6.2%" deltaTone="good" sub="selected range" icon={<IconReceipt size={16}/>}/>
        <StatCard label="ARPU" value={fmt.currency(a.kpis.arpu)} sub="per paid user" icon={<IconCoin size={16}/>}/>
        <StatCard label="Coins granted" value={fmt.compact(a.kpis.coinsGranted || 0)} sub="engagement" icon={<IconGauge size={16}/>}/>
        <StatCard label="Ad impressions" value={fmt.compact(a.kpis.adImpressions || 0)} sub={`${fmt.compact(a.kpis.adClicks || 0)} clicks`} icon={<IconChart size={16}/>}/>
      </KpiGrid>

      <div className="pw-an-charts">
        <Card title="Conversion trend" subtitle="Weekly paid access events">
          {a.revenueByDay && a.revenueByDay.length
            ? <LineChart data={a.revenueByDay} height={210} curve="monotone" showArea showGrid showYAxis
                formatValue={(v) => fmt.number(v)} axisLabels={["Start", "", "Now"]}/>
            : <EmptyState icon={<IconChart size={30}/>} title="No conversion events yet" description="Conversion activity will appear after readers hit paywalls or purchase access."/>}
        </Card>
        <Card title="Paid users by plan" subtitle="Active mix">
          <div style={{ display: "flex", justifyContent: "center", padding: "4px 0" }}>
            <DonutChart data={a.paidByPlan} size={168} thickness={20}
              centerValue={fmt.compact(a.paidByPlan.reduce((s, d) => s + d.value, 0))} centerLabel="paid"/>
          </div>
        </Card>
      </div>

      <Card title="Recommendation ads" subtitle="First-party native units powered by the optional SDK extension." padded={false}>
        {recCampaigns.length ? <DataTable rows={recCampaigns} keyField="campaign_id" density="compact"
          columns={[
            { key: "name", label: "Campaign", render: r => <div><div style={{ fontWeight: 600 }}>{r.name}</div><div style={{ fontSize: 11.5, color: "var(--muted)" }}>{String(r.pricing_model).toUpperCase()} · ${r.bid_amount}</div></div> },
            { key: "impressions", label: "Impressions", align: "right", render: r => fmt.compact(Number(r.impressions || 0)) },
            { key: "clicks", label: "Clicks", align: "right", render: r => fmt.compact(Number(r.clicks || 0)) },
            { key: "ctr", label: "CTR", align: "right", render: r => ((Number(r.clicks || 0) / Math.max(1, Number(r.impressions || 0))) * 100).toFixed(2) + "%" },
            { key: "spend", label: "Est. spend", align: "right", render: r => fmt.currency(Number(r.spend || 0)) },
          ]}/> : <EmptyState icon={<IconAd size={30}/>} title="No recommendation campaigns yet" description="Campaign performance appears here after native units start serving."/>}
      </Card>

      <div className="pw-an-charts2">
        <Card title="New paid signups" subtitle="Weekly">
          <BarChart2 data={a.signupsByWeek} height={180} showYAxis showGrid color="var(--accent)"/>
        </Card>
        <Card title="Funnel events" subtitle="Views, paywall hits, conversions and exits">
          <BarChart2 data={a.retentionByMonth} height={180} showYAxis showGrid color="#0fb67e" formatValue={(v) => fmt.number(v)}/>
        </Card>
      </div>

      <div className="pw-an-charts2">
        <Card title="Coupon and points performance" subtitle="Reveals, redemptions and wallet activity">
          <div className="pw-an-mini">
            <MiniStat label="Coupons revealed" value={fmt.compact(a.couponPoints?.coupons_revealed || 0)}/>
            <MiniStat label="Coupons redeemed" value={fmt.compact(a.couponPoints?.coupons_redeemed || 0)}/>
            <MiniStat label="Coins spent" value={fmt.compact(a.couponPoints?.coins_spent || 0)}/>
            <MiniStat label="Wallet balance" value={fmt.compact(a.couponPoints?.wallet_balances || 0)}/>
          </div>
        </Card>
        <Card title="Top content" subtitle="Views, paid views, conversion and revenue" padded={false}>
          <DataTable rows={a.content || []} keyField="content_id" density="compact" defaultSort={{ key: "views", dir: "desc" }}
            columns={[
              { key: "title", label: "Content", render: r => <span style={{ fontSize: 13.5, color: "var(--ink)" }}>{r.title || r.content_id}</span> },
              { key: "views", label: "Views", align: "right", render: r => <span style={{ fontFamily: "var(--mono)", fontSize: 12.5 }}>{fmt.compact(r.views || 0)}</span> },
              { key: "paid_views", label: "Paid", align: "right", render: r => <span style={{ fontFamily: "var(--mono)", fontSize: 12.5 }}>{fmt.compact(r.paid_views || 0)}</span> },
              { key: "conversion_rate", label: "Conv.", align: "right", render: r => <span style={{ fontFamily: "var(--mono)", fontSize: 12.5 }}>{Number(r.conversion_rate || 0)}%</span> },
              { key: "revenue", label: "Revenue", align: "right", render: r => <span style={{ fontFamily: "var(--mono)", fontSize: 12.5 }}>{fmt.currency(r.revenue || 0)}</span> },
            ]}/>
        </Card>
      </div>

      <Card title="AI audience cohorts" padded={false}
        subtitle="Privacy-preserving segments inferred from consumption — no individual is identifiable."
        action={<Pill tone="accent"><span style={{ display: "inline-flex", alignItems: "center", gap: 5 }}><IconBolt size={12}/> AI</span></Pill>}>
        {(cohorts || []).length ? <DataTable rows={cohorts} keyField="id" onRowClick={(r) => r.pages?.length && setSelected(r.id)} defaultSort={{ key: "users", dir: "desc" }}
          columns={[
            { key: "persona", label: "Cohort", sortable: false, render: r => <PersonaCells persona={r.persona}/> },
            { key: "topic", label: "Consumes", render: r => <span style={{ fontSize: 13.5, color: "var(--ink)" }}>{r.topic}</span> },
            { key: "users", label: "Users", align: "right", render: r => <span style={{ fontFamily: "var(--mono)", fontSize: 13, fontWeight: 600 }}>{fmtUsers(r.users)}</span> },
            { key: "share", label: "Share", w: 130, sortable: false, render: r => (
              <div style={{ display: "flex", alignItems: "center", gap: 8 }}>
                <div style={{ flex: 1, height: 6, borderRadius: 999, background: "var(--line-2)", overflow: "hidden", minWidth: 40 }}>
                  <div style={{ width: `${Math.round(r.share * 100)}%`, height: "100%", background: "var(--accent)" }}/>
                </div>
                <span style={{ fontFamily: "var(--mono)", fontSize: 11.5, color: "var(--muted)" }}>{Math.round(r.share * 100)}%</span>
              </div>) },
            { key: "arpu", label: "ARPU", align: "right", render: r => <span style={{ fontFamily: "var(--mono)", fontSize: 12.5 }}>{fmt.currency(r.arpu)}</span> },
            { key: "retention", label: "Retention", align: "right", render: r => <span style={{ fontFamily: "var(--mono)", fontSize: 12.5 }}>{Math.round(r.retention * 100)}%</span> },
            { key: "trendPct", label: "Trend", align: "right", render: r => <span style={{ color: "var(--good)", fontSize: 12.5, fontWeight: 500 }}>↑ {r.trendPct}%</span> },
            { key: "_v", label: "", sortable: false, align: "right", render: () => <IconChevR size={14} style={{ color: "var(--muted-2)" }}/> },
          ]}/> : <EmptyState icon={<IconUsers size={30}/>} title="No targetable cohorts yet" description="Segments appear once enough consent-safe activity is available above the privacy threshold."/>}
      </Card>

      <style>{`
        .pw-an-charts { display: grid; grid-template-columns: 2fr 1fr; gap: var(--gap); }
        .pw-an-charts > * { min-width: 0; }
        .pw-an-charts2 { display: grid; grid-template-columns: 1fr 1fr; gap: var(--gap); }
        .pw-an-charts2 > * { min-width: 0; }
        @media (max-width: 1023px) { .pw-an-charts, .pw-an-charts2 { grid-template-columns: 1fr; } }
        .pw-persona { display: flex; flex-direction: column; }
        .pw-persona-main { font-size: 13.5px; font-weight: 600; color: var(--ink); }
        .pw-an-mini { display: grid; grid-template-columns: repeat(4, 1fr); gap: 18px; }
        @media (max-width: 760px) { .pw-an-mini { grid-template-columns: repeat(2, 1fr); } }
      `}</style>
    </Screen>
  );
};

Object.assign(window, { AnalyticsScreen, CohortDetail });
