/* jrec-view.jsx — 「記録」タブ。JARA主催大会 2000-2025 の最速記録。
   出典：日本ローイング協会 公式大会結果アーカイブ（非公式利用）。
   全ラウンドから機械的に拾った参考記録で、JARAの公認記録ではない。 */

const JREC_EV = ["M1X","M2X","M2-","M4X","M4-","M4+","M8+","M2+",
                 "W1X","W2X","W2-","W4X","W4+","W8+","W4X+"];
const JREC_EV_L = ["LM1X","LM2X","LM2-","LM4X","LM4-","LM8+","LW1X","LW2X","LW2-","LW4X","LW4X+"];
const JREC_EVNAME = { "M1X":"男子シングルスカル","M2X":"男子ダブルスカル","M2-":"男子ペア",
  "M4X":"男子クォドルプル","M4-":"男子フォア","M4+":"男子舵手つきフォア","M8+":"男子エイト",
  "M2+":"男子舵手つきペア","W1X":"女子シングルスカル","W2X":"女子ダブルスカル","W2-":"女子ペア",
  "W4X":"女子クォドルプル","W4+":"女子舵手つきフォア","W8+":"女子エイト",
  "W4X+":"女子舵手つきクォドルプル" };
const jrecName = (ev) => JREC_EVNAME[ev] || (ev[0] === "L" ? "軽量級 " + (JREC_EVNAME[ev.slice(1)] || ev.slice(1)) : ev);
const jrecSec = (t) => { const m = String(t || "").match(/^(\d+):(\d+(?:\.\d+)?)$/); return m ? +m[1] * 60 + parseFloat(m[2]) : null; };

function JrecView() {
  const J = window.KANSAI.JREC;
  if (!J) return null;
  const [mode, setMode] = React.useState("ev");      // ev=種目別 team=大学別
  const [ev, setEv] = React.useState("M8+");
  const [team, setTeam] = React.useState(null);
  const [q, setQ] = React.useState("");
  const M = J.meta.meets;

  const row = (lb, cls, t, who, sub, base) => {
    const g = base != null && jrecSec(t) != null ? base - jrecSec(t) : null;
    return (
      <div className={"rec-row " + cls} key={lb}>
        <span className="rec-lb">{lb}</span>
        <b className="rec-t">{t}</b>
        <span className="rec-who">{who}</span>
        {g != null && g > 0.001 && <span className="rec-gap">＋{g.toFixed(2)}秒</span>}
        <span className="rec-yr">{sub}</span>
      </div>
    );
  };

  // ── 種目別 ──────────────────────────────────────────────
  const evView = () => {
    const e = J.ev[ev];
    if (!e) return <p className="rec-none">この種目の記録はありません。</p>;
    const IC = (window.KANSAI.RECORDS || {})[ev];
    const U23 = (window.KANSAI.U23 || {})[ev];
    const W = (window.KANSAI.WBT || {})[ev.replace(/^L/, "")];
    const base = IC ? jrecSec(IC.t) : (e.japan ? jrecSec(e.japan.t) : null);
    const meets = Object.entries(e.meet).sort((a, b) => jrecSec(a[1].t) - jrecSec(b[1].t));
    const venues = Object.entries(e.venue).sort((a, b) => jrecSec(a[1].t) - jrecSec(b[1].t));
    return (<>
      <div className="subhead"><IconTrophy className="ic" size={16} />{jrecName(ev)}
        <span className="shsub">{e.n.toLocaleString()}レースから</span></div>
      <div className="recbox">
        {IC && row("インカレ最速", "ic", IC.t, IC.crew, IC.year + "年・" + IC.round, base)}
        {e.univ && row("大学生 日本最速", "univ", e.univ.t, e.univ.o,
          e.univ.y + "年・" + (M[e.univ.m] || e.univ.m), base)}
        {e.japan && row("日本最速", "jp", e.japan.t, e.japan.o,
          e.japan.y + "年・" + (M[e.japan.m] || e.japan.m), base)}
        {U23 && U23.t && row("U23世界最速", "u23", U23.t, U23.crew, U23.year + "年・" + (U23.venue || ""), base)}
        {W && row("世界最速", "wbt", W.t, W.crew, W.year + "年・" + (W.venue || ""), base)}
      </div>
      <div className="subhead" style={{ marginTop: 16 }}>大会別の最速</div>
      <div className="jrl">
        {meets.map(([k, r]) => (
          <div className="jrl-row" key={k}>
            <span className="jrl-m">{M[k] || k}</span>
            <b className="jrl-t">{r.t}</b>
            <span className="jrl-o">{r.o}</span>
            <span className="jrl-y">{r.y}年 {r.r}</span>
          </div>
        ))}
      </div>
      <div className="subhead" style={{ marginTop: 16 }}>会場別の最速<span className="shsub">コースレコード</span></div>
      <div className="jrl">
        {venues.map(([k, r]) => (
          <div className="jrl-row" key={k}>
            <span className="jrl-m">{k}</span>
            <b className="jrl-t">{r.t}</b>
            <span className="jrl-o">{r.o}</span>
            <span className="jrl-y">{r.y}年 {M[r.m] || r.m}</span>
          </div>
        ))}
      </div>
    </>);
  };

  // ── 大学別 ──────────────────────────────────────────────
  const teamView = () => {
    if (team) {
      const t = J.teams[team] || {};
      const evs = JREC_EV.concat(JREC_EV_L).filter((x) => t[x]);
      return (<>
        <button className="jr-back" onClick={() => setTeam(null)}>← 大学一覧へ</button>
        <div className="subhead"><IconTrophy className="ic" size={16} />{team}
          <span className="shsub">{evs.length}種目</span></div>
        <p className="sizenote" style={{ margin: "0 2px 8px" }}>
          2000〜2025年のJARA主催大会で、この大学が出したいちばん速いタイムです。
        </p>
        <div className="jrl">
          {evs.map((x) => {
            const r = t[x], j = J.ev[x];
            const best = j && j.univ ? jrecSec(j.univ.t) : null;
            const d = best != null ? jrecSec(r.t) - best : null;
            const top = d != null && d < 0.001;
            return (
              <div className={"jrl-row" + (top ? " best" : "")} key={x}>
                <span className="jrl-m">{x}</span>
                <b className="jrl-t">{r.t}</b>
                <span className="jrl-o">{M[r.m] || r.m} {r.r}</span>
                <span className="jrl-y">{r.y}年{top ? " ★大学生日本最速" : (d != null ? " ＋" + d.toFixed(1) + "秒" : "")}</span>
              </div>
            );
          })}
        </div>
      </>);
    }
    const names = Object.keys(J.teams).filter((n) => !q || n.indexOf(q) >= 0)
      .sort((a, b) => Object.keys(J.teams[b]).length - Object.keys(J.teams[a]).length
        || a.localeCompare(b, "ja"));
    return (<>
      <div className="subhead"><IconTeams className="ic" size={16} />大学別の最速記録
        <span className="shsub">{J.meta.teams}校</span></div>
      <input className="jr-q" value={q} onChange={(e) => setQ(e.target.value)} placeholder="大学名で絞り込み" />
      <div className="jrt">
        {names.map((n) => (
          <button className="jrt-b" key={n} onClick={() => setTeam(n)}>
            <span className="jrt-n">{n}</span>
            <span className="jrt-c">{Object.keys(J.teams[n]).length}種目</span>
          </button>
        ))}
      </div>
    </>);
  };

  return (
    <div className="view">
      <div className="chips jr-mode">
        <button className={"chip" + (mode === "ev" ? " on" : "")} onClick={() => { setMode("ev"); setTeam(null); }}>種目別</button>
        <button className={"chip" + (mode === "team" ? " on" : "")} onClick={() => setMode("team")}>大学別</button>
      </div>
      {mode === "ev" && (
        <div className="chips">
          {JREC_EV.filter((x) => J.ev[x]).map((x) => (
            <button className={"chip" + (ev === x ? " on" : "")} key={x} onClick={() => setEv(x)}>{x}</button>
          ))}
          {JREC_EV_L.filter((x) => J.ev[x]).map((x) => (
            <button className={"chip lw" + (ev === x ? " on" : "")} key={x} onClick={() => setEv(x)}>{x}</button>
          ))}
        </div>
      )}
      {mode === "ev" ? evView() : teamView()}
      <p className="sizenote" style={{ margin: "14px 2px 0" }}>
        日本ローイング協会の公式アーカイブから、全日本選手権・インカレ・オックスフォード盾・
        ジャパンオープン・全日本新人・全日本社会人・全日本軽量級の
        {J.meta.years[0]}〜{J.meta.years[1]}年、<b>{J.meta.rows.toLocaleString()}レース</b>を集計しました。
        <br />予選から決勝まで全ラウンドのタイムが対象です。風で大きく変わるため<b>参考記録</b>で、
        JARAが認定した記録ではありません。年齢別・B級（1000m）・ナックルフォア・パラ・
        ジュニアの各種目は除いています。大学には大学混成・大学院・高専を含み、OB艇は含みません。
      </p>
    </div>
  );
}
