// Shared helpers for the Sports category — time parsing, pace formatting,
// unit conversion. Loaded before any individual sports tool.

(function () {
  const M_PER_KM = 1000;
  const M_PER_MILE = 1609.344;

  // Parse "hh:mm:ss", "mm:ss" or seconds string into total seconds.
  function parseTimeToSeconds(str) {
    if (str == null) return NaN;
    const s = String(str).trim();
    if (!s) return NaN;
    if (/^\d+(\.\d+)?$/.test(s)) return Number(s);
    const parts = s.split(':').map((x) => Number(x));
    if (parts.some((x) => Number.isNaN(x) || x < 0)) return NaN;
    if (parts.length === 2) return parts[0] * 60 + parts[1];
    if (parts.length === 3) return parts[0] * 3600 + parts[1] * 60 + parts[2];
    return NaN;
  }

  function formatHMS(seconds, opts = {}) {
    if (!Number.isFinite(seconds) || seconds < 0) return '—';
    const total = Math.round(seconds);
    const h = Math.floor(total / 3600);
    const m = Math.floor((total % 3600) / 60);
    const s = total % 60;
    const pad = (n) => String(n).padStart(2, '0');
    if (h > 0 || opts.alwaysHours) return `${h}:${pad(m)}:${pad(s)}`;
    return `${m}:${pad(s)}`;
  }

  function formatPace(secondsPerUnit) {
    if (!Number.isFinite(secondsPerUnit) || secondsPerUnit <= 0) return '—';
    const total = Math.round(secondsPerUnit);
    const m = Math.floor(total / 60);
    const s = total % 60;
    return `${m}:${String(s).padStart(2, '0')}`;
  }

  function distanceToMeters(value, unit) {
    const v = Number(value);
    if (!Number.isFinite(v)) return NaN;
    if (unit === 'mi') return v * M_PER_MILE;
    if (unit === 'm') return v;
    return v * M_PER_KM; // km
  }
  function metersTo(value, unit) {
    if (!Number.isFinite(value)) return NaN;
    if (unit === 'mi') return value / M_PER_MILE;
    if (unit === 'm') return value;
    return value / M_PER_KM;
  }

  // Convert pace seconds-per-km ↔ seconds-per-mile.
  function paceKmToMile(spk) { return spk * (M_PER_MILE / M_PER_KM); }
  function paceMileToKm(spm) { return spm * (M_PER_KM / M_PER_MILE); }

  // Common race distances in metres.
  const RACE_DISTANCES = [
    { id: '1k',     label: '1 K',           m: 1000 },
    { id: '5k',     label: '5 K',           m: 5000 },
    { id: '10k',    label: '10 K',          m: 10000 },
    { id: 'hm',     label: 'Half Marathon', m: 21097.5 },
    { id: 'm',      label: 'Marathon',      m: 42195 },
    { id: '50k',    label: '50 K',          m: 50000 },
    { id: '100k',   label: '100 K',         m: 100000 },
  ];

  // Riegel race-prediction formula: T2 = T1 × (D2/D1)^1.06.
  function riegel(t1Seconds, d1Meters, d2Meters, exp = 1.06) {
    if (!t1Seconds || !d1Meters) return NaN;
    return t1Seconds * Math.pow(d2Meters / d1Meters, exp);
  }

  // Reusable unit toggle (km/mi).
  function UnitToggle({ unit, setUnit }) {
    return (
      <div className="sport-unit-toggle">
        <button type="button" className={unit === 'km' ? 'active' : ''} onClick={() => setUnit('km')}>km</button>
        <button type="button" className={unit === 'mi' ? 'active' : ''} onClick={() => setUnit('mi')}>mi</button>
      </div>
    );
  }

  // Reusable result tile.
  function ResultTile({ label, value, sub, accent }) {
    return (
      <div className="sport-result-tile" style={accent ? { borderColor: accent, boxShadow: `0 6px 20px -10px ${accent}55` } : {}}>
        <div className="srt-l">{label}</div>
        <div className="srt-v" style={accent ? { color: accent } : {}}>{value}</div>
        {sub && <div className="srt-s">{sub}</div>}
      </div>
    );
  }

  // Two-column hero header used by every sports tool.
  function SportsToolHeader({ title, sub, accent = '#16a34a', icon = 'run' }) {
    return (
      <div className="sport-tool-header" style={{ borderColor: accent + '40' }}>
        <div className="sth-icon" style={{ background: accent + '22', color: accent }}>
          <window.Icon name={icon} size={24} />
        </div>
        <div>
          <div className="sth-title">{title}</div>
          {sub && <div className="sth-sub">{sub}</div>}
        </div>
      </div>
    );
  }

  window.MMSports = {
    M_PER_KM, M_PER_MILE,
    parseTimeToSeconds, formatHMS, formatPace,
    distanceToMeters, metersTo,
    paceKmToMile, paceMileToKm,
    RACE_DISTANCES, riegel,
    UnitToggle, ResultTile, SportsToolHeader,
  };
})();
