// ===========================================================
// Article card — featured + standard variants
// ===========================================================
const useBookmark = (id) => {
  const [marked, setMarked] = React.useState(() => {
    try { return JSON.parse(localStorage.getItem("bm") || "{}")[id] || false; } catch { return false; }
  });
  const toggle = (e) => {
    e.preventDefault(); e.stopPropagation();
    const next = !marked;
    setMarked(next);
    try {
      const map = JSON.parse(localStorage.getItem("bm") || "{}");
      map[id] = next;
      localStorage.setItem("bm", JSON.stringify(map));
    } catch {}
  };
  return [marked, toggle];
};

const BookmarkBtn = ({ id }) => {
  const [marked, toggle] = useBookmark(id);
  return (
    <button
      className={"bookmark-btn " + (marked ? "is-marked" : "")}
      aria-label={marked ? "ブックマーク解除" : "ブックマーク"}
      onClick={toggle}
    >
      <Icon name="bookmark" size={15} color={marked ? "#fff" : "#6f8166"} />
    </button>
  );
};

const ArticleCard = ({ article, variant = "standard" }) => {
  if (variant === "featured") {
    return (
      <article className="card card-featured">
        <div className="card-media">
          <Placeholder id={`art-${article.id}-hero`} label={"FEATURED ・ " + article.category} ratio="16/10" tone={article.tone} rounded={16} />
          <span className="featured-badge"><Icon name="sparkle" size={12} color="#7ea372" /> 編集部のおすすめ</span>
          <BookmarkBtn id={`art-${article.id}`} />
        </div>
        <div className="card-body">
          <div className="card-top">
            <Chip label={article.category} />
            <Meta date={article.date} read={article.read} views={article.views} />
          </div>
          <h2 className="card-title-lg">{article.title}</h2>
          <p className="card-excerpt">{article.excerpt}</p>
          <div className="card-foot">
            <div className="card-tags">
              {article.tags.map(t => <span key={t} className="tag-mini">#{t}</span>)}
            </div>
            <a className="read-link" href="#">続きを読む <Icon name="arrow" size={14} /></a>
          </div>
        </div>
      </article>
    );
  }
  return (
    <article className="card card-standard">
      <div className="card-media-sm">
        <Placeholder id={`art-${article.id}-thumb`} label={article.category} ratio="4/3" tone={article.tone} rounded={12} />
        <BookmarkBtn id={`art-${article.id}`} />
      </div>
      <div className="card-body-sm">
        <div className="card-top">
          <Chip label={article.category} />
          <span className="meta-item small"><Icon name="calendar" size={12} /> {article.date}</span>
        </div>
        <h3 className="card-title">{article.title}</h3>
        <p className="card-excerpt">{article.excerpt}</p>
        <div className="card-foot">
          <span className="meta-item small"><Icon name="clock" size={12} /> {article.read}分</span>
          <span className="meta-dot"></span>
          <span className="meta-item small"><Icon name="eye" size={12} /> {article.views.toLocaleString()}</span>
          <a className="read-link sm" href="#">読む <Icon name="chevron" size={12} /></a>
        </div>
      </div>
    </article>
  );
};

// ===========================================================
// Article list — filter bar + sort + pagination
// ===========================================================
const ArticleList = ({ articles, activeCat, setActiveCat, sort, setSort, page, setPage }) => {
  const cats = ["すべて", ...Object.keys(CATEGORY_STYLE)];
  const featured = articles.find(a => a.featured);
  const rest = articles.filter(a => !a.featured);

  return (
    <section className="article-list">
      <div className="list-head">
        <div>
          <h2 className="section-title"><span className="title-leaf"><Icon name="leaf" size={16} color="#7ea372" /></span> 記事一覧</h2>
          <p className="section-sub">あなたの状況に合わせて、ゆっくり読み進めてください。</p>
        </div>
        <div className="sort">
          <span>並び順</span>
          <select value={sort} onChange={(e) => setSort(e.target.value)}>
            <option value="new">新着順</option>
            <option value="popular">人気順</option>
            <option value="read">読了時間が短い順</option>
          </select>
        </div>
      </div>

      <div className="filter-bar">
        {cats.map(c => (
          <button
            key={c}
            className={"filter-pill " + (activeCat === c ? "is-active" : "")}
            onClick={() => setActiveCat(c)}
          >
            {c !== "すべて" && <span className="filter-dot" style={{ background: CATEGORY_STYLE[c]?.dot || "#bbb" }} />}
            {c}
          </button>
        ))}
      </div>

      {featured && activeCat === "すべて" && <ArticleCard article={featured} variant="featured" />}

      <div className="grid">
        {rest.map(a => <ArticleCard key={a.id} article={a} variant="standard" />)}
      </div>

      <div className="pagination">
        <button className="page-btn ghost" disabled={page === 1} onClick={() => setPage(Math.max(1, page - 1))}>
          ← 前へ
        </button>
        {[1,2,3,4,5].map(p => (
          <button key={p} className={"page-btn " + (page === p ? "is-active" : "")} onClick={() => setPage(p)}>{p}</button>
        ))}
        <span className="page-ellipsis">…</span>
        <button className="page-btn" onClick={() => setPage(11)}>11</button>
        <button className="page-btn ghost" onClick={() => setPage(page + 1)}>次へ →</button>
      </div>
    </section>
  );
};

// ===========================================================
// Sidebar
// ===========================================================
const Sidebar = ({ activeCat, setActiveCat, query, setQuery }) => (
  <aside className="sidebar">
    {/* Profile */}
    <div className="side-card profile-card">
      <div className="profile-cover"></div>
      <div className="profile-avatar">
        <Placeholder id="profile-avatar" label="運営者" ratio="1/1" tone="cream" rounded={999} shape="circle" />
      </div>
      <div className="profile-body">
        <h3>ふみ <span className="profile-handle">@fumi_career</span></h3>
        <p className="profile-bio">
          2回の転職経験を経て、いまは在宅で働くWebライター。「誰かの転職が、少しだけやわらかくなりますように」を願って書いています。
        </p>
        <div className="profile-stats">
          <div><strong>84</strong><span>記事</span></div>
          <div><strong>3.2k</strong><span>読者</span></div>
          <div><strong>5年</strong><span>運営</span></div>
        </div>
        <button className="ghost-btn">
          <Icon name="user" size={14} /> プロフィールを見る
        </button>
      </div>
    </div>

    {/* Today's words — essay micro-card */}
    <div className="side-card essay-card">
      <div className="essay-mark">
        <span className="essay-day">今日</span>
        <span className="essay-date">04 / 28</span>
      </div>
      <p className="essay-text">
        「焦らなくていい。」<br/>
        いま立ち止まれていることも、<br/>
        ひとつの大切な選択です。
      </p>
      <div className="essay-foot">
        <Placeholder id="essay-avatar" label="ふみ" ratio="1/1" tone="cream" rounded={999} shape="circle" style={{ width: 28, height: 28 }} />
        <span>ふみ ・ 朝のひとこと</span>
      </div>
    </div>

    {/* Search */}
    <div className="side-card">
      <h3 className="side-title"><Icon name="search" size={15} color="#7ea372" /> サイト内検索</h3>
      <div className="side-search">
        <input
          type="text"
          placeholder="キーワードを入力"
          value={query}
          onChange={(e) => setQuery(e.target.value)}
        />
        <button><Icon name="search" size={15} color="#fff" /></button>
      </div>
    </div>

    {/* Categories */}
    <div className="side-card">
      <h3 className="side-title"><Icon name="bookmark" size={15} color="#7ea372" /> カテゴリ</h3>
      <ul className="cat-list">
        {CATEGORIES.map(c => {
          const matchKey = c.name === "すべての記事" ? "すべて" : c.name.replace("マインド・不安", "マインド・不安");
          const isActive = (matchKey === activeCat) || (c.name === "すべての記事" && activeCat === "すべて");
          const style = CATEGORY_STYLE[c.name] || { dot: "#7ea372" };
          return (
            <li key={c.name}>
              <button
                className={"cat-row " + (isActive ? "is-active" : "")}
                onClick={() => setActiveCat(c.name === "すべての記事" ? "すべて" : c.name)}
              >
                <span className="cat-dot" style={{ background: style.dot }} />
                <span className="cat-name">{c.name}</span>
                <span className="cat-count">{c.count}</span>
              </button>
            </li>
          );
        })}
      </ul>
    </div>

    {/* Popular */}
    <div className="side-card">
      <h3 className="side-title"><Icon name="heart" size={15} color="#c98c8c" /> 人気の記事</h3>
      <ol className="pop-list">
        {POPULAR.map(p => (
          <li key={p.rank}>
            <span className={"pop-rank rank-" + p.rank}>{String(p.rank).padStart(2, "0")}</span>
            <a href="#" className="pop-link">
              <span className="pop-title">{p.title}</span>
              <span className="pop-meta"><Icon name="eye" size={11} /> {p.views.toLocaleString()}</span>
            </a>
          </li>
        ))}
      </ol>
    </div>

    {/* Tags */}
    <div className="side-card">
      <h3 className="side-title"><Icon name="tag" size={15} color="#7ea372" /> タグから探す</h3>
      <div className="tag-cloud">
        {TAGS.map(t => <a key={t} className="tag-cloud-item" href="#">#{t}</a>)}
      </div>
    </div>

    {/* Newsletter */}
    <div className="side-card cta-card">
      <div className="cta-leaf"><Icon name="leaf" size={28} color="#7ea372" /></div>
      <h3>ニュースレター</h3>
      <p>新着記事と、月1回のやさしいエッセイをお届けします。</p>
      <form onSubmit={(e) => e.preventDefault()}>
        <input type="email" placeholder="メールアドレス" />
        <button>登録する</button>
      </form>
      <span className="cta-note">いつでも解除できます</span>
    </div>
  </aside>
);

Object.assign(window, { ArticleCard, ArticleList, Sidebar });
