// Bulk season import — paste a season schedule and queue all games for approval.
const { useState: useStateBSI, useMemo: useMemoBSI } = React;

function BulkSeasonImport({ defaultTeamId, onCancel, onImport }) {
  const [team, setTeam] = useStateBSI(defaultTeamId || '');
  const [rawText, setRawText] = useStateBSI(SAMPLE_SCHEDULE);
  const [parseError, setParseError] = useStateBSI(null);

  const parsed = useMemoBSI(() => {
    try {
      setParseError(null);
      return parseSchedule(rawText);
    } catch (e) {
      setParseError(e.message);
      return [];
    }
  }, [rawText]);

  const reimbursableCount = parsed.filter(r => r.daysAway >= 15).length;
  const borderlineCount = parsed.filter(r => r.daysAway === 14).length;
  const lateCount = parsed.filter(r => r.daysAway < 14).length;

  function submit() {
    if (!team || parsed.length === 0) return;
    onImport(team, parsed);
  }

  return (
    <div className="modal-backdrop" onClick={onCancel}>
      <div className="modal" onClick={e => e.stopPropagation()} style={{ maxWidth: 960 }}>
        <div className="modal-head">
          <div>
            <div style={{ fontWeight: 600, fontSize: 14 }}>Bulk season import</div>
            <div className="dim" style={{ fontSize: 11, marginTop: 2 }}>
              Paste an entire season schedule and queue every game in one shot.
            </div>
          </div>
          <button className="btn btn-ghost btn-sm" onClick={onCancel}><window.I.X size={14} /></button>
        </div>

        <div className="modal-body" style={{ padding: '20px 22px' }}>
          <div className="form-grid cols-2 mb-16">
            <div>
              <label className="field-label">Team <span className="gold">*</span></label>
              <select className="select" value={team} onChange={e => setTeam(e.target.value)}>
                <option value="" disabled>Select team\u2026</option>
                {window.AppData.TEAMS.map(t => <option key={t.id} value={t.id}>{t.name}</option>)}
              </select>
            </div>
            <div>
              <label className="field-label">Season template</label>
              <select className="select" defaultValue="" onChange={e => {
                if (e.target.value === 'achafall') setRawText(ACHA_FALL_TEMPLATE);
                else if (e.target.value === 'clearout') setRawText('');
                else if (e.target.value === 'sample') setRawText(SAMPLE_SCHEDULE);
              }}>
                <option value="">Choose a template\u2026</option>
                <option value="sample">Sample (mixed 8 games)</option>
                <option value="achafall">ACHA hockey \u2014 fall conference</option>
                <option value="clearout">Clear all rows</option>
              </select>
            </div>
          </div>

          <label className="field-label">Schedule \u00b7 one game per line</label>
          <div className="dim" style={{ fontSize: 11, marginBottom: 6 }}>
            Format: <code style={{ color: 'var(--gold)' }}>YYYY-MM-DD, Home|Away, opponent, location, transportation</code> \u00b7 separator can be comma or tab \u00b7 first line headers OK
          </div>
          <textarea
            className="textarea"
            rows={9}
            value={rawText}
            onChange={e => setRawText(e.target.value)}
            style={{ resize: 'vertical', fontFamily: 'JetBrains Mono, monospace', fontSize: 12, lineHeight: 1.55 }}
            spellCheck={false}
          />
          {parseError && <div className="badge danger mt-8">{parseError}</div>}

          <div className="flex-between mt-16 mb-12">
            <div className="flex-gap-12" style={{ fontSize: 12, color: 'var(--text-2)' }}>
              <span><strong style={{ color: 'var(--text)' }}>{parsed.length}</strong> games parsed</span>
              {reimbursableCount > 0 && <span className="badge success">{reimbursableCount} reimbursable</span>}
              {borderlineCount > 0 && <span className="badge warning">{borderlineCount} borderline</span>}
              {lateCount > 0 && <span className="badge danger">{lateCount} late \u00b7 not reimbursable</span>}
            </div>
          </div>

          {parsed.length > 0 && (
            <div className="card">
              <div className="table-wrap">
                <table className="data">
                  <thead>
                    <tr>
                      <th>Date</th>
                      <th>Type</th>
                      <th>Opponent / event</th>
                      <th>Location</th>
                      <th>Days out</th>
                      <th>Reimburse</th>
                    </tr>
                  </thead>
                  <tbody>
                    {parsed.map((row, i) => (
                      <tr key={i}>
                        <td className="cell-mono cell-muted">
                          {window.Fmt.date(row.date, { year: false })}
                          <div className="dim" style={{ fontSize: 10 }}>{new Date(row.date + 'T00:00:00').toLocaleDateString('en-US', { weekday: 'short' })}</div>
                        </td>
                        <td>
                          {row.type === 'Home'
                            ? <span className="badge crimson">Home</span>
                            : <span className="badge gold">Away</span>}
                        </td>
                        <td><strong>{row.name}</strong></td>
                        <td className="cell-muted">{row.location || <span className="dim">\u2014</span>}</td>
                        <td className="cell-mono">{row.daysAway}d</td>
                        <td>
                          {row.daysAway >= 15
                            ? <span className="badge success">Reimbursable</span>
                            : row.daysAway === 14
                              ? <span className="badge warning">Borderline</span>
                              : <span className="badge danger">Late \u00b7 not reimbursable</span>}
                        </td>
                      </tr>
                    ))}
                  </tbody>
                </table>
              </div>
            </div>
          )}
        </div>

        <div className="modal-foot">
          <span className="dim" style={{ fontSize: 11 }}>
            Imported games land in <strong style={{ color: 'var(--text)' }}>Pending approvals</strong>. Approve each one to lock onto the calendar.
          </span>
          <div className="flex-gap-8">
            <button className="btn btn-ghost btn-sm" onClick={onCancel}>Cancel</button>
            <button
              className="btn btn-primary btn-sm"
              onClick={submit}
              disabled={!team || parsed.length === 0}
            >
              <window.I.Upload size={13} /> Import {parsed.length} games
            </button>
          </div>
        </div>
      </div>
    </div>
  );
}

// Parser: one game per line, comma- or tab-separated.
// Columns: date, type, name/opponent, location, transportation
function parseSchedule(text) {
  if (!text || !text.trim()) return [];
  const lines = text.trim().split(/\r?\n/).filter(l => l.trim() && !l.trim().startsWith('#'));
  const today = new Date('2026-05-21T00:00:00');
  const rows = [];
  let lineNo = 0;
  for (const raw of lines) {
    lineNo++;
    // Skip header
    if (lineNo === 1 && /date/i.test(raw) && /opponent|name|location/i.test(raw)) continue;
    const parts = raw.split(/\t|,/).map(s => s.trim());
    if (parts.length < 3) throw new Error(`Line ${lineNo}: need at least date, type, opponent. Got "${raw}"`);
    const [date, typeRaw, name, location = '', transportation = ''] = parts;
    if (!/^\d{4}-\d{2}-\d{2}$/.test(date)) throw new Error(`Line ${lineNo}: date must be YYYY-MM-DD, got "${date}"`);
    const type = /home/i.test(typeRaw) ? 'Home' : /away/i.test(typeRaw) ? 'Away' : (/(tournament|tourney)/i.test(typeRaw) ? 'Away' : 'Away');
    const d = new Date(date + 'T00:00:00');
    const daysAway = Math.round((d - today) / 86400000);
    rows.push({ date, type, name, location, transportation, daysAway });
  }
  return rows;
}

const SAMPLE_SCHEDULE =
`# Date, Type, Opponent / event, Location, Transportation
2026-09-12, Home, vs Hope College, IM Field 1, n/a
2026-09-19, Away, vs Northwood, Midland MI, Charter bus
2026-09-26, Home, vs Grand Valley State, IM Field 1, n/a
2026-10-03, Away, vs Aquinas, Grand Rapids MI, Van + 2 cars
2026-10-10, Home, vs Davenport, IM Field 2, n/a
2026-10-17, Away, vs Saginaw Valley, University Center MI, Charter bus
2026-10-24, Home, vs Calvin, IM Field 1, n/a
2026-11-01, Away, Regional Tournament, Indianapolis IN, Charter bus`;

const ACHA_FALL_TEMPLATE =
`# Date, Type, Opponent / event, Location, Transportation
2026-10-02, Away, vs Davenport, Grand Rapids MI, Charter bus
2026-10-09, Home, vs Bowling Green, Ewigleben Arena, n/a
2026-10-16, Away, vs Western Michigan, Kalamazoo MI, Van + 1 car
2026-10-23, Home, vs Eastern Michigan, Ewigleben Arena, n/a
2026-10-30, Away, vs Michigan State, East Lansing MI, Charter bus
2026-11-06, Home, vs Saginaw Valley, Ewigleben Arena, n/a
2026-11-13, Away, vs Adrian, Adrian MI, Charter bus
2026-11-20, Home, vs Davenport, Ewigleben Arena, n/a`;

window.BulkSeasonImport = BulkSeasonImport;
