/* history-view.jsx — 「歴史」タブ。インカレ歴代優勝（1974–2025・全52大会）。
   出典：ローイング（ボート競技）のデータ集 https://sites.google.com/site/jpnrowingdata/college
   事実のみ。分からないものは「調査中」と表示する（創作しない）。 */

// 種目コード（歴代表記 M8+ / W4X+ …）→ 今大会の EVENTS.key。無い種目は null。
const HIST_EV2KEY = { "M8+": "m8", "M4+": "m4c", "M4-": "m4n", "M4X": "m4x", "M2X": "m2x",
  "M2-": "m2n", "M1X": "m1x", "W8+": "w8", "W4X": "w4x", "W4X+": null, "W4+": "w4c",
  "W2X": "w2x", "W1X": "w1x", "W2-": "w2n", "M2+": null, "軽量M4+": null };
// 種目タブの並び（小さい艇→大きい艇、男子→女子、最後に現在は行われていない種目）
const HIST_EV_ORDER = ["M1X", "M2X", "M2-", "M4X", "M4-", "M4+", "M8+",
                       "W1X", "W2X", "W2-", "W4X", "W4+", "W8+",
                       "M2+", "W4X+", "軽量M4+"];
const HIST_EV_NAME = { "M1X": "男子シングルスカル", "M2X": "男子ダブルスカル", "M2-": "男子ペア",
  "M4X": "男子クォドルプル", "M4-": "男子フォア", "M4+": "男子舵手つきフォア", "M8+": "男子エイト",
  "W1X": "女子シングルスカル", "W2X": "女子ダブルスカル", "W2-": "女子ペア", "W4X": "女子クォドルプル",
  "W4+": "女子舵手つきフォア", "W8+": "女子エイト", "M2+": "男子舵手つきペア",
  "W4X+": "女子舵手つきクォドルプル", "軽量M4+": "軽量級 男子舵手つきフォア" };

function HistBar({ rows, unit, max, onTeam }) {
  return (
    <div className="mbt-sec"><div className="mbt-chart">
      {rows.map((r, i) => {
        const tie = i > 0 && r.n === rows[i - 1].n;
        return (
          <div className="mbt-item" key={r.team + i}>
            <div className="mbt-row entval-row" style={{ cursor: onTeam ? "pointer" : "default" }}
                 onClick={onTeam ? () => onTeam(r) : undefined}>
              <span className="mbt-rk">{tie ? "=" : (i + 1)}</span>
              <span className="mbt-tm">{r.disp || r.team}</span>
              <span className="mbt-barwrap">
                <span className="mbt-bar"><span className="mbt-fill hist" style={{ width: (r.n / max * 100) + "%" }} /></span>
                <span className="mbt-val entval">
                  <span className="entcell tot"><b>{r.n}</b><span className="entu">{unit}</span></span>
                </span>
              </span>
            </div>
          </div>
        );
      })}
    </div></div>
  );
}

function HistoryView({ goTab, onOpenTeam }) {
  const H = window.KANSAI.HISTORY, RW = window.RW;
  const [tab, setTab] = React.useState("rank");
  const [openTeam, setOpenTeam] = React.useState(null);
  const [rankScope, setRankScope] = React.useState("all"); // "all"=全団体 / "now"=今大会の出場校
  // 総合3つ → 種目別（今大会の実施種目が先、廃止種目は後ろ）
  const evTabs = HIST_EV_ORDER.filter((e) => H.byEvent[e]);
  const TABS = [["rank", "優勝回数"], ["streak", "連覇・記録"], ["chrono", "年表"]]
    .concat(evTabs.map((e) => ["ev:" + e, e]));
  const S = H.stats;

  // 今大会インカレ部門の団体（正式名）
  const icTeams = React.useMemo(() => {
    const set = new Set();
    RW.EVENTS.filter((e) => e.div === "intercollege").forEach((e) =>
      e.entries.forEach((en) => set.add(RW.baseTeam(en.team))));
    return [...set];
  }, []);

  return (
    <section className="view">
      <div className="shead"><span className="tag"><span>HISTORY</span></span><span className="jp">歴史</span>
        <span className="sp" /><span className="meta">{S.editions}大会 · {S.titles}冠</span></div>

      <div className="histlead">
        第1回（1974年）から第52回（2025年）まで、<b>{S.editions}大会・{S.titles}冠</b>の記録。
        優勝校が判明しているのは{S.known}冠（1997年 W2- の1冠は原典で「調査中」）、
        延べ<b>{S.teams}団体</b>が頂点に立ちました。
        <span className="histnote">※1974年 第1回は荒天で決勝中止のため優勝校なし。1990年以前のスカラーは原典が姓のみの表記です。</span>
      </div>

      <div className="chips">
        {TABS.map(([k, l]) => (
          <button key={k} className={"chip" + (tab === k ? " on" : "")} onClick={() => setTab(k)}>{l}</button>
        ))}
      </div>

      {/* ── 通算優勝回数 ── */}
      {tab === "rank" && (() => {
        const nowRows = icTeams.map((t) => ({ t, h: H.forEntryTeam(t) })).filter((x) => x.h)
          .map((x) => ({ team: x.t, n: x.h.n, first: x.h.first, last: x.h.last, evs: x.h.evs }))
          .sort((a, b) => b.n - a.n);
        const none = icTeams.filter((t) => !H.forEntryTeam(t));
        const rows = rankScope === "now" ? nowRows
          : H.teamRank.map((t) => ({ ...t, disp: H.disp(t.team) }));
        const sum = nowRows.reduce((n, x) => n + x.n, 0);
        return (<>
          <div className="mtoggle" style={{ marginTop: 10 }}>
            <button type="button" className={rankScope === "all" ? "on" : ""} onClick={() => setRankScope("all")}>全団体</button>
            <button type="button" className={rankScope === "now" ? "on" : ""} onClick={() => setRankScope("now")}>今大会の出場校</button>
          </div>
          {rankScope === "now" && (
            <p className="histlead sm">
              今年インカレを漕ぐ{icTeams.length}団体のうち<b>{nowRows.length}団体</b>が優勝経験校。
              その合計は<b>{sum}冠</b>で、歴代{H.stats.known}冠の大半がこの水上にあります。
              残る<b>{none.length}団体</b>は初タイトルに挑みます。
            </p>
          )}
          <div className="subhead"><IconTrophy className="ic" size={16} />通算優勝回数<span className="shsub">1974–2025</span></div>
          <HistBar rows={rows} unit="冠" max={rows[0].n}
            onTeam={(r) => setOpenTeam(openTeam === r.team ? null : r.team)} />
          {rankScope === "now" && (() => {
            const none2 = icTeams.filter((t) => !H.forEntryTeam(t));
            const gaps = rows.slice().sort((a, b) => a.last - b.last).slice(0, 10);
            return (<>
              <div className="subhead" style={{ marginTop: 18 }}>初優勝を狙う{none2.length}団体</div>
              <div className="histchips">{none2.map((t) => <span className="histchip" key={t}>{t}</span>)}</div>
              <div className="subhead" style={{ marginTop: 18 }}>何年ぶりの栄冠か</div>
              <div className="histgap">
                {gaps.map((x) => (
                  <div className="histgaprow" key={x.team}>
                    <span className="gt">{x.team}</span><span className="gy">{x.last}年 以来</span>
                    <span className="gn"><b>{2026 - x.last}</b>年ぶり</span>
                  </div>
                ))}
              </div>
            </>);
          })()}
          {openTeam && (() => {
            const t = rows.find((x) => x.team === openTeam);
            const evs = Object.keys(t.evs).sort((a, b) => t.evs[b] - t.evs[a]);
            return (
              <div className="histdetail">
                <b>{t.disp || t.team}</b>　{t.first}年 初優勝 ・ {t.last}年 最新優勝
                <div className="histevs">{evs.map((e) => <span key={e} className="histev">{e} <b>{t.evs[e]}</b></span>)}</div>
              </div>
            );
          })()}
        </>);
      })()}

      {/* ── 連覇・記録 ── */}
      {tab === "streak" && (() => {
        const live = H.bestStreaks.filter((s) => s.live);
        const past = H.bestStreaks.filter((s) => !s.live);
        const firsts = {};
        H.known.forEach((r) => { if (!firsts[r.team] || r.year < firsts[r.team].year) firsts[r.team] = { team: r.team, year: r.year, ev: r.ev }; });
        const newest = Object.values(firsts).sort((a, b) => b.year - a.year).slice(0, 8);
        return (<>
          {live.length > 0 && (<>
            <div className="subhead"><IconFlame className="ic" size={16} />継続中の連覇<span className="shsub">2026年に記録が伸びるか</span></div>
            <div className="histstreaks">
              {live.map((s, i) => (
                <div className="hstk live" key={i}>
                  <span className="hstk-n"><b>{s.n}</b>連覇中</span>
                  <span className="hstk-b"><b>{H.disp(s.team)}</b>　{s.ev}</span>
                  <span className="hstk-y">{s.from}–{s.to}</span>
                </div>
              ))}
            </div>
          </>)}
          <div className="subhead" style={{ marginTop: 16 }}><IconTrophy className="ic" size={16} />歴代の連覇記録<span className="shsub">3連覇以上</span></div>
          <div className="histstreaks">
            {past.slice(0, 18).map((s, i) => (
              <div className="hstk" key={i}>
                <span className="hstk-n"><b>{s.n}</b>連覇</span>
                <span className="hstk-b"><b>{H.disp(s.team)}</b>　{s.ev}</span>
                <span className="hstk-y">{s.from}–{s.to}</span>
              </div>
            ))}
          </div>
          <div className="subhead" style={{ marginTop: 18 }}>新しく生まれた王者<span className="shsub">初優勝が新しい順</span></div>
          <div className="histgap">
            {newest.map((f) => (
              <div className="histgaprow" key={f.team}>
                <span className="gt">{H.disp(f.team)}</span><span className="gy">{f.ev}</span><span className="gn"><b>{f.year}</b>年 初優勝</span>
              </div>
            ))}
          </div>
        </>);
      })()}

      {/* ── 年表 ── */}
      {tab === "chrono" && (() => {
        const DEF = H.defending;
        return (<>
          <div className="subhead"><IconMedal className="ic" size={16} />前回大会の王者<span className="shsub">2025年 第52回</span></div>
          <div className="histchips">
            {DEF.map((d, i) => (
              <span className="histchip def" key={i}>{d.ev} <b>{H.disp(d.team)}</b>{d.athlete ? "（" + d.athlete + "）" : ""}</span>
            ))}
          </div>
          <div className="subhead" style={{ marginTop: 18 }}><IconCal className="ic" size={16} />年表<span className="shsub">新しい順</span></div>
          <div className="histyears">
            {H.YEARS.slice().reverse().map(([year, wa, ed, wins, note]) => (
              <div className="hy" key={year}>
                <div className="hy-h"><b>{year}</b><span className="hy-wa">{wa}</span><span className="hy-ed">第{ed}回</span></div>
                {note ? <div className="hy-note">{note}</div> : (
                  <div className="hy-wins">
                    {wins.map(([ev, team, ath], i) => (
                      <span className="hy-w" key={i}><i className={ev.charAt(0) === "W" ? "w" : ""}>{ev}</i>{H.disp(team)}{ath ? "（" + ath + "）" : ""}</span>
                    ))}
                  </div>
                )}
              </div>
            ))}
          </div>
        </>);
      })()}

      {/* ── 種目別（1974〜2025のその種目だけ） ── */}
      {tab.indexOf("ev:") === 0 && (() => {
        const ev = tab.slice(3);
        const E = H.byEvent[ev];
        const list = H.rows.filter((r) => r.ev === ev).sort((a, b) => b.year - a.year);
        const held = !!HIST_EV2KEY[ev] && RW.EVENTS.some((x) => x.key === HIST_EV2KEY[ev]);
        const scull = list.some((r) => r.athlete);
        const streaks = H.bestStreaks.filter((x) => x.ev === ev);
        const yrs = list.map((r) => r.year);
        return (<>
          <div className="subhead"><IconTrophy className="ic" size={16} />{ev}　{HIST_EV_NAME[ev] || ""}
            <span className="shsub">{E.n}大会</span></div>
          <p className="histlead sm">
            {Math.min.apply(null, yrs)}年〜{Math.max.apply(null, yrs)}年に<b>{E.n}回</b>実施。
            最多優勝は<b>{H.disp(E.top[0].team)}</b>の{E.top[0].n}回。
            {held ? "　今大会も実施されます。" : "　※この種目は現在は行われていません。"}
            {scull ? "　歴代の優勝者名が残っている種目です。" : ""}
          </p>
          {streaks.length > 0 && (
            <div className="histstreaks" style={{ marginBottom: 12 }}>
              {streaks.slice(0, 3).map((x, i) => (
                <div className={"hstk" + (x.live ? " live" : "")} key={i}>
                  <span className="hstk-n"><b>{x.n}</b>{x.live ? "連覇中" : "連覇"}</span>
                  <span className="hstk-b"><b>{H.disp(x.team)}</b></span>
                  <span className="hstk-y">{x.from}–{x.to}</span>
                </div>
              ))}
            </div>
          )}
          <div className="subhead">優勝回数</div>
          <HistBar rows={E.top.map((t) => ({ ...t, disp: H.disp(t.team) }))} unit="回" max={E.top[0].n} />
          <div className="subhead" style={{ marginTop: 18 }}>歴代優勝{scull ? "者" : "校"}<span className="shsub">新しい順</span></div>
          <div className="histscull">
            {list.map((r, i) => (
              <div className="hsrow" key={i}>
                <span className="hsy">{r.year}</span>
                {scull
                  ? <><span className="hsn">{r.athlete || "—"}</span><span className="hst">{H.disp(r.team)}</span></>
                  : <span className="hsn">{H.disp(r.team)}</span>}
              </div>
            ))}
          </div>
        </>);
      })()}

      <p className="evnote histsrc">
        出典：<a href={H.SOURCE.url} target="_blank" rel="noopener noreferrer">{H.SOURCE.name}</a>。
        当サイトは非公式のため、記録の正確性は出典元をご確認ください。
        歴代の大学名は当時の表記（短縮名）のまま掲載しています。
      </p>
    </section>
  );
}
Object.assign(window, { HistoryView });
