/* global React */
const { useState, useEffect, useRef } = React;

/* =========================================================================
   DATA FLOW DIAGRAMS — Three metaphors
   1. Pipeline — linear arrows
   2. Perimeter — enclosed boundary box
   3. Orbit — rotating data around core
   ========================================================================= */

function FlowPipeline() {
  return (
    <svg viewBox="0 0 1200 380" style={{ width: "100%", height: "auto" }}>
      <defs>
        <marker id="arr-red" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto">
          <path d="M0,0 L10,5 L0,10 z" fill="#E24B4A" />
        </marker>
        <marker id="arr-teal" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto">
          <path d="M0,0 L10,5 L0,10 z" fill="#00D4AA" />
        </marker>
      </defs>

      {/* Vendor row (top) */}
      <g transform="translate(0, 40)">
        <text x="0" y="-10" fontFamily="JetBrains Mono, monospace" fontSize="11" fill="#E24B4A" letterSpacing="1.2">TYPICAL VENDOR  ·  DATA EXITS</text>

        <g transform="translate(0, 24)">
          <rect width="160" height="80" rx="2" fill="none" stroke="#2A2A2A" />
          <text x="80" y="36" textAnchor="middle" fontFamily="JetBrains Mono, monospace" fontSize="11" fill="#A0A0A0" letterSpacing="0.6">YOUR DATA</text>
          <text x="80" y="56" textAnchor="middle" fontFamily="Geist, sans-serif" fontSize="13" fill="#fff">Customer · Trades · PII</text>
        </g>

        <line x1="170" y1="64" x2="270" y2="64" stroke="#E24B4A" strokeWidth="2" markerEnd="url(#arr-red)" strokeDasharray="6 4" />

        <g transform="translate(280, 24)">
          <rect width="160" height="80" rx="2" fill="none" stroke="#E24B4A" strokeDasharray="3 3" />
          <text x="80" y="36" textAnchor="middle" fontFamily="JetBrains Mono, monospace" fontSize="11" fill="#E24B4A" letterSpacing="0.6">EGRESS</text>
          <text x="80" y="56" textAnchor="middle" fontFamily="Geist, sans-serif" fontSize="13" fill="#fff">API call</text>
        </g>

        <line x1="450" y1="64" x2="550" y2="64" stroke="#E24B4A" strokeWidth="2" markerEnd="url(#arr-red)" strokeDasharray="6 4" />

        <g transform="translate(560, 24)">
          <rect width="180" height="80" rx="2" fill="none" stroke="#2A2A2A" />
          <text x="90" y="36" textAnchor="middle" fontFamily="JetBrains Mono, monospace" fontSize="11" fill="#A0A0A0" letterSpacing="0.6">EXTERNAL LLM</text>
          <text x="90" y="56" textAnchor="middle" fontFamily="Geist, sans-serif" fontSize="13" fill="#fff">Vendor cloud</text>
        </g>

        <line x1="750" y1="64" x2="850" y2="64" stroke="#E24B4A" strokeWidth="2" markerEnd="url(#arr-red)" strokeDasharray="6 4" />

        <g transform="translate(860, 24)">
          <rect width="160" height="80" rx="2" fill="none" stroke="#E24B4A" />
          <text x="80" y="36" textAnchor="middle" fontFamily="JetBrains Mono, monospace" fontSize="11" fill="#E24B4A" letterSpacing="0.6">RESPONSE</text>
          <text x="80" y="56" textAnchor="middle" fontFamily="Geist, sans-serif" fontSize="13" fill="#fff">Data already left</text>
        </g>

        {/* Risk callout */}
        <g transform="translate(1040, 40)">
          <text x="0" y="0" fontFamily="JetBrains Mono, monospace" fontSize="10" fill="#E24B4A" letterSpacing="0.8">RISK</text>
          <text x="0" y="18" fontFamily="Geist, sans-serif" fontSize="13" fill="#A0A0A0">Compliance,</text>
          <text x="0" y="36" fontFamily="Geist, sans-serif" fontSize="13" fill="#A0A0A0">regulators,</text>
          <text x="0" y="54" fontFamily="Geist, sans-serif" fontSize="13" fill="#A0A0A0">data residency</text>
        </g>
      </g>

      <line x1="40" y1="200" x2="1160" y2="200" stroke="#1F1F1F" />

      {/* Doblier row (bottom) */}
      <g transform="translate(0, 240)">
        <text x="0" y="-10" fontFamily="JetBrains Mono, monospace" fontSize="11" fill="#00D4AA" letterSpacing="1.2">DOBLIER · DATA STAYS</text>

        <g transform="translate(0, 24)">
          <rect width="1020" height="100" rx="2" fill="rgba(0,212,170,0.04)" stroke="#00D4AA" />
          <text x="510" y="22" textAnchor="middle" fontFamily="JetBrains Mono, monospace" fontSize="10" fill="#00D4AA" letterSpacing="1.6">YOUR INFRASTRUCTURE</text>

          <g transform="translate(20, 36)">
            <rect width="150" height="50" rx="2" fill="#0a0a0a" stroke="#1F1F1F" />
            <text x="75" y="22" textAnchor="middle" fontFamily="JetBrains Mono, monospace" fontSize="10" fill="#A0A0A0" letterSpacing="0.6">YOUR DATA</text>
            <text x="75" y="40" textAnchor="middle" fontFamily="Geist, sans-serif" fontSize="12" fill="#fff">Stays on-prem</text>
          </g>

          <line x1="180" y1="62" x2="240" y2="62" stroke="#00D4AA" strokeWidth="2" markerEnd="url(#arr-teal)" />

          <g transform="translate(250, 36)">
            <rect width="170" height="50" rx="2" fill="#0a0a0a" stroke="#1F1F1F" />
            <text x="85" y="22" textAnchor="middle" fontFamily="JetBrains Mono, monospace" fontSize="10" fill="#A0A0A0" letterSpacing="0.6">DOBLIER ROUTER</text>
            <text x="85" y="40" textAnchor="middle" fontFamily="Geist, sans-serif" fontSize="12" fill="#fff">Multi-LLM orchestration</text>
          </g>

          <line x1="430" y1="62" x2="490" y2="62" stroke="#00D4AA" strokeWidth="2" markerEnd="url(#arr-teal)" />

          <g transform="translate(500, 36)">
            <rect width="170" height="50" rx="2" fill="#0a0a0a" stroke="#1F1F1F" />
            <text x="85" y="22" textAnchor="middle" fontFamily="JetBrains Mono, monospace" fontSize="10" fill="#A0A0A0" letterSpacing="0.6">PRIVATE LLM</text>
            <text x="85" y="40" textAnchor="middle" fontFamily="Geist, sans-serif" fontSize="12" fill="#fff">Frontier · GPU pool</text>
          </g>

          <line x1="680" y1="62" x2="740" y2="62" stroke="#00D4AA" strokeWidth="2" markerEnd="url(#arr-teal)" />

          <g transform="translate(750, 36)">
            <rect width="250" height="50" rx="2" fill="#0a0a0a" stroke="#1F1F1F" />
            <text x="125" y="22" textAnchor="middle" fontFamily="JetBrains Mono, monospace" fontSize="10" fill="#A0A0A0" letterSpacing="0.6">RESPONSE  ·  ZERO EGRESS</text>
            <text x="125" y="40" textAnchor="middle" fontFamily="Geist, sans-serif" fontSize="12" fill="#fff">Production-ready output</text>
          </g>
        </g>

        <g transform="translate(1040, 40)">
          <text x="0" y="0" fontFamily="JetBrains Mono, monospace" fontSize="10" fill="#00D4AA" letterSpacing="0.8">RESULT</text>
          <text x="0" y="18" fontFamily="Geist, sans-serif" fontSize="13" fill="#A0A0A0">Sovereign,</text>
          <text x="0" y="36" fontFamily="Geist, sans-serif" fontSize="13" fill="#A0A0A0">auditable,</text>
          <text x="0" y="54" fontFamily="Geist, sans-serif" fontSize="13" fill="#A0A0A0">in your VPC</text>
        </g>
      </g>
    </svg>
  );
}

function FlowPerimeter() {
  return (
    <svg viewBox="0 0 1200 480" style={{ width: "100%", height: "auto" }}>
      <defs>
        <marker id="arr-red2" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto">
          <path d="M0,0 L10,5 L0,10 z" fill="#E24B4A" />
        </marker>
        <pattern id="hatch" patternUnits="userSpaceOnUse" width="6" height="6" patternTransform="rotate(45)">
          <line x1="0" y1="0" x2="0" y2="6" stroke="rgba(226,75,74,0.15)" strokeWidth="1.5" />
        </pattern>
      </defs>

      {/* Title bar */}
      <text x="600" y="32" textAnchor="middle" fontFamily="JetBrains Mono, monospace" fontSize="11" fill="#6B6B6B" letterSpacing="1.6">PERIMETER COMPARISON  ·  WHERE DOES INFERENCE HAPPEN?</text>

      {/* Vendor: data outside */}
      <g transform="translate(20, 70)">
        <text x="280" y="0" textAnchor="middle" fontFamily="JetBrains Mono, monospace" fontSize="11" fill="#E24B4A" letterSpacing="1.2">TYPICAL VENDOR</text>

        {/* Enterprise box */}
        <rect x="0" y="20" width="560" height="340" rx="2" fill="none" stroke="#2A2A2A" />
        <text x="20" y="44" fontFamily="JetBrains Mono, monospace" fontSize="10" fill="#6B6B6B" letterSpacing="0.8">YOUR ENTERPRISE</text>

        {/* Internal */}
        <rect x="40" y="80" width="180" height="100" rx="2" fill="#0a0a0a" stroke="#1F1F1F" />
        <text x="130" y="116" textAnchor="middle" fontFamily="JetBrains Mono, monospace" fontSize="10" fill="#A0A0A0" letterSpacing="0.6">YOUR DATA</text>
        <text x="130" y="136" textAnchor="middle" fontFamily="Geist, sans-serif" fontSize="13" fill="#fff">Customer · PII</text>
        <text x="130" y="156" textAnchor="middle" fontFamily="Geist, sans-serif" fontSize="13" fill="#fff">Trades · Treasury</text>

        {/* Data leaves */}
        <path d="M 220 130 Q 320 130 320 270 Q 320 280 340 280" stroke="#E24B4A" strokeWidth="2" strokeDasharray="6 4" fill="none" markerEnd="url(#arr-red2)" />

        {/* Outside box - external LLM */}
        <rect x="340" y="240" width="180" height="80" rx="2" fill="url(#hatch)" stroke="#E24B4A" strokeDasharray="3 3" />
        <text x="430" y="270" textAnchor="middle" fontFamily="JetBrains Mono, monospace" fontSize="10" fill="#E24B4A" letterSpacing="0.6">EXTERNAL CLOUD</text>
        <text x="430" y="290" textAnchor="middle" fontFamily="Geist, sans-serif" fontSize="13" fill="#fff">3rd-party LLM</text>

        {/* Border crossing label */}
        <text x="280" y="220" textAnchor="middle" fontFamily="JetBrains Mono, monospace" fontSize="10" fill="#E24B4A" letterSpacing="0.8">⨯ PERIMETER BREACH</text>
      </g>

      {/* Doblier: data inside */}
      <g transform="translate(620, 70)">
        <text x="280" y="0" textAnchor="middle" fontFamily="JetBrains Mono, monospace" fontSize="11" fill="#00D4AA" letterSpacing="1.2">DOBLIER</text>

        <rect x="0" y="20" width="560" height="340" rx="2" fill="rgba(0,212,170,0.04)" stroke="#00D4AA" />
        <text x="20" y="44" fontFamily="JetBrains Mono, monospace" fontSize="10" fill="#00D4AA" letterSpacing="0.8">YOUR ENTERPRISE  ·  EVERYTHING INSIDE</text>

        {/* Data */}
        <rect x="40" y="80" width="180" height="100" rx="2" fill="#0a0a0a" stroke="#1F1F1F" />
        <text x="130" y="116" textAnchor="middle" fontFamily="JetBrains Mono, monospace" fontSize="10" fill="#A0A0A0" letterSpacing="0.6">YOUR DATA</text>
        <text x="130" y="136" textAnchor="middle" fontFamily="Geist, sans-serif" fontSize="13" fill="#fff">Customer · PII</text>
        <text x="130" y="156" textAnchor="middle" fontFamily="Geist, sans-serif" fontSize="13" fill="#fff">Trades · Treasury</text>

        {/* AORBIT inside */}
        <rect x="340" y="80" width="180" height="100" rx="2" fill="#001a14" stroke="#00D4AA" />
        <text x="430" y="116" textAnchor="middle" fontFamily="JetBrains Mono, monospace" fontSize="10" fill="#00D4AA" letterSpacing="0.6">AORBIT  ·  PRIVATE LLM</text>
        <text x="430" y="136" textAnchor="middle" fontFamily="Geist, sans-serif" fontSize="13" fill="#fff">Frontier intelligence</text>
        <text x="430" y="156" textAnchor="middle" fontFamily="Geist, sans-serif" fontSize="13" fill="#fff">GPU + orchestration</text>

        {/* Data flow (inside) */}
        <line x1="220" y1="130" x2="340" y2="130" stroke="#00D4AA" strokeWidth="2" />
        <path d="M 335 125 L 340 130 L 335 135" fill="none" stroke="#00D4AA" strokeWidth="2" />

        {/* Governance */}
        <rect x="40" y="240" width="480" height="80" rx="2" fill="#0a0a0a" stroke="#1F1F1F" />
        <text x="280" y="270" textAnchor="middle" fontFamily="JetBrains Mono, monospace" fontSize="10" fill="#A0A0A0" letterSpacing="0.6">GOVERNANCE  ·  AUDIT  ·  POLICY</text>
        <text x="280" y="294" textAnchor="middle" fontFamily="Geist, sans-serif" fontSize="13" fill="#fff">Every call logged. Every prompt traceable.</text>
      </g>
    </svg>
  );
}

function FlowOrbit() {
  // Animated orbit metaphor: vendor — data drifts away. Doblier — data orbits AORBIT.
  return (
    <svg viewBox="0 0 1200 480" style={{ width: "100%", height: "auto" }}>
      <defs>
        <radialGradient id="teal-core" cx="50%" cy="50%" r="50%">
          <stop offset="0%" stopColor="#00D4AA" stopOpacity="0.9" />
          <stop offset="60%" stopColor="#00D4AA" stopOpacity="0.4" />
          <stop offset="100%" stopColor="#00D4AA" stopOpacity="0" />
        </radialGradient>
        <radialGradient id="red-core" cx="50%" cy="50%" r="50%">
          <stop offset="0%" stopColor="#E24B4A" stopOpacity="0.7" />
          <stop offset="100%" stopColor="#E24B4A" stopOpacity="0" />
        </radialGradient>
      </defs>

      {/* VENDOR */}
      <g transform="translate(300, 240)">
        <text x="0" y="-200" textAnchor="middle" fontFamily="JetBrains Mono, monospace" fontSize="11" fill="#E24B4A" letterSpacing="1.6">TYPICAL VENDOR  ·  DATA ESCAPES ORBIT</text>

        <circle r="60" fill="url(#red-core)" />
        <circle r="48" fill="#0a0a0a" stroke="#E24B4A" />
        <text x="0" y="-2" textAnchor="middle" fontFamily="JetBrains Mono, monospace" fontSize="10" fill="#E24B4A" letterSpacing="0.6">YOUR ORG</text>
        <text x="0" y="14" textAnchor="middle" fontFamily="Geist, sans-serif" fontSize="11" fill="#fff">Data origin</text>

        {/* Data points drifting outward */}
        {[0, 45, 90, 135, 180, 225, 270, 315].map((deg, i) => {
          const r1 = 80;
          const r2 = 170;
          const rad = (deg * Math.PI) / 180;
          return (
            <g key={i}>
              <line
                x1={Math.cos(rad) * r1}
                y1={Math.sin(rad) * r1}
                x2={Math.cos(rad) * r2}
                y2={Math.sin(rad) * r2}
                stroke="#E24B4A"
                strokeWidth="1.5"
                strokeDasharray="4 3"
                opacity={0.6}
              />
              <circle
                cx={Math.cos(rad) * r2}
                cy={Math.sin(rad) * r2}
                r="3"
                fill="#E24B4A"
              />
            </g>
          );
        })}

        {/* External cloud ring */}
        <circle r="190" fill="none" stroke="#E24B4A" strokeWidth="1" strokeDasharray="2 4" opacity="0.4" />

        <g transform="translate(-150, 130)">
          <rect width="100" height="32" rx="2" fill="none" stroke="#E24B4A" strokeDasharray="3 3" />
          <text x="50" y="20" textAnchor="middle" fontFamily="JetBrains Mono, monospace" fontSize="10" fill="#E24B4A" letterSpacing="0.6">3rd-party API</text>
        </g>
        <g transform="translate(110, -160)">
          <rect width="100" height="32" rx="2" fill="none" stroke="#E24B4A" strokeDasharray="3 3" />
          <text x="50" y="20" textAnchor="middle" fontFamily="JetBrains Mono, monospace" fontSize="10" fill="#E24B4A" letterSpacing="0.6">SaaS LLM</text>
        </g>
        <g transform="translate(130, 130)">
          <rect width="100" height="32" rx="2" fill="none" stroke="#E24B4A" strokeDasharray="3 3" />
          <text x="50" y="20" textAnchor="middle" fontFamily="JetBrains Mono, monospace" fontSize="10" fill="#E24B4A" letterSpacing="0.6">Vendor cloud</text>
        </g>
      </g>

      {/* DOBLIER */}
      <g transform="translate(900, 240)">
        <text x="0" y="-200" textAnchor="middle" fontFamily="JetBrains Mono, monospace" fontSize="11" fill="#00D4AA" letterSpacing="1.6">DOBLIER  ·  DATA STAYS IN ORBIT</text>

        {/* Orbit rings */}
        <circle r="200" fill="none" stroke="#00D4AA" strokeWidth="1" opacity="0.18" />
        <circle r="140" fill="none" stroke="#00D4AA" strokeWidth="1" opacity="0.3" />
        <circle r="200" fill="none" stroke="#00D4AA" strokeWidth="1.5" strokeDasharray="6 8" opacity="0.5">
          <animateTransform attributeName="transform" type="rotate" from="0" to="360" dur="60s" repeatCount="indefinite" />
        </circle>

        {/* Core: AORBIT */}
        <circle r="70" fill="url(#teal-core)" />
        <circle r="56" fill="#001a14" stroke="#00D4AA" strokeWidth="1.5" />
        <text x="0" y="-4" textAnchor="middle" fontFamily="JetBrains Mono, monospace" fontSize="10" fill="#00D4AA" letterSpacing="0.6">AORBIT</text>
        <text x="0" y="14" textAnchor="middle" fontFamily="Geist, sans-serif" fontSize="11" fill="#fff">Private LLM</text>

        {/* Orbiting data points */}
        <g>
          <animateTransform attributeName="transform" type="rotate" from="0" to="360" dur="30s" repeatCount="indefinite" />
          {[0, 60, 120, 180, 240, 300].map((deg, i) => {
            const rad = (deg * Math.PI) / 180;
            return (
              <g key={i} transform={`translate(${Math.cos(rad) * 140}, ${Math.sin(rad) * 140})`}>
                <circle r="6" fill="#00D4AA" />
                <circle r="14" fill="none" stroke="#00D4AA" opacity="0.4" />
              </g>
            );
          })}
        </g>
        <g>
          <animateTransform attributeName="transform" type="rotate" from="360" to="0" dur="50s" repeatCount="indefinite" />
          {[30, 110, 200, 290].map((deg, i) => {
            const rad = (deg * Math.PI) / 180;
            return (
              <circle key={i} cx={Math.cos(rad) * 200} cy={Math.sin(rad) * 200} r="4" fill="#00D4AA" opacity="0.6" />
            );
          })}
        </g>

        <g transform="translate(-180, -200)">
          <text fontFamily="JetBrains Mono, monospace" fontSize="10" fill="#A0A0A0" letterSpacing="0.6">DATA ·</text>
          <text y="16" fontFamily="JetBrains Mono, monospace" fontSize="10" fill="#A0A0A0" letterSpacing="0.6">CONTAINED</text>
        </g>
        <g transform="translate(130, 200)">
          <text fontFamily="JetBrains Mono, monospace" fontSize="10" fill="#A0A0A0" letterSpacing="0.6">INFERENCE ·</text>
          <text y="16" fontFamily="JetBrains Mono, monospace" fontSize="10" fill="#A0A0A0" letterSpacing="0.6">LOCAL</text>
        </g>
      </g>
    </svg>
  );
}

const DataFlowDiagram = ({ metaphor = "pipeline" }) => {
  if (metaphor === "perimeter") return <FlowPerimeter />;
  if (metaphor === "orbit") return <FlowOrbit />;
  return <FlowPipeline />;
};

/* =========================================================================
   ISOMETRIC LAYER STACK
   ========================================================================= */

function IsometricLayerStack({ active, onSelect }) {
  // Three stacked plates. Active one floats up, others dim.
  const layers = [
    { id: "frontier", num: "03", title: "Frontier", desc: "Agents · Treasury · Payments · ITOPS → AIOPS", z: 0 },
    { id: "intelligence", num: "02", title: "Intelligence", desc: "Multi-LLM orchestration · RAG · governed routing", z: 1 },
    { id: "foundation", num: "01", title: "Foundation", desc: "Private GPU pool · Kubernetes · zero egress", z: 2 },
  ];

  return (
    <div className="iso-stage">
      <div className="iso-wrap">
        {layers.map((l, i) => {
          const isActive = active === l.id;
          const baseLift = i * -55;
          const activeLift = isActive ? -30 : 0;
          return (
            <div
              key={l.id}
              className={`iso-layer ${isActive ? "active" : ""}`}
              style={{ transform: `translateZ(${baseLift + activeLift}px)` }}
              onMouseEnter={() => onSelect(l.id)}
            >
              <div className="iso-grid" />
              <div className="iso-label">{l.num}</div>
              <div className="iso-title">{l.title}</div>
            </div>
          );
        })}
      </div>
    </div>
  );
}

/* =========================================================================
   AORBIT 5-LAYER ARCHITECTURE TABLE (used on Why Doblier / AORBIT pages)
   ========================================================================= */

function ArchitectureStack() {
  const layers = [
    { tag: "05 · GOV", name: "Governance", desc: "Policy, audit, observability across every call.", role: "Cross-cutting" },
    { tag: "04 · APP", name: "Application", desc: "Agents, copilots, internal UIs. Where humans meet the system.", role: "Surface" },
    { tag: "03 · OPS", name: "Operations", desc: "Orchestration, monitoring, AIOps. Production discipline.", role: "Runtime" },
    { tag: "02 · INT", name: "Intelligence", desc: "Frontier LLMs, embeddings, RAG, routing.", role: "Cognition" },
    { tag: "01 · INF", name: "Infrastructure", desc: "GPUs, Kubernetes, networking, storage. Private, on-prem.", role: "Substrate" },
  ];
  return (
    <div className="arch-stack">
      {layers.map((l, i) => (
        <div key={i} className={`arch-row ${i === 0 ? "governance" : ""}`}>
          <div className="arch-num">{l.tag}</div>
          <div>
            <div className="arch-name">{l.name}</div>
            <div className="arch-desc">{l.desc}</div>
          </div>
          <div className="arch-tag">{l.role}</div>
        </div>
      ))}
    </div>
  );
}

Object.assign(window, { DataFlowDiagram, FlowPipeline, FlowPerimeter, FlowOrbit, IsometricLayerStack, ArchitectureStack });
