/* compare-app.jsx - Portál FKI · Srovnávač (fund comparator) */
const { useState, useMemo, useEffect, useRef } = React;
const MAX_CMP = 4;

/* ---------- shared chrome ---------- */
function Nav({ active }) {
  const [open, setOpen] = useState(false);
  const link = (href, label, key) => (
    <a className={"nav-link" + (active === key ? " is-active" : "")} href={href}>{label}</a>
  );
  return (
    <header className="nav">
      <div className="nav-inner">
        <a className="brand" href="domu.html">
          <span className="brand-mark" aria-hidden="true">◆</span>
          <span className="brand-name">Fkička</span>
        </a>
        <nav className={"nav-links" + (open ? " is-open" : "")}>
          {link("domu.html", "Domů", "home")}
          {link("seznam-fondu.html", "Seznam fondů", "list")}
          {link("spravci.html", "Správci", "managers")}
          {link("srovnavac.html", "Srovnávač", "compare")}
          {link("co-je-noveho.html", "Co je nového", "changelog")}
          <a className={"nav-link" + (active === "saved" ? " is-active" : "")} href="ulozene.html">Uložené<span className="wl-pill" data-wl-count style={{display:"none"}}>0</span></a>
        </nav>
        <button className="hamburger" aria-label="Menu" onClick={() => setOpen((o) => !o)}>
          <span></span><span></span><span></span>
        </button>
      </div>
    </header>
  );
}
function Footer() {
  return (
    <footer className="footer">
      <div className="footer-inner">
        <div className="brand"><span className="brand-mark" aria-hidden="true">◆</span><span className="brand-name">Fkička</span></div>
        <nav className="footer-links"><a href="domu.html">Domů</a><a href="seznam-fondu.html">Seznam fondů</a><a href="pruvodce.html">Průvodce</a><a href="srovnavac.html">Srovnávač</a><a href="#">Kontakt</a><a href="privacy.html">Zásady ochrany osobních údajů</a><a href="cookies.html">Zásady používání cookies</a></nav>
        <span className="footer-fine">© Fkička 2026 · Informace nejsou investičním doporučením.</span><span className="footer-op">Provozovatel: Clientelo Czech s.r.o., IČO 221 93 456, se sídlem Platnéřská 90/13, 110 00 Praha 1, zapsaná v OR u MS v Praze, sp. zn. C 412348.</span>
      </div>
    </footer>
  );
}

/* ---------- atoms ---------- */
function formatAum(milCZK) {
  if (milCZK == null) return "-";
  if (milCZK >= 1000) { const mld = milCZK / 1000; return (mld >= 10 ? mld.toFixed(1) : mld.toFixed(2)) + " mld Kč"; }
  return Math.round(milCZK) + " mil Kč";
}
function Stars({ n }) {
  return (
    <span className="stars" aria-label={n + " z 5"}>
      {[1,2,3,4,5].map((i) => (
        <svg key={i} viewBox="0 0 24 24" className={"star " + (i <= n ? "on" : "off")} width="14" height="14" aria-hidden="true">
          <path d="M12 2.5l2.9 6.06 6.6.86-4.85 4.6 1.2 6.58L12 17.9l-5.85 3.16 1.2-6.58L2.5 9.42l6.6-.86z" />
        </svg>
      ))}
    </span>
  );
}
function Badge({ kind }) {
  const map = { "Aktivní": "badge badge--active", "Warm": "badge badge--warm", "Cold": "badge badge--cold" };
  return <span className={map[kind]}><span className="badge-dot">•</span>{kind}</span>;
}
const STRAT_DOT = { "Nemovitosti":"#5b7db1", "Private Equity":"#9a6fb0", "VC":"#cd8d3e", "Energie & Credit":"#4f9d7a", "Ostatní":"#9c9a93" };
function StratTag({ s }) {
  return <span className="strat" style={{}}><span className="opt-dot" style={{ background: STRAT_DOT[s] || "#9c9a93", display:"inline-block" }}></span>{s}</span>;
}

/* ---------- combobox ---------- */
function AddFund({ pool, onAdd, disabled }) {
  const [open, setOpen] = useState(false);
  const [q, setQ] = useState("");
  const ref = useRef(null);
  useEffect(() => {
    const onDoc = (e) => { if (ref.current && !ref.current.contains(e.target)) setOpen(false); };
    document.addEventListener("mousedown", onDoc);
    return () => document.removeEventListener("mousedown", onDoc);
  }, []);
  const list = useMemo(() => {
    const ql = q.toLowerCase();
    return pool.filter((x) => !ql || x.name.toLowerCase().includes(ql) || x.manager.toLowerCase().includes(ql)).slice(0, 40);
  }, [pool, q]);
  return (
    <div className="combo" ref={ref}>
      <div className="combo-input" onClick={() => !disabled && setOpen(true)}>
        <svg viewBox="0 0 24 24" width="16" height="16" aria-hidden="true"><circle cx="11" cy="11" r="7" fill="none" stroke="currentColor" strokeWidth="1.8" /><path d="M20 20l-3.2-3.2" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" /></svg>
        <input value={q} disabled={disabled} placeholder={disabled ? "Maximum 4 fondy - odeberte jeden" : "Přidat fond ke srovnání…"}
          onFocus={() => setOpen(true)} onChange={(e) => { setQ(e.target.value); setOpen(true); }} />
      </div>
      {open && !disabled ? (
        <div className="combo-pop">
          {list.length === 0 ? <div className="combo-empty">Žádný fond nenalezen</div> :
            list.map((x) => (
              <button key={x.id} className="combo-opt" onClick={() => { onAdd(x.id); setQ(""); setOpen(false); }}>
                <span>
                  <span className="co-name">{x.name}</span>
                  <span className="co-sub">{x.strategy} · {x.manager}</span>
                </span>
                <span className="co-aum">{formatAum(x.aum)}</span>
              </button>
            ))}
        </div>
      ) : null}
    </div>
  );
}

/* ---------- main ---------- */
function readIds() {
  const p = new URLSearchParams(location.search);
  const raw = p.get("ids");
  if (!raw) return null;
  return raw.split(",").map((n) => parseInt(n, 10)).filter((n) => !isNaN(n));
}

function CompareApp() {
  const FUNDS = window.FKI_FUNDS || [];
  const byId = useMemo(() => Object.fromEntries(FUNDS.map((x) => [x.id, x])), [FUNDS]);

  const defaultIds = useMemo(() => {
    // one strong fund from three distinct strategies, AUM known
    const want = ["Nemovitosti", "Private Equity", "VC"];
    const out = [];
    want.forEach((s) => {
      const cand = FUNDS.filter((x) => x.strategy === s && x.aum != null).sort((a, b) => b.rating - a.rating || b.aum - a.aum)[0];
      if (cand) out.push(cand.id);
    });
    while (out.length < 3) { const f = FUNDS[out.length]; if (f && !out.includes(f.id)) out.push(f.id); else break; }
    return out;
  }, [FUNDS]);

  const [ids, setIds] = useState(() => {
    const fromUrl = readIds();
    const seed = (fromUrl && fromUrl.length ? fromUrl : defaultIds).filter((id) => byId[id]);
    return seed.slice(0, MAX_CMP);
  });

  useEffect(() => {
    const p = new URLSearchParams();
    if (ids.length) p.set("ids", ids.join(","));
    history.replaceState(null, "", ids.length ? "?" + p.toString() : location.pathname);
  }, [ids]);

  const add = (id) => setIds((p) => (p.includes(id) || p.length >= MAX_CMP ? p : [...p, id]));
  const remove = (id) => setIds((p) => p.filter((x) => x !== id));

  const funds = ids.map((id) => byId[id]).filter(Boolean);
  const pool = FUNDS.filter((x) => !ids.includes(x.id));

  // best-value computation
  const maxAum = Math.max(...funds.map((x) => x.aum || -1));
  const maxRating = Math.max(...funds.map((x) => x.rating));
  const minYear = Math.min(...funds.map((x) => x.year));

  const cols = funds.length + (funds.length < MAX_CMP ? 1 : 0);
  const gridStyle = { gridTemplateColumns: `168px repeat(${cols}, minmax(150px, 1fr))` };

  // dynamic insight
  const insight = useMemo(() => {
    if (funds.length < 2) return null;
    const top = funds.filter((x) => x.aum != null).sort((a, b) => b.aum - a.aum)[0];
    const best = funds.slice().sort((a, b) => b.rating - a.rating || (b.aum || 0) - (a.aum || 0))[0];
    const active = funds.filter((x) => x.fundraising === "Aktivní");
    let parts = [];
    if (top) parts.push(`Největší fond je ${top.name} s AUM ${formatAum(top.aum)}`);
    if (active.length) parts.push(`aktivně vybírá ${active.length === funds.length ? "všech " + active.length : active.length} z porovnávaných fondů`);
    else parts.push("žádný z vybraných fondů právě aktivně nevybírá kapitál");
    return { best: best.name, body: parts.join("; ") + "." };
  }, [funds, maxAum]);

  const attrCell = (label) => <div className="cmp-cell is-attr"><span className="cmp-attr-lab">{label}</span></div>;

  return (
    <div className="page">
      <Nav active="compare" />
      <div className="container">
        <div className="screen-head">
          <div className="eyebrow">Srovnávač</div>
          <h1>Porovnejte fondy vedle sebe</h1>
          <p className="sub">Vyberte až čtyři fondy kvalifikovaných investorů a porovnejte je podle strategie, velikosti, statusu fundraisingu a hodnocení. Data jsou v této ukázce ilustrativní.</p>
        </div>

        <div className="screen-body">
          <div className="cmp-toolbar">
            <span className="cmp-count"><b>{funds.length}</b> z {MAX_CMP} fondů ve srovnání</span>
            <AddFund pool={pool} onAdd={add} disabled={ids.length >= MAX_CMP} />
          </div>

          {funds.length === 0 ? (
            <div className="cmp-wrap">
              <div className="cmp-empty">
                <div className="cmp-empty-icon"></div>
                <h3>Zatím žádné fondy ke srovnání</h3>
                <p>Přidejte fondy přes vyhledávání výše, nebo začněte jedním z návrhů:</p>
                <div className="cmp-suggest">
                  {defaultIds.map((id) => byId[id] ? <button key={id} className="chip" onClick={() => add(id)}>{byId[id].name}</button> : null)}
                </div>
              </div>
            </div>
          ) : (
            <React.Fragment>
              <div className="cmp-wrap">
                <div className="cmp-grid" style={gridStyle}>
                  {/* header row */}
                  <div className="cmp-row">
                    <div className="cmp-head-cell is-attr"><span className="cmp-attr-lab">Fond</span></div>
                    {funds.map((x) => (
                      <div key={x.id} className="cmp-head-cell">
                        <button className="cmp-remove" onClick={() => remove(x.id)} aria-label="Odebrat">✕</button>
                        <div className="cmp-h-name">{x.name}</div>
                        <div className="cmp-h-meta">{x.manager} · reg. {x.year}</div>
                      </div>
                    ))}
                    {funds.length < MAX_CMP ? <div className="cmp-add-cell"><AddCol pool={pool} onAdd={add} /></div> : null}
                  </div>

                  {/* Strategie */}
                  <div className="cmp-row">
                    {attrCell("Strategie")}
                    {funds.map((x) => <div key={x.id} className="cmp-cell cmp-val"><StratTag s={x.strategy} /></div>)}
                    {funds.length < MAX_CMP ? <div className="cmp-cell" style={{ background: "#fbfbf9" }}></div> : null}
                  </div>

                  {/* AUM */}
                  <div className="cmp-row">
                    {attrCell("AUM")}
                    {funds.map((x) => {
                      const best = x.aum != null && x.aum === maxAum;
                      return (
                        <div key={x.id} className={"cmp-cell cmp-val" + (best ? " is-best" : "")}>
                          <div className="cmp-big">{formatAum(x.aum)}</div>
                          <div className="cmp-sub">{x.aumConfidence === "vysoká" ? "vysoká jistota" : x.aumConfidence === "odhad" ? "odhad" : "neuvedeno"}</div>
                          {best ? <span className="cmp-best-tag">Největší</span> : null}
                        </div>
                      );
                    })}
                    {funds.length < MAX_CMP ? <div className="cmp-cell" style={{ background: "#fbfbf9" }}></div> : null}
                  </div>

                  {/* Fundraising */}
                  <div className="cmp-row">
                    {attrCell("Fundraising")}
                    {funds.map((x) => <div key={x.id} className="cmp-cell cmp-val"><Badge kind={x.fundraising} /></div>)}
                    {funds.length < MAX_CMP ? <div className="cmp-cell" style={{ background: "#fbfbf9" }}></div> : null}
                  </div>

                  {/* IS správce */}
                  <div className="cmp-row">
                    {attrCell("IS správce")}
                    {funds.map((x) => <div key={x.id} className="cmp-cell cmp-val">{x.manager}</div>)}
                    {funds.length < MAX_CMP ? <div className="cmp-cell" style={{ background: "#fbfbf9" }}></div> : null}
                  </div>

                  {/* Hodnocení */}
                  <div className="cmp-row">
                    {attrCell("Hodnocení")}
                    {funds.map((x) => {
                      const best = x.rating === maxRating && maxRating > 0;
                      return (
                        <div key={x.id} className={"cmp-cell cmp-val" + (best ? " is-best" : "")}>
                          <Stars n={x.rating} />
                          {best ? <span className="cmp-best-tag">Nejvyšší</span> : null}
                        </div>
                      );
                    })}
                    {funds.length < MAX_CMP ? <div className="cmp-cell" style={{ background: "#fbfbf9" }}></div> : null}
                  </div>

                  {/* Rok registrace */}
                  <div className="cmp-row">
                    {attrCell("Na trhu od")}
                    {funds.map((x) => {
                      const best = x.year === minYear;
                      return (
                        <div key={x.id} className={"cmp-cell cmp-val" + (best ? " is-best" : "")}>
                          <span className="cmp-big" style={{ fontSize: "16px" }}>{x.year}</span>
                          <div className="cmp-sub">{2026 - x.year} let</div>
                          {best && funds.length > 1 ? <span className="cmp-best-tag">Nejdéle</span> : null}
                        </div>
                      );
                    })}
                    {funds.length < MAX_CMP ? <div className="cmp-cell" style={{ background: "#fbfbf9" }}></div> : null}
                  </div>

                  {/* Web */}
                  <div className="cmp-row">
                    {attrCell("Web fondu")}
                    {funds.map((x) => (
                      <div key={x.id} className="cmp-cell cmp-val">
                        <a className="row-cta" style={{ opacity: 1 }} href={x.web} target="_blank" rel="noopener noreferrer">Otevřít web ↗</a>
                      </div>
                    ))}
                    {funds.length < MAX_CMP ? <div className="cmp-cell" style={{ background: "#fbfbf9" }}></div> : null}
                  </div>
                </div>
              </div>

              {insight ? (
                <div className="cmp-insight">
                  <span className="ci-bar"></span>
                  <div>
                    <div className="ci-k">Shrnutí srovnání</div>
                    <div className="ci-b">Nejlépe hodnocený je <b>{insight.best}</b>. {insight.body}</div>
                  </div>
                </div>
              ) : (
                <div className="cmp-insight">
                  <span className="ci-bar"></span>
                  <div>
                    <div className="ci-k">Tip</div>
                    <div className="ci-b">Přidejte druhý fond a Srovnávač zvýrazní rozdíly v AUM, hodnocení i délce působení na trhu.</div>
                  </div>
                </div>
              )}
            </React.Fragment>
          )}

          <div className="disclaimer">
            Hodnocení a data fondů vycházejí z veřejně dostupných zdrojů (ČNB, ARES, webové stránky fondů) a v této ukázce jsou ilustrativní. Nepředstavuje investiční poradenství ani doporučení k nákupu.
          </div>
        </div>
      </div>
      <Footer />
    </div>
  );
}

/* small inline add for the trailing column */
function AddCol({ pool, onAdd }) {
  const [open, setOpen] = useState(false);
  const ref = useRef(null);
  useEffect(() => {
    const onDoc = (e) => { if (ref.current && !ref.current.contains(e.target)) setOpen(false); };
    document.addEventListener("mousedown", onDoc);
    return () => document.removeEventListener("mousedown", onDoc);
  }, []);
  return (
    <div className="combo" ref={ref} style={{ minWidth: 0, width: "100%" }}>
      <button className="cmp-add-btn" onClick={() => setOpen((o) => !o)}>＋ Přidat fond</button>
      {open ? (
        <div className="combo-pop" style={{ left: "50%", transform: "translateX(-50%)", width: 280 }}>
          {pool.slice(0, 40).map((x) => (
            <button key={x.id} className="combo-opt" onClick={() => { onAdd(x.id); setOpen(false); }}>
              <span><span className="co-name">{x.name}</span><span className="co-sub">{x.strategy} · {x.manager}</span></span>
              <span className="co-aum">{formatAum(x.aum)}</span>
            </button>
          ))}
        </div>
      ) : null}
    </div>
  );
}

window.CompareApp = CompareApp;
