/* global React, Icon, UI, DATA */
const { useState: useMiscState } = React;

// ============================ Connectors ============================
function Connectors({ navigate, toast }) {
  const { StatusBadge, Button } = UI;
  const D = DATA;
  const [connectModal, setConnectModal] = useMiscState(null);
  const connected = D.connectorCatalog.filter((c) => c.status === "connected" || c.status === "expired");
  const available = D.connectorCatalog.filter((c) => c.status === "disconnected");

  const Card = ({ c }) => (
    <div className="card card-pad" style={{ display: "flex", flexDirection: "column", gap: 14 }}>
      <div style={{ display: "flex", alignItems: "flex-start", justifyContent: "space-between" }}>
        <div style={{ display: "flex", gap: 12, alignItems: "center" }}>
          <div style={{ width: 42, height: 42, borderRadius: 10, background: "var(--ef-bone-2)", border: "1px solid var(--ef-border)", display: "flex", alignItems: "center", justifyContent: "center" }}><Icon name={c.icon} size={22} color="var(--ef-fg-2)" /></div>
          <div><div style={{ fontWeight: 700, color: "var(--ef-fg-1)", fontSize: 15 }}>{c.name}</div><div className="muted" style={{ fontSize: 12 }}>{c.provider} · {c.type}</div></div>
        </div>
        <StatusBadge status={c.status} />
      </div>
      <p className="muted" style={{ fontSize: 13, lineHeight: 1.45, flex: 1 }}>{c.desc}</p>
      {c.lastSync && <div className="muted" style={{ fontSize: 11.5 }}>Last sync {D.fmtAgo(c.lastSync)}</div>}
      <div style={{ display: "flex", gap: 8 }}>
        {c.status === "connected" && <><Button variant="secondary" size="sm" onClick={() => toast("Connection healthy", "success")}>Test</Button><Button variant="ghost" size="sm" onClick={() => toast("Disconnected", "info")}>Disconnect</Button></>}
        {c.status === "expired" && <Button variant="accent" size="sm" icon="refresh-cw" onClick={() => setConnectModal(c)}>Reauthorize</Button>}
        {c.status === "disconnected" && <Button variant="secondary" size="sm" icon="link" onClick={() => setConnectModal(c)}>Connect</Button>}
      </div>
    </div>
  );

  return (
    <div className="app-scroll"><div className="page fade-in">
      <UI.PageHeader title="Connectors" subtitle="Connect the sources documents arrive from and the destinations outputs are delivered to. Credentials are encrypted and scoped to this workspace." />

      <div className="card" style={{ padding: "14px 18px", marginBottom: 24, borderColor: "var(--ef-danger)", background: "#FCF0F0", display: "flex", gap: 12, alignItems: "center" }}>
        <Icon name="alert-triangle" size={19} color="var(--ef-danger)" />
        <div style={{ flex: 1, fontSize: 13.5, color: "var(--ef-fg-1)", fontWeight: 600 }}>Google Drive authorization expired — 1 active workflow uploads to it.</div>
        <Button variant="secondary" size="sm" onClick={() => setConnectModal(D.connectorCatalog.find((c) => c.id === "c_gdrive"))}>Reconnect</Button>
      </div>

      <div className="eyebrow" style={{ marginBottom: 14 }}>Connected · {connected.length}</div>
      <div style={{ display: "grid", gridTemplateColumns: "repeat(auto-fill, minmax(300px, 1fr))", gap: 16, marginBottom: 30 }}>{connected.map((c) => <Card key={c.id} c={c} />)}</div>

      <div className="eyebrow" style={{ marginBottom: 14 }}>Available</div>
      <div style={{ display: "grid", gridTemplateColumns: "repeat(auto-fill, minmax(300px, 1fr))", gap: 16 }}>{available.map((c) => <Card key={c.id} c={c} />)}</div>

      {connectModal && (
        <UI.Modal title={`Connect ${connectModal.name}`} subtitle="You'll be redirected to authorize access with least-privilege scopes." onClose={() => setConnectModal(null)}
          footer={<><UI.Button variant="ghost" onClick={() => setConnectModal(null)}>Cancel</UI.Button><UI.Button variant="primary" icon="lock" onClick={() => { setConnectModal(null); toast(`${connectModal.name} connected`, "success"); }}>Authorize {connectModal.name}</UI.Button></>}>
          <div className="card card-pad" style={{ background: "var(--ef-bone-2)" }}>
            <div className="eyebrow" style={{ marginBottom: 10 }}>Requested scopes</div>
            {connectModal.scopes.map((s) => <div key={s} style={{ display: "flex", gap: 9, alignItems: "center", padding: "4px 0", fontSize: 13 }}><Icon name="shield-check" size={15} color="var(--ef-success)" /><span className="mono" style={{ color: "var(--ef-fg-1)" }}>{s}</span></div>)}
          </div>
          <p className="muted" style={{ fontSize: 12.5, marginTop: 14, lineHeight: 1.5 }}>Tokens are encrypted at rest, never shown after entry, and can be revoked anytime.</p>
        </UI.Modal>
      )}
    </div></div>
  );
}

// ============================ Documents ============================
function Documents({ toast }) {
  const D = DATA;
  const [tab, setTab] = useMiscState("documents");
  const items = tab === "documents" ? D.documents : D.artifacts;
  return (
    <div className="app-scroll"><div className="page fade-in">
      <UI.PageHeader title="Documents & files" subtitle="Every document ingested and every artifact generated, scoped to this workspace with short-lived signed download links." actions={<UI.Button variant="primary" icon="upload-cloud" onClick={() => toast("Upload dialog", "info")}>Upload</UI.Button>} />
      <div style={{ marginBottom: 18 }}><UI.Tabs tabs={[{ id: "documents", label: "Documents", count: D.documents.length }, { id: "outputs", label: "Generated outputs", count: D.artifacts.length }]} active={tab} onChange={setTab} /></div>
      <div className="card" style={{ overflow: "hidden" }}>
        <table className="tbl">
          <thead><tr><th>File</th><th>Type</th><th>Project</th><th>{tab === "documents" ? "Source" : "From run"}</th><th style={{ textAlign: "right" }}>{tab === "documents" ? "Pages" : "Size"}</th><th style={{ textAlign: "right" }}>Created</th><th></th></tr></thead>
          <tbody>{items.map((f) => (
            <tr key={f.id} className="tbl-row">
              <td><div style={{ display: "flex", gap: 10, alignItems: "center" }}><Icon name={fIcon(f.type)} size={17} color="var(--ef-fg-3)" /><span className="mono" style={{ fontSize: 12.5, fontWeight: 600, color: "var(--ef-fg-1)" }}>{f.name}</span>{f.count && <span className="badge" style={{ fontSize: 10 }}>{f.count}</span>}</div></td>
              <td><span className="badge">{f.type}</span></td><td className="muted" style={{ fontSize: 13 }}>{f.project}</td>
              <td className="muted" style={{ fontSize: 12.5 }}>{tab === "documents" ? f.source : <span className="mono">{f.exec}</span>}</td>
              <td style={{ textAlign: "right", fontSize: 12.5 }} className="tabular muted">{tab === "documents" ? f.pages : f.size}</td>
              <td style={{ textAlign: "right", fontSize: 12 }} className="muted mono">{D.fmtAgo(f.created)}</td>
              <td><button className="btn btn-ghost btn-icon btn-sm" onClick={() => toast("Download started", "success")}><Icon name="download" size={15} /></button></td>
            </tr>
          ))}</tbody>
        </table>
      </div>
    </div></div>
  );
}
function fIcon(t) { return ({ CSV: "file-spreadsheet", Excel: "file-spreadsheet", Word: "file-text", PDF: "file-text", Archive: "package", JSON: "file-json" })[t] || "file-text"; }

// ============================ Templates ============================
function TemplatesList({ navigate }) {
  const D = DATA;
  return (
    <div className="app-scroll"><div className="page fade-in">
      <UI.PageHeader title="Templates" subtitle="Saved configurations that let recurring documents process automatically. Each change creates a new version; past executions stay tied to the version they used." />
      <div style={{ display: "grid", gridTemplateColumns: "repeat(auto-fill, minmax(340px, 1fr))", gap: 16 }}>
        {D.templates.map((t) => (
          <div key={t.id} className="card card-pad card-hover" onClick={() => navigate("template", { id: t.id })}>
            <div style={{ display: "flex", justifyContent: "space-between", alignItems: "flex-start", marginBottom: 12 }}>
              <div style={{ display: "flex", gap: 11, alignItems: "center" }}><div style={{ width: 38, height: 38, borderRadius: 9, background: "var(--ef-bone-2)", border: "1px solid var(--ef-border)", display: "flex", alignItems: "center", justifyContent: "center" }}><Icon name="layers" size={19} color="var(--ef-fg-3)" /></div>
                <div><div style={{ fontWeight: 700, color: "var(--ef-fg-1)" }}>{t.name}</div><div className="muted" style={{ fontSize: 12 }}>{t.docType}</div></div></div>
              <UI.StatusBadge status={t.status} size="sm" />
            </div>
            <div className="muted" style={{ fontSize: 12.5, marginBottom: 14 }}>{t.project}</div>
            <div style={{ display: "flex", gap: 20 }}>
              <Mini label="Version" v={t.version} /><Mini label="Selected" v={`${t.selected}/${t.fields}`} /><Mini label="Match" v={Math.round(t.matchThreshold * 100) + "%"} />
            </div>
          </div>
        ))}
      </div>
    </div></div>
  );
}
function Mini({ label, v }) { return <div><div style={{ fontSize: 19, fontWeight: 800, color: "var(--ef-fg-1)", letterSpacing: "-0.02em" }} className="tabular">{v}</div><div className="muted" style={{ fontSize: 11 }}>{label}</div></div>; }

// ============================ Team ============================
function Team({ toast }) {
  const { Avatar, StatusBadge, Button } = UI;
  const D = DATA;
  const [invite, setInvite] = useMiscState(false);
  return (
    <div className="app-scroll"><div className="page fade-in">
      <UI.PageHeader title="Team" subtitle="Manage who can build, run, review, and administer in this workspace. Permissions are enforced on every action." actions={<Button variant="primary" icon="user-plus" onClick={() => setInvite(true)}>Invite member</Button>} />
      <div className="card" style={{ overflow: "hidden" }}>
        <table className="tbl">
          <thead><tr><th>Member</th><th>Role</th><th>Status</th><th>Last active</th><th></th></tr></thead>
          <tbody>{D.team.map((u) => (
            <tr key={u.id}>
              <td><div style={{ display: "flex", gap: 12, alignItems: "center" }}><Avatar name={u.name} size={34} /><div><div style={{ fontWeight: 700, color: "var(--ef-fg-1)", fontSize: 13.5 }}>{u.name}</div><div className="muted" style={{ fontSize: 12 }}>{u.email}</div></div></div></td>
              <td><span className="badge">{u.role}</span></td>
              <td>{u.status === "active" ? <StatusBadge status="active" /> : <span className="badge badge-solid" style={{ background: "var(--ef-beam-100)", color: "var(--ef-beam-700)" }}>Invited</span>}</td>
              <td className="muted mono" style={{ fontSize: 12 }}>{u.lastActive ? D.fmtAgo(u.lastActive) : "—"}</td>
              <td><button className="btn btn-ghost btn-icon btn-sm"><Icon name="more-horizontal" size={16} /></button></td>
            </tr>
          ))}</tbody>
        </table>
      </div>
      {invite && (
        <UI.Modal title="Invite team members" subtitle="They'll receive an email to join this workspace." onClose={() => setInvite(false)}
          footer={<><UI.Button variant="ghost" onClick={() => setInvite(false)}>Cancel</UI.Button><UI.Button variant="primary" icon="send" onClick={() => { setInvite(false); toast("Invitation sent", "success"); }}>Send invitation</UI.Button></>}>
          <UI.Field label="Email addresses" help="Separate multiple emails with commas."><input className="input" placeholder="teammate@company.com" autoFocus /></UI.Field>
          <UI.Field label="Role"><select className="select">{["Workspace Admin", "Project Admin", "Workflow Builder", "Operator", "Reviewer", "Viewer", "Billing Admin"].map((r) => <option key={r}>{r}</option>)}</select></UI.Field>
        </UI.Modal>
      )}
    </div></div>
  );
}

// ============================ Billing ============================
function Billing({ toast }) {
  const D = DATA, u = D.usage;
  const plans = [
    { name: "Starter", price: "$0", feats: ["File upload input", "Basic processing", "Limited executions", "1 GB storage"] },
    { name: "Professional", price: "$249", feats: ["Gmail & Drive connectors", "Marketplace workflows", "10,000 executions", "50 GB storage"], current: true },
    { name: "Enterprise", price: "Custom", feats: ["SSO & SCIM", "Advanced permissions", "Audit retention", "Custom limits & support"] },
  ];
  return (
    <div className="app-scroll"><div className="page fade-in">
      <UI.PageHeader title="Billing & usage" subtitle="Track documents, pages, AI tokens, and storage consumed this month, and manage your plan." actions={<UI.Button variant="secondary" icon="download" onClick={() => toast("Invoice downloaded", "success")}>Invoices</UI.Button>} />

      <div style={{ display: "grid", gridTemplateColumns: "1.5fr 1fr", gap: 22, alignItems: "start" }}>
        <div className="card card-pad">
          <div style={{ display: "flex", justifyContent: "space-between", alignItems: "center", marginBottom: 20 }}>
            <h6 style={{ fontSize: 15 }}>Usage this month</h6><span className="badge badge-solid" style={{ background: "var(--ef-ink-950)", color: "var(--ef-bone)" }}>{u.plan} plan</span>
          </div>
          {[["Documents processed", u.documents], ["Pages processed", u.pages], ["AI tokens", u.tokens], ["Storage", u.storage], ["Executions", u.executions]].map(([label, d]) => {
            const pct = d.used / d.limit; const fmt = (n) => d.unit ? n + d.unit : n.toLocaleString();
            return <div key={label} style={{ marginBottom: 16 }}>
              <div style={{ display: "flex", justifyContent: "space-between", fontSize: 13, marginBottom: 6 }}><span className="muted" style={{ fontWeight: 600 }}>{label}</span><span className="mono tabular" style={{ fontWeight: 600, color: "var(--ef-fg-1)" }}>{fmt(d.used)} <span className="muted">/ {fmt(d.limit)}</span></span></div>
              <div className="prog"><span style={{ width: Math.min(100, pct * 100) + "%", background: pct > 0.8 ? "var(--ef-warning)" : "var(--ef-ink-950)" }} /></div>
            </div>;
          })}
        </div>
        <div className="card card-pad">
          <h6 style={{ fontSize: 15, marginBottom: 18 }}>Executions trend</h6>
          <div style={{ display: "flex", alignItems: "flex-end", gap: 6, height: 130 }}>
            {u.monthlyTrend.map((v, i) => <div key={i} style={{ flex: 1, height: (v / 83 * 100) + "%", background: i === u.monthlyTrend.length - 1 ? "var(--ef-beam-500)" : "var(--ef-ink-200)", borderRadius: "3px 3px 0 0", minHeight: 4 }} title={v * 35 + " runs"} />)}
          </div>
          <div className="muted" style={{ fontSize: 11.5, marginTop: 10, textAlign: "center" }}>Last 12 months · 2,937 this month</div>
        </div>
      </div>

      <h5 style={{ fontSize: 17, margin: "32px 0 14px" }}>Plans</h5>
      <div style={{ display: "grid", gridTemplateColumns: "repeat(3, 1fr)", gap: 16 }}>
        {plans.map((p) => (
          <div key={p.name} className="card card-pad" style={{ borderColor: p.current ? "var(--ef-ink-950)" : "var(--ef-border)", borderWidth: p.current ? 1.5 : 1 }}>
            <div style={{ display: "flex", justifyContent: "space-between", alignItems: "center" }}><h6 style={{ fontSize: 16 }}>{p.name}</h6>{p.current && <span className="badge badge-solid" style={{ background: "var(--ef-beam-500)", color: "var(--ef-ink-950)" }}>Current</span>}</div>
            <div style={{ margin: "12px 0 16px" }}><span style={{ fontSize: 30, fontWeight: 800, letterSpacing: "-0.03em", color: "var(--ef-fg-1)" }}>{p.price}</span>{p.price !== "Custom" && <span className="muted" style={{ fontSize: 13 }}> / month</span>}</div>
            {p.feats.map((f) => <div key={f} style={{ display: "flex", gap: 9, alignItems: "center", padding: "5px 0", fontSize: 13, color: "var(--ef-fg-2)" }}><Icon name="check" size={15} color="var(--ef-success)" />{f}</div>)}
            <UI.Button variant={p.current ? "secondary" : "primary"} size="sm" style={{ width: "100%", marginTop: 16 }} disabled={p.current} onClick={() => toast("Plan change requested", "info")}>{p.current ? "Current plan" : p.name === "Enterprise" ? "Contact sales" : "Upgrade"}</UI.Button>
          </div>
        ))}
      </div>
    </div></div>
  );
}

// ============================ Activity logs ============================
function ActivityLogs() {
  const D = DATA;
  const [type, setType] = useMiscState("all");
  const types = ["all", "execution", "workflow", "connector", "team", "template", "artifact", "project"];
  const icon = { execution: "activity", workflow: "git-branch", connector: "link", team: "users", template: "layers", artifact: "download", project: "folder" };
  let list = D.audit.filter((a) => type === "all" || a.type === type);
  return (
    <div className="app-scroll"><div className="page fade-in">
      <UI.PageHeader title="Activity logs" subtitle="An append-only record of security-sensitive actions across the workspace." />
      <div style={{ display: "flex", gap: 8, flexWrap: "wrap", marginBottom: 18 }}>
        {types.map((t) => <button key={t} className={`chip ${type === t ? "selected" : ""}`} onClick={() => setType(t)} style={{ textTransform: "capitalize" }}>{t}</button>)}
      </div>
      <div className="card" style={{ overflow: "hidden" }}>
        {list.map((a, i) => (
          <div key={a.id} style={{ display: "flex", gap: 14, padding: "13px 18px", borderTop: i ? "1px solid var(--ef-border)" : 0, alignItems: "center" }}>
            <div style={{ width: 34, height: 34, borderRadius: 8, background: "var(--ef-bone-2)", display: "flex", alignItems: "center", justifyContent: "center", flexShrink: 0 }}><Icon name={icon[a.type] || "shield"} size={16} color="var(--ef-fg-3)" /></div>
            <div style={{ flex: 1, minWidth: 0 }}><div style={{ fontSize: 13.5, color: "var(--ef-fg-1)", fontWeight: 600 }}>{a.action}</div><div className="muted" style={{ fontSize: 12 }}><span style={{ fontWeight: 600 }}>{a.actor}</span> · <span className="mono">{a.resource}</span></div></div>
            <span className="muted mono" style={{ fontSize: 12 }}>{D.fmtAgo(a.time)}</span>
          </div>
        ))}
      </div>
    </div></div>
  );
}

// ============================ Settings ============================
function Settings({ toast }) {
  const D = DATA;
  const [tab, setTab] = useMiscState("general");
  return (
    <div className="app-scroll"><div className="page fade-in">
      <UI.PageHeader title="Settings" subtitle="Workspace configuration, security, and data governance." />
      <div style={{ marginBottom: 22 }}><UI.Tabs tabs={[{ id: "general", label: "General" }, { id: "security", label: "Security" }, { id: "data", label: "Data & compliance" }]} active={tab} onChange={setTab} /></div>
      <div style={{ maxWidth: 680 }}>
        {tab === "general" && (
          <div className="card card-pad">
            <UI.Field label="Workspace name"><input className="input" defaultValue={D.workspace.name} /></UI.Field>
            <UI.Field label="Industry"><select className="select" defaultValue={D.workspace.industry} style={{ maxWidth: 300 }}>{D.onboarding.industries.map((i) => <option key={i}>{i}</option>)}</select></UI.Field>
            <UI.Field label="Default time zone"><select className="select" style={{ maxWidth: 300 }}><option>Asia/Dhaka (GMT+6)</option><option>UTC</option><option>America/New_York</option></select></UI.Field>
            <UI.Button variant="primary" icon="save" onClick={() => toast("Settings saved", "success")}>Save changes</UI.Button>
          </div>
        )}
        {tab === "security" && (
          <div style={{ display: "flex", flexDirection: "column", gap: 16 }}>
            {[["Encryption at rest", "All documents, artifacts, and connector credentials are encrypted.", true, true], ["Encryption in transit", "TLS 1.2+ on all connections.", true, true], ["Workspace isolation", "Records and storage are partitioned per workspace.", true, true], ["Audit logging", "Security-sensitive actions are recorded.", true, false]].map(([t, s, on, locked]) => (
              <div key={t} className="card card-pad" style={{ display: "flex", alignItems: "center", gap: 14 }}>
                <Icon name="shield-check" size={20} color="var(--ef-success)" />
                <div style={{ flex: 1 }}><div style={{ fontWeight: 700, color: "var(--ef-fg-1)", fontSize: 14 }}>{t}</div><div className="muted" style={{ fontSize: 12.5 }}>{s}</div></div>
                {locked ? <span className="badge badge-solid" style={{ background: "#E7F2EA", color: "var(--ef-success)" }}><Icon name="lock" size={11} color="var(--ef-success)" />Enforced</span> : <UI.Toggle checked={on} onChange={() => {}} />}
              </div>
            ))}
            <div className="card card-pad" style={{ display: "flex", alignItems: "center", gap: 14, opacity: 0.7 }}>
              <Icon name="key" size={20} color="var(--ef-fg-3)" />
              <div style={{ flex: 1 }}><div style={{ fontWeight: 700, color: "var(--ef-fg-1)", fontSize: 14 }}>Single sign-on (SAML / OIDC)</div><div className="muted" style={{ fontSize: 12.5 }}>Available on the Enterprise plan.</div></div>
              <span className="badge">Enterprise</span>
            </div>
          </div>
        )}
        {tab === "data" && (
          <div className="card card-pad">
            <UI.Field label="Default document retention" help="Applies to projects without their own retention setting."><select className="select" style={{ maxWidth: 240 }}><option>90 days</option><option>30 days</option><option>1 year</option><option>Keep indefinitely</option></select></UI.Field>
            <UI.Field label="PII handling" help="Sensitive values are redacted from logs."><div className="badge badge-solid" style={{ background: "#E7F2EA", color: "var(--ef-success)" }}><Icon name="check" size={12} color="var(--ef-success)" />Redaction enabled</div></UI.Field>
            <div className="divider" style={{ margin: "8px 0 18px" }} />
            <div style={{ display: "flex", gap: 10 }}>
              <UI.Button variant="secondary" icon="download" onClick={() => toast("Export requested", "info")}>Export workspace data</UI.Button>
              <UI.Button variant="danger" icon="trash-2">Delete workspace</UI.Button>
            </div>
          </div>
        )}
      </div>
    </div></div>
  );
}

Object.assign(window, { Connectors, Documents, TemplatesList, Team, Billing, ActivityLogs, Settings });
