/* ============================================================
   HighlightsView — 大会ハイライト自動まとめ
   window.RW.realRaces を同期的に走査し、
   1) 大接戦（A〜C決勝の1-2着差が小さい順）
   2) 大逆転（1000m通過順位からの順位アップ）
   3) 圧勝（1-2着差が大きい順）
   を自動抽出して表示する。propsなし・取得なし。
   ============================================================ */

/* ---- 時間文字列 "6:02.40" → 秒（数値）。読めなければ null ---- */
function hl2Sec(t) {
  if (!t || typeof t !== 'string') return null;
  var m = t.trim().match(/^(\d+):(\d{1,2}(?:\.\d+)?)$/);
  if (!m) return null;
  var s = parseInt(m[1], 10) * 60 + parseFloat(m[2]);
  return isFinite(s) ? s : null;
}

/* ---- 秒差の表示。「0.18秒差」「1分12.3秒差」 ---- */
function hl2FmtDiff(d) {
  if (d == null) return '';
  if (d >= 60) {
    var mm = Math.floor(d / 60);
    var ss = d - mm * 60;
    return mm + '分' + ss.toFixed(1) + '秒差';
  }
  return d.toFixed(2) + '秒差';
}

/* ---- 艇の表示名。スカルは選手名（高校など isMinorTeam は非表示） ---- */
function hl2BoatLabel(lane) {
  var RW = window.RW || {};
  var team = lane.team || '';
  var base = team;
  try { if (RW.baseTeam) base = RW.baseTeam(team) || team; } catch (e) {}
  var minor = false;
  try { if (RW.isMinorTeam) minor = !!RW.isMinorTeam(team); } catch (e) {}
  if (lane.name && !minor) return { main: lane.name, sub: base };
  return { main: base, sub: null };
}

function hl2BoatText(lane) {
  var l = hl2BoatLabel(lane);
  return l.sub ? l.main + '（' + l.sub + '）' : l.main;
}

/* ---- ラウンド表示。「予選 3組」「A決勝」 ---- */
function hl2RoundText(race) {
  var r = race.round || '';
  var g = race.grp || '';
  return g ? r + ' ' + g : r;
}

/* ---- 全種目の全レースを {ev, race} の配列に ---- */
function hl2AllRaces() {
  var RW = window.RW || {};
  var events = RW.EVENTS || [];
  var out = [];
  events.forEach(function (ev) {
    var rs = [];
    try { rs = (RW.realRaces && RW.realRaces(ev.key)) || []; } catch (e) { rs = []; }
    rs.forEach(function (race) {
      if (race && race.lanes && race.lanes.length) out.push({ ev: ev, race: race });
    });
  });
  return out;
}

/* ---- レース内の有効艇（status なし・t2000 が読める）を着順に ---- */
function hl2Finishers(race) {
  return (race.lanes || [])
    .filter(function (l) { return !l.status && hl2Sec(l.t2000) != null; })
    .slice()
    .sort(function (a, b) { return hl2Sec(a.t2000) - hl2Sec(b.t2000); });
}

/* ---- 抽出本体 ---- */
function hl2Build() {
  var all = hl2AllRaces();
  var FINALS = { 'A決勝': 1, 'B決勝': 1, 'C決勝': 1 };

  var margins = [];   // 1-2着差（全レース共通の素材）
  var comebacks = []; // 逆転

  all.forEach(function (item) {
    var fin = hl2Finishers(item.race);

    /* 1-2着差 */
    if (fin.length >= 2) {
      var s1 = hl2Sec(fin[0].t2000);
      var s2 = hl2Sec(fin[1].t2000);
      margins.push({
        ev: item.ev, race: item.race,
        first: fin[0], second: fin[1],
        diff: s2 - s1,
        isFinal: !!FINALS[item.race.round]
      });
    }

    /* 逆転：t1000 のある艇だけで通過順位をつくる */
    var passers = fin.filter(function (l) { return hl2Sec(l.t1000) != null; });
    if (passers.length >= 2) {
      var byPass = passers.slice().sort(function (a, b) { return hl2Sec(a.t1000) - hl2Sec(b.t1000); });
      var goalPos = {};
      fin.forEach(function (l, i) { goalPos[l.lane] = i + 1; });
      byPass.forEach(function (l, i) {
        var p = i + 1;
        var g = goalPos[l.lane];
        var jump = p - g;
        if (jump >= 2) {
          comebacks.push({ ev: item.ev, race: item.race, lane: l, passPos: p, goalPos: g, jump: jump });
        }
      });
    }
  });

  /* 1) 大接戦：A〜C決勝のみ、差が小さい順に5件 */
  var close = margins
    .filter(function (m) { return m.isFinal; })
    .sort(function (a, b) { return a.diff - b.diff; })
    .slice(0, 5);

  /* 2) 大逆転：上がった順位が大きい順に5件（同数ならゴール上位を先に） */
  comebacks.sort(function (a, b) {
    if (b.jump !== a.jump) return b.jump - a.jump;
    return a.goalPos - b.goalPos;
  });
  var jumps = comebacks.slice(0, 5);

  /* 3) 圧勝：差が大きい順に3件 */
  var blowouts = margins
    .slice()
    .sort(function (a, b) { return b.diff - a.diff; })
    .slice(0, 3);

  return { total: all.length, close: close, jumps: jumps, blowouts: blowouts };
}

/* ---- 種目チップ ---- */
function Hl2Chip(props) {
  var ev = props.ev;
  var cls = 'hl2-code ' + (ev.cat === 'w' ? 'hl2-code--w' : 'hl2-code--m');
  return React.createElement('span', { className: cls }, ev.code || ev.key);
}

/* ---- 1-2着差の行（大接戦・圧勝で共用） ---- */
function Hl2MarginRow(props) {
  var m = props.item;
  var photo = props.photo && m.diff < 0.5;
  return (
    <li className={'hl2-row' + (photo ? ' hl2-row--photo' : '')}>
      <div className="hl2-race">
        <Hl2Chip ev={m.ev} />
        <span className="hl2-evname">{m.ev.name}</span>
        <span className="hl2-round">{hl2RoundText(m.race)}</span>
      </div>
      <div className="hl2-body">
        <div className="hl2-who">
          <span className="hl2-boat">{hl2BoatText(m.first)}</span>
          <span className="hl2-vs">対</span>
          <span className="hl2-boat">{hl2BoatText(m.second)}</span>
        </div>
        <div className="hl2-detail">1着 {m.first.t2000} ／ 2着 {m.second.t2000}</div>
      </div>
      <div className="hl2-num">
        <span className="hl2-num-v">{hl2FmtDiff(m.diff)}</span>
        {photo && <span className="hl2-band">写真判定級</span>}
      </div>
    </li>
  );
}

/* ---- 逆転の行 ---- */
function Hl2JumpRow(props) {
  var c = props.item;
  return (
    <li className="hl2-row">
      <div className="hl2-race">
        <Hl2Chip ev={c.ev} />
        <span className="hl2-evname">{c.ev.name}</span>
        <span className="hl2-round">{hl2RoundText(c.race)}</span>
      </div>
      <div className="hl2-body">
        <div className="hl2-who">
          <span className="hl2-boat">{hl2BoatText(c.lane)}</span>
        </div>
        <div className="hl2-detail">1000m時点 {c.passPos}位 → ゴール {c.goalPos}着（{c.lane.t2000}）</div>
      </div>
      <div className="hl2-num">
        <span className="hl2-num-v">{c.passPos}位→{c.goalPos}着</span>
        <span className="hl2-num-l">{c.jump}つ順位を上げた</span>
      </div>
    </li>
  );
}

/* ---- セクション枠 ---- */
function Hl2Section(props) {
  return (
    <section className="hl2-sec">
      <div className="hl2-sec-head">
        <h3 className="hl2-sec-title">{props.title}</h3>
        <p className="hl2-sec-note">{props.note}</p>
      </div>
      {props.children && props.children.length !== 0
        ? <ol className="hl2-list">{props.children}</ol>
        : <p className="hl2-empty">対象のレースがありません。</p>}
    </section>
  );
}

/* ============================================================ */
function HighlightsView() {
  var data = React.useMemo(hl2Build, []);

  return (
    <div className="hl2">
      <header className="hl2-head">
        <h2 className="hl2-title">大会ハイライト</h2>
        <p className="hl2-lead">
          5日間・全{data.total}レースの記録から、見どころを自動でまとめました。
        </p>
      </header>

      <div className="hl2-grid">
        <Hl2Section
          title="大接戦"
          note="A決勝〜C決勝で、1着と2着のゴール差が小さかったレース。0.5秒未満は「写真判定級」。"
        >
          {data.close.map(function (m, i) {
            return <Hl2MarginRow key={'c' + i} item={m} photo={true} />;
          })}
        </Hl2Section>

        <Hl2Section
          title="大逆転"
          note="1000m通過の順位から、ゴールまでに大きく順位を上げた艇。"
        >
          {data.jumps.map(function (c, i) {
            return <Hl2JumpRow key={'j' + i} item={c} />;
          })}
        </Hl2Section>

        <Hl2Section
          title="圧勝"
          note="1着と2着のゴール差が大きかったレース。"
        >
          {data.blowouts.map(function (m, i) {
            return <Hl2MarginRow key={'b' + i} item={m} photo={false} />;
          })}
        </Hl2Section>
      </div>
    </div>
  );
}

Object.assign(window, { HighlightsView });
