/* global React, ReactDOM, window */
const { CATEGORIES_EXT, ARTICLES, AUTHORS, TAGS_EXT } = window.cynixDataExt;
const { TAGS_V2 } = window.cynixDataExtV2;
const { SharedMasthead, Breadcrumb, Colophon, findAuthor, findCategory } = window.cynixShared;

const QUERY = "ConoHa VPS";

// Build mock results — re-rank by simple keyword presence
const candidates = ARTICLES.map((a) => {
  let score = 0;
  const haystack = [a.title, a.deck, ...(a.tags || [])].join(" ").toLowerCase();
  ["conoha", "vps", "wordpress", "ベンチ", "高速化"].forEach((kw, i) => {
    if (haystack.includes(kw.toLowerCase())) score += [40, 35, 18, 12, 10][i];
  });
  return { ...a, score: score + (a.featured ? 8 : 0) };
}).filter((a) => a.score > 8).sort((a, b) => b.score - a.score);

const RESULTS = candidates.length >= 4 ? candidates : ARTICLES.slice(0, 6);
const TAG_HITS = Array.from(
  new Map(
    [...TAGS_EXT, ...TAGS_V2]
      .filter((t) => /vps|conoha|wordpress|高速/i.test(t.label))
      .map((t) => [t.slug, t])
  ).values()
).slice(0, 6);
const AUTHOR_HITS = AUTHORS.filter((a) => /vps|conoha|レビュー|編集長/i.test(`${a.role_jp} ${a.bio || ""}`)).slice(0, 3);

// Result row
const ResultRow = ({ a, i }) => {
  const cat = findCategory(a.category);
  const auth = findAuthor(a.author);
  // highlight matched terms
  const highlight = (text) => {
    if (!text) return "";
    const parts = String(text).split(/(ConoHa|VPS|WordPress|高速化)/gi);
    return parts.map((p, idx) =>
      /^(ConoHa|VPS|WordPress|高速化)$/i.test(p)
        ? <mark key={idx} style={{ background: "var(--highlight)", color: "var(--ink)", padding: "0 2px" }}>{p}</mark>
        : p
    );
  };
  return (
    <li className="cross-search-result">
      <div className="rank">
        <span className="lab">RANK</span>
        <span className="n">#{String(i + 1).padStart(2, "0")}</span>
        <span className="score">SCORE {a.score}</span>
      </div>
      <div className="body">
        <div className="meta">
          <span className="cat" style={{ color: cat.accent }}>{cat.title.toUpperCase()}</span>
          <span>·</span>
          <span>{a.published}</span>
          <span>·</span>
          <span>P.{a.pageNum}</span>
          <span>·</span>
          <span>{a.readTime} MIN READ</span>
        </div>
        <a className="title" href={`article-${a.type}.html`}>{highlight(a.title)}</a>
        <p className="deck">{highlight(a.deck)}</p>
        <div className="path">
          cynix.jp / {cat.title} / {a.author} / <span className="hl">…/{a.slug}</span>
        </div>
        <div className="tags">
          {(a.tags || []).slice(0, 5).map((t) => (
            <span key={t} className="cross-tag" style={{ fontSize: 10, padding: "3px 8px" }}>#{t}</span>
          ))}
        </div>
      </div>
      <div className="aside">
        <div style={{ width: 56, height: 56, borderRadius: "50%", background: `var(--cream) center/cover url(${auth.avatar})`, border: "1px solid var(--ink)", marginBottom: 8 }}></div>
        <div style={{ fontFamily: "'Noto Sans JP', serif", fontSize: 12, fontWeight: 700, textAlign: "center" }}>{auth.name_jp}</div>
        <div style={{ fontFamily: "'JetBrains Mono', monospace", fontSize: 9, letterSpacing: "0.1em", textTransform: "uppercase", opacity: 0.6, textAlign: "center", marginTop: 2 }}>{auth.role_en}</div>
      </div>
    </li>
  );
};

const App = () => (
  <div className="cross-shell">
    <SharedMasthead section="SEARCH · INDEX · ALL VOLUMES" />
    <Breadcrumb items={[
      { label: "HOME", href: "cynix-jp.html" },
      { label: "SEARCH" },
      { label: `"${QUERY}"` },
    ]} />

    {/* Search bar — large, like a card catalog */}
    <div style={{
      border: "2px solid var(--ink)", padding: "32px 40px", marginTop: 24, marginBottom: 32,
      background: "var(--paper)", display: "grid", gridTemplateColumns: "auto 1fr auto", gap: 20, alignItems: "center",
    }}>
      <div style={{ fontFamily: "'JetBrains Mono', monospace", fontSize: 11, letterSpacing: "0.2em", color: "var(--vermilion)", fontWeight: 700, textTransform: "uppercase", textAlign: "center" }}>
        SEARCH<br />QUERY
      </div>
      <div style={{ position: "relative", paddingBottom: 8, borderBottom: "1px solid var(--ink)" }}>
        <div style={{ fontFamily: "'Noto Serif JP', serif", fontSize: 36, fontWeight: 700, color: "var(--ink)", lineHeight: 1.1 }}>
          {QUERY}
          <span style={{ display: "inline-block", width: 2, height: 32, background: "var(--vermilion)", marginLeft: 4, animation: "blink 1s steps(2) infinite", verticalAlign: "middle" }}></span>
        </div>
      </div>
      <button style={{
        background: "var(--ink)", color: "var(--paper)", border: "1px solid var(--ink)", padding: "14px 28px",
        fontFamily: "'JetBrains Mono', monospace", fontSize: 12, letterSpacing: "0.15em", fontWeight: 700, textTransform: "uppercase", cursor: "pointer",
      }}>SEARCH ↵</button>
    </div>
    <style>{`@keyframes blink { 0%, 50% { opacity: 1; } 51%, 100% { opacity: 0; } }`}</style>

    {/* Filters / facets row */}
    <div style={{
      display: "grid", gridTemplateColumns: "1fr 1fr 1fr 1fr", gap: 0,
      border: "1px solid var(--ink)", marginBottom: 32,
    }}>
      {[
        { label: "RESULTS", val: RESULTS.length, sub: "ARTICLES" },
        { label: "TAGS", val: TAG_HITS.length, sub: "MATCHED" },
        { label: "AUTHORS", val: AUTHOR_HITS.length, sub: "MATCHED" },
        { label: "TIME", val: "0.08", sub: "SECONDS" },
      ].map((m, i, arr) => (
        <div key={m.label} style={{
          padding: "16px 20px", borderRight: i < arr.length - 1 ? "1px solid var(--ink)" : "none",
          display: "flex", alignItems: "center", justifyContent: "space-between",
        }}>
          <span style={{ fontFamily: "'JetBrains Mono', monospace", fontSize: 10, letterSpacing: "0.15em", color: "var(--vermilion)", fontWeight: 700 }}>{m.label}</span>
          <span>
            <span style={{ fontFamily: "'JetBrains Mono', monospace", fontSize: 24, fontWeight: 700, color: "var(--ink)" }}>{m.val}</span>
            <span style={{ fontFamily: "'JetBrains Mono', monospace", fontSize: 9, letterSpacing: "0.1em", marginLeft: 6, opacity: 0.5 }}>{m.sub}</span>
          </span>
        </div>
      ))}
    </div>

    {/* Sort + filter controls */}
    <div style={{ display: "flex", justifyContent: "space-between", alignItems: "center", marginBottom: 16, padding: "12px 0", borderTop: "1px solid var(--ink)", borderBottom: "1px solid var(--ink)" }}>
      <div style={{ display: "flex", gap: 16, alignItems: "center" }}>
        <span style={{ fontFamily: "'JetBrains Mono', monospace", fontSize: 10, letterSpacing: "0.15em", textTransform: "uppercase", opacity: 0.6 }}>SORT</span>
        {["RELEVANCE", "DATE ↓", "MOST READ", "READ TIME"].map((s, i) => (
          <button key={s} style={{
            background: i === 0 ? "var(--ink)" : "transparent", color: i === 0 ? "var(--paper)" : "var(--ink)",
            border: "1px solid var(--ink)", padding: "4px 12px",
            fontFamily: "'JetBrains Mono', monospace", fontSize: 10, letterSpacing: "0.1em", fontWeight: 700, cursor: "pointer",
          }}>{s}</button>
        ))}
      </div>
      <div style={{ display: "flex", gap: 8, alignItems: "center" }}>
        <span style={{ fontFamily: "'JetBrains Mono', monospace", fontSize: 10, letterSpacing: "0.15em", textTransform: "uppercase", opacity: 0.6 }}>FILTER</span>
        {CATEGORIES_EXT.slice(0, 4).map((c) => (
          <span key={c.id} className="cross-tag" style={{ fontSize: 10 }}>{c.title}</span>
        ))}
      </div>
    </div>

    <div className="cross-2col">
      <div>
        <ul className="cross-search-list">
          {RESULTS.map((a, i) => <ResultRow key={a.slug} a={a} i={i} />)}
        </ul>

        {/* Pagination */}
        <div style={{ display: "flex", justifyContent: "space-between", alignItems: "center", padding: "20px 0", marginTop: 24, borderTop: "1px solid var(--ink)" }}>
          <div style={{ fontFamily: "'JetBrains Mono', monospace", fontSize: 11, letterSpacing: "0.1em", opacity: 0.6 }}>
            SHOWING 1–{RESULTS.length} OF {RESULTS.length}
          </div>
          <div style={{ display: "flex", gap: 8 }}>
            {["←", "1", "2", "3", "→"].map((n, i) => (
              <button key={i} style={{
                width: 36, height: 36, border: "1px solid var(--ink)",
                background: n === "1" ? "var(--ink)" : "var(--paper)",
                color: n === "1" ? "var(--paper)" : "var(--ink)",
                fontFamily: "'JetBrains Mono', monospace", fontWeight: 700, cursor: "pointer",
              }}>{n}</button>
            ))}
          </div>
        </div>
      </div>

      <aside className="cross-aside">
        <div className="card dark">
          <h6>DID YOU MEAN?</h6>
          <div style={{ fontFamily: "'Noto Serif JP', serif", fontSize: 22, fontWeight: 700, color: "var(--highlight)", marginBottom: 8 }}>
            "ConoHa VPS ベンチマーク"
          </div>
          <p style={{ fontSize: 12, opacity: 0.85, margin: 0, lineHeight: 1.6 }}>
            検索クエリに「ベンチマーク」を加えると、80日連続計測の比較記事がトップにきます。
          </p>
        </div>

        <div className="card">
          <h6>MATCHED TAGS</h6>
          <div style={{ display: "flex", flexWrap: "wrap", gap: 6 }}>
            {TAG_HITS.map((t) => (
              <a key={t.slug} href={`tag-archive.html?slug=${t.slug}`} className="cross-tag">
                <span>#{t.label}</span>
                <span className="count">{t.count}</span>
              </a>
            ))}
          </div>
        </div>

        <div className="card">
          <h6>MATCHED AUTHORS</h6>
          <ul>
            {AUTHOR_HITS.map((auth) => (
              <li key={auth.slug} style={{ borderBottom: "1px solid var(--ink)", padding: "10px 0" }}>
                <a href={`/authors/${auth.slug}`} style={{ display: "flex", alignItems: "center", gap: 10 }}>
                  <div style={{ width: 36, height: 36, borderRadius: "50%", background: `var(--cream) center/cover url(${auth.avatar})`, border: "1px solid var(--ink)", flexShrink: 0 }}></div>
                  <div>
                    <div style={{ fontFamily: "'Noto Sans JP', serif", fontWeight: 700, fontSize: 13 }}>{auth.name_jp}</div>
                    <div style={{ fontFamily: "'JetBrains Mono', monospace", fontSize: 9, letterSpacing: "0.1em", textTransform: "uppercase", opacity: 0.6, marginTop: 2 }}>{auth.role_en}</div>
                  </div>
                </a>
              </li>
            ))}
          </ul>
        </div>

        <div className="card">
          <h6>RECENT SEARCHES</h6>
          <ul>
            {["WordPress 高速化", "ConoHa Wing 比較", "Shopify 月商100万", "AWS Lambda Tokyo", "ドメイン .jp 取得"].map((q, i) => (
              <li key={q}>
                <a href="#"><span style={{ color: "var(--vermilion)", fontFamily: "'JetBrains Mono', monospace", fontSize: 10, marginRight: 6 }}>{String(i + 1).padStart(2, "0")}</span>{q}</a>
              </li>
            ))}
          </ul>
        </div>

        <div className="card">
          <h6>SEARCH TIPS</h6>
          <p style={{ fontSize: 12, lineHeight: 1.7, margin: 0 }}>
            ・複数語スペース区切りでAND検索<br />
            ・<code style={{ background: "var(--cream)", padding: "1px 4px" }}>category:review</code> でカテゴリ指定<br />
            ・<code style={{ background: "var(--cream)", padding: "1px 4px" }}>author:naoto</code> で著者指定<br />
            ・<code style={{ background: "var(--cream)", padding: "1px 4px" }}>"完全一致"</code> でフレーズ検索
          </p>
        </div>
      </aside>
    </div>

    <Colophon />
  </div>
);

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