// ===== App shell — sidebar nav, role switching, screen routing =====
const { useState: useS_App, useEffect: useE_App } = React;

const NAV_BY_ROLE = {
  agro: [
    { id: "dashboard", label: "Dashboard", icon: "dashboard" },
    { id: "panen",     label: "Time Delay Prediksi Panen", icon: "leaf" },
    { id: "supplier",  label: "Pemilihan Supplier", icon: "suppliers" },
    { id: "penerimaan", label: "Penerimaan & Validasi", icon: "box" },
    { id: "ews",       label: "Keamanan Pangan", icon: "shield" }
  ],
  induk: [
    { id: "dashboard", label: "Dashboard", icon: "dashboard" },
    { id: "menu",      label: "Optimasi Menu", icon: "menu" },
    { id: "ews",       label: "Keamanan Pangan", icon: "shield" }
  ],
  satelit: [
    { id: "dashboard", label: "Dashboard", icon: "dashboard" },
    { id: "menu",      label: "Optimasi Menu", icon: "menu" },
    { id: "ews",       label: "Keamanan Pangan", icon: "shield" }
  ],
  supplier: [
    { id: "dashboard", label: "Dashboard", icon: "dashboard" },
    { id: "penerimaan", label: "Penerimaan Komoditas", icon: "box" },
    { id: "ews",       label: "Keamanan Pangan", icon: "shield" },
    { id: "manajemen", label: "Manajemen Supplier", icon: "factory" }
  ],
  penerima: [
    { id: "dashboard", label: "Dashboard", icon: "dashboard" },
    { id: "checklist",  label: "Verifikasi Makanan", icon: "shield" },
    { id: "feedback",   label: "Penilaian & Feedback", icon: "bell" }
  ]
};

function App() {
  const [tweaks, setTweak] = useTweaks(window.TWEAK_DEFAULTS);
  const [authed, setAuthed] = useS_App(false);
  const [route, setRoute] = useS_App("dashboard");
  const [showProfile, setShowProfile] = useS_App(false);
  const [sidebarOpen, setSidebarOpen] = useS_App(true);
  const { Icon } = window.IDSSUI;

  // Authentication helpers
  const checkAuth = () => {
    const authedRole = sessionStorage.getItem('authedRole');
    const authedUser = sessionStorage.getItem('authedUser');
    return authedRole && authedUser;
  };

  const logoutUser = () => {
    sessionStorage.removeItem('authedUser');
    sessionStorage.removeItem('authedRole');
    sessionStorage.removeItem('userName');
    setAuthed(false);
    setShowProfile(false);
  };

  // Check if user is already authenticated (from sessionStorage)
  useE_App(() => {
    if (checkAuth()) {
      const authedRole = sessionStorage.getItem('authedRole');
      setTweak("role", authedRole);
      setAuthed(true);
    }
  }, []);

  // Map supplier sub-types to main supplier role for navigation
  const mainRole = ["supplier_tani", "supplier_koperasi", "supplier_umkm", "supplier_besar"].includes(tweaks.role) ? "supplier" : tweaks.role;
  const role = window.IDSS.ROLES[tweaks.role];
  const nav = NAV_BY_ROLE[mainRole];

  // Apply theme & density to <html>
  useE_App(() => {
    document.documentElement.dataset.theme = tweaks.theme;
    document.documentElement.dataset.density = tweaks.density;
  }, [tweaks.theme, tweaks.density]);

  // Phase 2 Stage 4: Centralized message listener for all inter-role broadcasts
  useE_App(() => {
    const handleMessage = (event) => {
      if (!event.data?.type) return; // Not our message

      const { type, payload, fulfillment, feedback, requests } = event.data;

      // B1: Check for duplicate submission (Phase B - Reliability)
      const submissionPayload = payload || fulfillment || feedback || null;
      if (submissionPayload && window.isSubmissionDuplicate) {
        if (window.isSubmissionDuplicate(submissionPayload)) {
          window.showToast('Pengajuan sudah tercatat sebelumnya', 'info', 2000);
          return;
        }
      }

      // Development logging (removed from production)
      // Uncomment untuk debugging: console.log(`[Message] ${type}`, { fulfillment, feedback, requests });

      // Optional: Add analytics, auditing, or other cross-cutting concerns here
      // e.g., track message frequency, validate payload structure, etc.
    };

    window.addEventListener("message", handleMessage);
    return () => window.removeEventListener("message", handleMessage);
  }, []);

  // C5: Cross-Tab Sync Listener
  useE_App(() => {
    if (window.TabSync) {
      window.TabSync.listen((payload) => {
        if (payload.action === 'data_refresh') {
          setRefreshTrigger(v => !v);
        }
      });
    }
  }, []);

  // Forward AHP weights to AHP screen
  useE_App(() => {
    window.__ahpWeights = { harga: tweaks.ahpHarga, mutu: tweaks.ahpMutu, waktu: tweaks.ahpWaktu, jumlah: tweaks.ahpJumlah };
    window.postMessage({ type: "__ahp_weights", weights: window.__ahpWeights }, "*");
  }, [tweaks.ahpHarga, tweaks.ahpMutu, tweaks.ahpWaktu, tweaks.ahpJumlah]);

  // Reset route and adjust porsi when role changes
  useE_App(() => {
    setRoute("dashboard");
    // Auto-adjust portion target based on role
    const defaultPorsi = tweaks.role === "agro" ? 3000 : tweaks.role === "induk" ? 3000 : 2000;
    setTweak("porsi", defaultPorsi);
  }, [tweaks.role]);

  if (!authed) {
    return (
      <>
        <window.LoginScreen onLogin={(roleId) => { setTweak("role", roleId); setAuthed(true); }}/>
        <TweaksUI tweaks={tweaks} setTweak={setTweak}/>
      </>
    );
  }

  // Render content
  let content;

  // Settings page available for all roles
  if (route === "settings") {
    content = <window.SettingsScreen role={role} tweaks={tweaks} setTweak={setTweak}/>;
  } else if (mainRole === "agro") {
    if (route === "dashboard") content = <window.AgroDashboard scenario={tweaks.scenario}/>;
    if (route === "panen") content = <window.AgroPanen/>;
    if (route === "supplier") content = <window.AgroSupplier/>;
    if (route === "penerimaan") content = <window.AgroPenerimaan/>;
    if (route === "ews") content = <window.AgroEWS role={role}/>;
  } else if (mainRole === "supplier") {
    if (route === "dashboard") content = <window.SupplierDashboard/>;
    if (route === "penerimaan") content = <window.SupplierPenerimaan/>;
    if (route === "ews") content = <window.SupplierEWS/>;
    if (route === "manajemen") content = <window.SupplierManagement/>;
  } else if (mainRole === "penerima") {
    if (route === "dashboard") content = <window.PenerimaDashboard/>;
    if (route === "checklist") content = <window.PenerimaChecklist/>;
    if (route === "feedback") content = <window.PenerimaFeedback/>;
  } else {
    if (route === "dashboard") content = <window.DapurDashboard role={role} scenario={tweaks.scenario} porsi={tweaks.porsi} onEWSClick={() => setRoute("ews")}/>;
    if (route === "menu") content = <window.MenuOptimasi porsi={tweaks.porsi}/>;
    if (route === "ews") content = <window.EWSScreen role={role}/>;
  }

  return (
    <div className="app" data-screen-label={`${role.short} — ${route === "settings" ? "Pengaturan" : nav.find(n=>n.id===route)?.label}`} data-sidebar={sidebarOpen ? "open" : "closed"}>
      <header className="topbar">
        <div className="brand">
          <div className="row" style={{ gap: 0, alignItems: "center", background: "#fff", borderRadius: 6, padding: "4px 8px", border: "1.5px solid var(--line)" }}>
            {[
              { src: "assets/logo-tanoto.png", alt: "Tanoto" },
              { src: "assets/logo-bappenas.png", alt: "Bappenas" },
              { src: "assets/logo-seafast.png", alt: "SEAFAST" },
              { src: "assets/logo-cs.png", alt: "C-System" }
            ].map((l, i) => (
              <div key={i} style={{
                height: 34, display: "grid", placeItems: "center", padding: "0 6px"
              }}>
                <img src={l.src} alt={l.alt} style={{ height: 22, width: "auto", maxWidth: 70, objectFit: "contain" }}/>
              </div>
            ))}
          </div>
          <div style={{ width: 1, height: 28, background: "var(--line)", marginLeft: 6, marginRight: 6 }}/>
          <div className="brand-stack">
            <div className="brand-name">IDSS · Makan Bergizi Gratis</div>
            <div className="brand-sub">Intelligent Decision Support System</div>
          </div>
        </div>
        <div className="topbar-spacer"/>
        <div style={{ position: "relative" }}>
          <div className="user-chip" style={{ cursor: "default", display: "grid", gridTemplateColumns: "auto 1fr auto", gap: 10, alignItems: "center", padding: "8px 12px" }}>
            <div className="avatar">{role.initials}</div>
            <div className="user-chip-text">
              <div className="user-chip-name">{role.short}</div>
              <div className="user-chip-role" style={{ fontSize: 11 }}>{sessionStorage.getItem('userName') || role.location.split(" — ")[0]}</div>
            </div>
            <button onClick={logoutUser} style={{ background: "none", border: "none", cursor: "pointer", color: "var(--ink-2)", padding: 0, display: "flex", alignItems: "center" }} title="Logout">
              <Icon name="logout" size={14}/>
            </button>
          </div>
        </div>
      </header>

      <aside className="sidebar">
        <button className="sidebar-toggle" onClick={() => setSidebarOpen(s => !s)} title={sidebarOpen ? "Tutup sidebar" : "Buka sidebar"}>
          <Icon name={sidebarOpen ? "arrow" : "menu"} size={16}/>
        </button>
        <div className="nav-section">
          <div className="nav-label">{role.short}</div>
          {nav.map(n => (
            <div key={n.id} className={`nav-item ${route === n.id ? "active" : ""}`} onClick={() => setRoute(n.id)} title={n.label}>
              <Icon name={n.icon} size={16}/>
              <span>{n.label}</span>
            </div>
          ))}
        </div>
        <div className="nav-section">
          <div className="nav-label">Sistem</div>
          <div className={`nav-item ${route === "settings" ? "active" : ""}`} onClick={() => setRoute("settings")} title="Pengaturan"><Icon name="settings" size={16}/><span>Pengaturan</span></div>
        </div>

        <div className="nav-spacer"/>

        <div style={{ padding: "12px 8px" }}>
          <button onClick={() => setAuthed(false)} style={{
            width: sidebarOpen ? "100%" : 40,
            height: 40,
            borderRadius: "var(--radius-lg)",
            background: "var(--danger-50)",
            color: "var(--danger)",
            border: "1px solid var(--danger-100)",
            cursor: "pointer",
            display: "flex",
            alignItems: "center",
            justifyContent: sidebarOpen ? "center" : "center",
            gap: sidebarOpen ? 8 : 0,
            transition: "all 0.2s",
            padding: sidebarOpen ? "11px 14px" : 0,
            fontSize: 13,
            fontWeight: 500
          }} title="Keluar">
            <Icon name="logout" size={16}/>
            {sidebarOpen && <span>Keluar</span>}
          </button>
        </div>

        <div className="nav-foot">
          IDSS-MBG · prototipe riset<br/>
          © {new Date().getFullYear()} — IPB Univ.
        </div>
      </aside>

      <main className="content">
        <div className="content-inner fade-up" key={`${tweaks.role}-${route}`}>
          {content}
        </div>
      </main>

      <TweaksUI tweaks={tweaks} setTweak={setTweak}/>
      <ToastContainer/>
    </div>
  );
}

function TweaksUI({ tweaks, setTweak }) {
  return (
    <TweaksPanel title="Tweaks">
      <TweakSection title="Tampilan">
        <TweakRadio label="Tema" value={tweaks.theme} onChange={v => setTweak("theme", v)}
          options={[{value:"light",label:"Light"},{value:"dark",label:"Dark"}]}/>
        <TweakRadio label="Density" value={tweaks.density} onChange={v => setTweak("density", v)}
          options={[{value:"comfortable",label:"Comfortable"},{value:"compact",label:"Compact"}]}/>
      </TweakSection>

      <TweakSection title="Skenario &amp; Konfigurasi">
        <TweakSelect label="Skenario data" value={tweaks.scenario} onChange={v => setTweak("scenario", v)}
          options={[
            { value:"normal", label:"Normal" },
            { value:"krisis", label:"Krisis pasokan" },
            { value:"surplus", label:"Surplus panen" }
          ]}/>
        <TweakSlider label="Skala dapur (porsi/hari)" min={500} max={5000} step={100}
          value={tweaks.porsi} onChange={v => setTweak("porsi", v)}/>
      </TweakSection>

      <TweakSection title="Bobot AHP (Σ akan dinormalisasi)">
        <TweakSlider label="Harga" min={0} max={1} step={0.05} value={tweaks.ahpHarga} onChange={v => setTweak("ahpHarga", v)}/>
        <TweakSlider label="Mutu" min={0} max={1} step={0.05} value={tweaks.ahpMutu} onChange={v => setTweak("ahpMutu", v)}/>
        <TweakSlider label="Waktu" min={0} max={1} step={0.05} value={tweaks.ahpWaktu} onChange={v => setTweak("ahpWaktu", v)}/>
        <TweakSlider label="Jumlah" min={0} max={1} step={0.05} value={tweaks.ahpJumlah} onChange={v => setTweak("ahpJumlah", v)}/>
      </TweakSection>
    </TweaksPanel>
  );
}

function SettingsScreen({ role, tweaks, setTweak }) {
  const { Icon } = window.IDSSUI;
  const authedUser = sessionStorage.getItem('authedUser');
  const loginTime = sessionStorage.getItem('loginTime');

  return (
    <div style={{ padding: "24px", maxWidth: 800, margin: "0 auto" }}>
      <div style={{ marginBottom: 32 }}>
        <h1 className="page-title" style={{ marginBottom: 6 }}>Pengaturan</h1>
        <p className="muted">Kelola preferensi dan informasi akun Anda</p>
      </div>

      {/* Profil Akun */}
      <div style={{ marginBottom: 28 }}>
        <h2 style={{ fontSize: 14, fontWeight: 600, color: "var(--ink-2)", textTransform: "uppercase", letterSpacing: "0.5px", marginBottom: 14 }}>Profil Akun</h2>
        <div style={{ display: "grid", gap: 12 }}>
          <div style={{ padding: 14, background: "var(--surface)", border: "1px solid var(--line)", borderRadius: "var(--radius-lg)" }}>
            <div style={{ fontSize: 11, color: "var(--ink-3)", textTransform: "uppercase", letterSpacing: "0.5px", marginBottom: 4 }}>Username</div>
            <div style={{ fontSize: 14, fontWeight: 500, color: "var(--ink)" }}>{authedUser || "—"}</div>
          </div>
          <div style={{ padding: 14, background: "var(--surface)", border: "1px solid var(--line)", borderRadius: "var(--radius-lg)" }}>
            <div style={{ fontSize: 11, color: "var(--ink-3)", textTransform: "uppercase", letterSpacing: "0.5px", marginBottom: 4 }}>Role</div>
            <div style={{ fontSize: 14, fontWeight: 500, color: "var(--ink)" }}>{role.name}</div>
          </div>
          <div style={{ padding: 14, background: "var(--surface)", border: "1px solid var(--line)", borderRadius: "var(--radius-lg)" }}>
            <div style={{ fontSize: 11, color: "var(--ink-3)", textTransform: "uppercase", letterSpacing: "0.5px", marginBottom: 4 }}>Lokasi</div>
            <div style={{ fontSize: 14, fontWeight: 500, color: "var(--ink)" }}>{role.location}</div>
          </div>
        </div>
      </div>

      {/* Tampilan & Tema */}
      <div style={{ marginBottom: 28 }}>
        <h2 style={{ fontSize: 14, fontWeight: 600, color: "var(--ink-2)", textTransform: "uppercase", letterSpacing: "0.5px", marginBottom: 14 }}>Tampilan</h2>
        <div style={{ display: "grid", gap: 14 }}>
          <div style={{ padding: 14, background: "var(--surface)", border: "1px solid var(--line)", borderRadius: "var(--radius-lg)" }}>
            <div style={{ fontSize: 12, fontWeight: 500, marginBottom: 10 }}>Tema</div>
            <div style={{ display: "flex", gap: 8 }}>
              {[
                { value: "light", label: "Terang" },
                { value: "dark", label: "Gelap" }
              ].map(option => (
                <button key={option.value} onClick={() => setTweak("theme", option.value)}
                  style={{
                    flex: 1, padding: "8px 12px", borderRadius: "var(--radius)",
                    border: `1.5px solid ${tweaks.theme === option.value ? "var(--primary)" : "var(--line)"}`,
                    background: tweaks.theme === option.value ? "var(--primary-50)" : "var(--bg-2)",
                    cursor: "pointer", transition: "all 0.2s ease",
                    fontSize: 13, fontWeight: 500, color: tweaks.theme === option.value ? "var(--primary)" : "var(--ink)"
                  }}>
                  {option.label}
                </button>
              ))}
            </div>
          </div>

          <div style={{ padding: 14, background: "var(--surface)", border: "1px solid var(--line)", borderRadius: "var(--radius-lg)" }}>
            <div style={{ fontSize: 12, fontWeight: 500, marginBottom: 10 }}>Kepadatan</div>
            <div style={{ display: "flex", gap: 8 }}>
              {[
                { value: "comfortable", label: "Nyaman" },
                { value: "compact", label: "Padat" }
              ].map(option => (
                <button key={option.value} onClick={() => setTweak("density", option.value)}
                  style={{
                    flex: 1, padding: "8px 12px", borderRadius: "var(--radius)",
                    border: `1.5px solid ${tweaks.density === option.value ? "var(--primary)" : "var(--line)"}`,
                    background: tweaks.density === option.value ? "var(--primary-50)" : "var(--bg-2)",
                    cursor: "pointer", transition: "all 0.2s ease",
                    fontSize: 13, fontWeight: 500, color: tweaks.density === option.value ? "var(--primary)" : "var(--ink)"
                  }}>
                  {option.label}
                </button>
              ))}
            </div>
          </div>
        </div>
      </div>

      {/* Tentang Sistem */}
      <div style={{ marginBottom: 28 }}>
        <h2 style={{ fontSize: 14, fontWeight: 600, color: "var(--ink-2)", textTransform: "uppercase", letterSpacing: "0.5px", marginBottom: 14 }}>Tentang Sistem</h2>
        <div style={{ padding: 14, background: "var(--surface)", border: "1px solid var(--line)", borderRadius: "var(--radius-lg)" }}>
          <div style={{ display: "grid", gap: 12 }}>
            <div style={{ display: "flex", justifyContent: "space-between" }}>
              <span style={{ color: "var(--ink-2)", fontSize: 13 }}>Nama Sistem</span>
              <span style={{ fontWeight: 500 }}>AI Techno IDSS</span>
            </div>
            <div style={{ height: 1, background: "var(--line)" }}/>
            <div style={{ display: "flex", justifyContent: "space-between" }}>
              <span style={{ color: "var(--ink-2)", fontSize: 13 }}>Versi</span>
              <span style={{ fontWeight: 500 }}>1.0 (Demo)</span>
            </div>
            <div style={{ height: 1, background: "var(--line)" }}/>
            <div style={{ display: "flex", justifyContent: "space-between" }}>
              <span style={{ color: "var(--ink-2)", fontSize: 13 }}>Status</span>
              <span style={{ fontWeight: 500, color: "var(--warning)" }}>Prototipe Riset</span>
            </div>
            <div style={{ height: 1, background: "var(--line)" }}/>
            <div style={{ display: "flex", justifyContent: "space-between", alignItems: "center", gap: 12 }}>
              <span style={{ color: "var(--ink-2)", fontSize: 13, flexShrink: 0 }}>Pengembang</span>
              <span style={{ fontWeight: 500, fontSize: 12, textAlign: "right", whiteSpace: "nowrap", overflow: "hidden", textOverflow: "ellipsis", minWidth: 0 }}>IPB University, Tanoto Foundation, SEAFAST Center, Center of System</span>
            </div>
          </div>
        </div>
      </div>

      <div style={{ marginTop: 32, padding: "12px", background: "var(--bg-2)", borderRadius: "var(--radius)", fontSize: 12, color: "var(--ink-3)", lineHeight: 1.6 }}>
        💡 <b>Tips:</b> Pengaturan tema dan kepadatan berlaku untuk semua halaman. Data sesi disimpan secara lokal dan akan terhapus saat logout.
      </div>
    </div>
  );
}

window.SettingsScreen = SettingsScreen;

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<App/>);
