const { useState, useEffect } = React;

// Campaign ids are only unique per gophish instance, so a campaign is keyed by
// (serverId, id) across all of a company's servers.
const keyOf = (c) => `${c.serverId}:${c.id}`;

function Portal({ client, campaigns, degraded, loadCampaign, onLogout, adminBack, onProfile }) {
  const [activeKey, setActiveKey] = useState(campaigns[0] ? keyOf(campaigns[0]) : null);
  const [details, setDetails] = useState({}); // "serverId:id" -> aggregated campaign
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState("");
  const [menu, setMenu] = useState(false);

  const activeSummary = campaigns.find((c) => keyOf(c) === activeKey) || null;
  const multiServer = new Set(campaigns.map((c) => c.serverId)).size > 1;

  // Load (and cache) the aggregated detail for the selected campaign.
  useEffect(() => {
    if (!activeSummary || details[activeKey]) return;
    let cancelled = false;
    setLoading(true);
    setError("");
    loadCampaign(activeSummary.serverId, activeSummary.id)
      .then((c) => { if (!cancelled) setDetails((d) => ({ ...d, [activeKey]: c })); })
      .catch(() => { if (!cancelled) setError("Kampagnendaten konnten nicht geladen werden."); })
      .finally(() => { if (!cancelled) setLoading(false); });
    return () => { cancelled = true; };
  }, [activeKey, activeSummary, details, loadCampaign]);

  useEffect(() => { if (window.lucide) window.lucide.createIcons(); }, [activeKey, menu, loading, details]);

  const initials = (client.ciso || "?").split(" ").map((w) => w[0]).slice(-2).join("");
  const active = activeKey != null ? details[activeKey] : null;

  return (
    <div style={{ minHeight: "100vh", background: "var(--dv-slate-50)" }}>
      {/* Kopfzeile */}
      <header style={{ background: "var(--dv-navy)", color: "#fff", position: "sticky", top: 0, zIndex: 20 }}>
        <div style={{ maxWidth: 1180, margin: "0 auto", padding: "0 24px", height: 62, display: "flex", alignItems: "center", justifyContent: "space-between" }}>
          <div style={{ display: "flex", alignItems: "center", gap: 12 }}>
            <img src="./assets/logo-datavise-white.svg" alt="Datavise" style={{ height: 26 }} />
            <span style={{ width: 1, height: 20, background: "rgba(255,255,255,.22)" }}></span>
            <span style={{ fontSize: 14.5, fontWeight: 700, letterSpacing: "-0.01em" }}>Awareness Portal{adminBack ? ` · ${client.name}` : ""}</span>
          </div>
          <div style={{ display: "flex", alignItems: "center", gap: 18 }}>
            {adminBack && (<>
              <span style={{ display: "inline-flex", alignItems: "center", gap: 7, fontSize: 12, fontWeight: 700, color: "#7ff0c4", background: "rgba(0,208,132,.15)", padding: "4px 12px", borderRadius: 9999 }}>
                <i data-lucide="eye" style={{ width: 13, height: 13 }}></i> Admin-Vorschau
              </span>
              <button onClick={adminBack} style={{ display: "inline-flex", alignItems: "center", gap: 7, background: "transparent", border: "1px solid rgba(255,255,255,.25)", color: "#fff", fontFamily: "var(--dv-font-sans)", fontWeight: 600, fontSize: 13, padding: "7px 14px", borderRadius: 9999, cursor: "pointer" }}>
                <i data-lucide="arrow-left" style={{ width: 15, height: 15 }}></i> Zurück zur Verwaltung
              </button>
            </>)}
            {!adminBack && (<>
            <span style={{ display: "inline-flex", alignItems: "center", gap: 7, fontSize: 12, color: "#7ff0c4", fontFamily: "var(--dv-font-mono)" }}>
              <i data-lucide="lock" style={{ width: 13, height: 13 }}></i> Verschlüsselte Sitzung
            </span>
            <div style={{ position: "relative" }}>
              <button onClick={() => setMenu((m) => !m)} style={{ display: "flex", alignItems: "center", gap: 10, background: "transparent", border: "none", cursor: "pointer", color: "#fff", fontFamily: "var(--dv-font-sans)" }}>
                <span style={{ width: 34, height: 34, borderRadius: "50%", background: "var(--dv-green)", color: "#06241a", fontWeight: 700, fontSize: 13, display: "flex", alignItems: "center", justifyContent: "center" }}>{initials}</span>
                <span style={{ textAlign: "left", lineHeight: 1.25 }}>
                  <span style={{ display: "block", fontSize: 13, fontWeight: 600 }}>{client.ciso}</span>
                  <span style={{ display: "block", fontSize: 11, color: "var(--dv-slate-400)" }}>{client.name}</span>
                </span>
                <i data-lucide="chevron-down" style={{ width: 16, height: 16, color: "var(--dv-slate-400)" }}></i>
              </button>
              {menu && (
                <div style={{ position: "absolute", right: 0, top: 46, background: "#fff", color: "var(--dv-slate-700)", borderRadius: 12, boxShadow: "var(--dv-shadow-dropdown)", minWidth: 230, padding: 8, zIndex: 30 }}>
                  <div style={{ padding: "10px 12px", borderBottom: "1px solid var(--dv-slate-100)", marginBottom: 6 }}>
                    <div style={{ fontSize: 13, fontWeight: 600, color: "var(--dv-navy)" }}>{client.cisoRole}</div>
                    <div style={{ fontSize: 12, color: "var(--dv-fg-subtle)", fontFamily: "var(--dv-font-mono)", marginTop: 2 }}>{client.email}</div>
                  </div>
                  <div style={{ fontSize: 12, color: "var(--dv-fg-subtle)", padding: "4px 12px 8px" }}>Branche: {client.industry}</div>
                  {onProfile && (
                    <button onClick={onProfile} style={{ width: "100%", display: "flex", alignItems: "center", gap: 8, background: "transparent", border: "none", cursor: "pointer", fontFamily: "var(--dv-font-sans)", fontSize: 13.5, fontWeight: 600, color: "var(--dv-slate-700)", padding: "10px 12px", borderRadius: 8 }}>
                      <i data-lucide="user" style={{ width: 15, height: 15 }}></i> Profil
                    </button>
                  )}
                  <button onClick={onLogout} style={{ width: "100%", display: "flex", alignItems: "center", gap: 8, background: "transparent", border: "none", cursor: "pointer", fontFamily: "var(--dv-font-sans)", fontSize: 13.5, fontWeight: 600, color: "var(--dv-danger)", padding: "10px 12px", borderRadius: 8 }}>
                    <i data-lucide="log-out" style={{ width: 15, height: 15 }}></i> Abmelden
                  </button>
                </div>
              )}
            </div>
            </>)}
          </div>
        </div>
      </header>

      {/* DSGVO-Banner */}
      <div style={{ background: "rgba(0,208,132,.10)", borderBottom: "1px solid rgba(0,208,132,.25)" }}>
        <div style={{ maxWidth: 1180, margin: "0 auto", padding: "9px 24px", display: "flex", alignItems: "center", gap: 9, fontSize: 12.5, color: "#0a6e48" }}>
          <i data-lucide="shield-check" style={{ width: 15, height: 15, flex: "none" }}></i>
          <span><b>DSGVO-konform:</b> Alle Ergebnisse werden serverseitig anonymisiert und aggregiert. Eine Zuordnung zu einzelnen Mitarbeitenden ist ausgeschlossen.</span>
        </div>
      </div>

      {degraded && (
        <div style={{ maxWidth: 1180, margin: "0 auto", padding: "12px 24px 0" }}>
          <div style={{ display: "flex", alignItems: "center", gap: 9, background: "var(--dv-warning-bg)", color: "#b45309", fontSize: 12.5, padding: "9px 12px", borderRadius: 8 }}>
            <i data-lucide="alert-triangle" style={{ width: 15, height: 15, flex: "none" }}></i>
            Live-Verbindung zur Kampagnen-Datenquelle derzeit nicht erreichbar.
          </div>
        </div>
      )}

      {/* Kampagnen-Auswahl */}
      <div style={{ maxWidth: 1180, margin: "0 auto", padding: "22px 24px 0" }}>
        <div style={{ fontSize: 11, textTransform: "uppercase", letterSpacing: ".06em", color: "var(--dv-fg-subtle)", fontWeight: 700, marginBottom: 10 }}>Ihre Kampagnen</div>
        {campaigns.length === 0 ? (
          <div style={{ fontSize: 14, color: "var(--dv-fg-muted)" }}>Es liegen noch keine Kampagnen-Ergebnisse vor.</div>
        ) : (
          <div style={{ display: "flex", gap: 10, flexWrap: "wrap" }}>
            {campaigns.map((c) => {
              const on = keyOf(c) === activeKey;
              return (
                <button key={keyOf(c)} onClick={() => setActiveKey(keyOf(c))} style={{ textAlign: "left", cursor: "pointer", fontFamily: "var(--dv-font-sans)", background: on ? "#fff" : "transparent", border: on ? "1px solid var(--dv-navy)" : "1px solid var(--dv-border)", borderRadius: 10, padding: "10px 16px", boxShadow: on ? "var(--dv-shadow-sm)" : "none", transition: "all .2s var(--dv-ease)" }}>
                  <div style={{ display: "flex", alignItems: "center", gap: 8 }}>
                    <span style={{ width: 8, height: 8, borderRadius: "50%", background: c.status === "laufend" ? "var(--dv-green)" : "var(--dv-slate-300)" }}></span>
                    <span style={{ fontSize: 13.5, fontWeight: 600, color: on ? "var(--dv-navy)" : "var(--dv-slate-600)" }}>{c.name}</span>
                  </div>
                  <div style={{ fontFamily: "var(--dv-font-mono)", fontSize: 11, color: "var(--dv-fg-subtle)", marginTop: 4, paddingLeft: 16 }}>{c.start ? c.start.slice(0, 7) : "—"} · {Number(c.sent || 0).toLocaleString("de-DE")} Empfänger{multiServer && c.serverLabel ? ` · ${c.serverLabel}` : ""}</div>
                </button>
              );
            })}
          </div>
        )}
      </div>

      {/* Dashboard */}
      <main style={{ padding: "24px" }}>
        {error ? (
          <div style={{ maxWidth: 1180, margin: "0 auto", display: "flex", alignItems: "center", gap: 9, background: "var(--dv-danger-bg)", color: "#b91c1c", fontSize: 13.5, padding: "12px 14px", borderRadius: 10 }}>
            <i data-lucide="alert-circle" style={{ width: 16, height: 16, flex: "none" }}></i>{error}
          </div>
        ) : active ? (
          <CampaignDashboard campaign={active} />
        ) : campaigns.length > 0 ? (
          <div style={{ display: "flex", justifyContent: "center", padding: "60px 0" }}>
            <div style={{ width: 26, height: 26, border: "3px solid var(--dv-slate-200)", borderTopColor: "var(--dv-green)", borderRadius: "50%", animation: "dv-spin .7s linear infinite" }} />
          </div>
        ) : null}
      </main>
    </div>
  );
}

window.Portal = Portal;
