/* super-week.jsx — календарь работ руководителя по всем бригадам (KSH-526, Роман 06.11: «да, для суперпользователя нужен»).
   Тот же календарь, что у прораба (KSH-525): ForemanViews.week + LKW.WeekW и LKW.TomorrowW, но по всем объектам в работе
   с выбором бригады — «Все бригады» или один прораб (ForemanViews.crews). Только просмотр: клик по объекту или работе
   открывает кабинет прораба этого объекта глазами (?superView=1&name=, как «глазами» в эскалациях) в новой вкладке.
   Exports on window: SuperWeekZone. */
(function () {
  'use strict';
  const FV = () => window.ForemanViews;
  const W = () => window.LKW;
  const today = () => new Date().toISOString().slice(0, 10);

  function useStore() {
    const [, tick] = React.useState(0);
    React.useEffect(() => {
      const P = window.ProjectStore;
      const on = () => tick((x) => x + 1);
      const off = P && P.subscribe ? P.subscribe(on) : null;
      window.addEventListener('obitel:staff', on);
      return () => { if (off) off(); window.removeEventListener('obitel:staff', on); };
    }, []);
  }

  // кабинет прораба глазами руководителя — только чтение
  const eyesHref = (c) => 'foreman-dash.html?superView=1&name=' + encodeURIComponent(c ? c.name : '');

  function SuperWeekZone() {
    useStore();
    const [crew, setCrew] = React.useState('all');
    const [by, setBy] = React.useState('obj');
    const t0 = today();
    const [from, setFrom] = React.useState(t0);
    if (!FV() || !W()) return <div className="lk-empty-note">Календарь работ не загрузился.</div>;
    const { WeekW, TomorrowW, nextLine, dateR, isoAdd, plural, Ic } = W();
    const all = FV().mine(null);
    const crews = FV().crews(all);
    const cur = crew === 'all' ? null : crews.find((c) => c.id === crew) || null;
    const list = cur ? all.filter((p) => (p.foremanId || '') === cur.id) : all;
    const w = FV().week(list, from, t0);
    const n = FV().week(list, t0, t0).next;
    const byId = {}; crews.forEach((c) => { byId[c.id] = c; });
    const fmByPid = {}; all.forEach((p) => { fmByPid[p.id] = p.foremanId || ''; });
    // r — строка объекта или работа: у обеих есть pid
    const fmOf = (r) => byId[fmByPid[r.pid] || ''] || null;
    const go = (r) => { const c = fmOf(r); if (c && c.id) window.open(eyesHref(c), '_blank', 'noopener'); };
    // при «Все бригады» под объектом — его прораб
    const rowSub = cur ? undefined : (r) => { const c = fmOf(r); return c ? (c.id ? 'Прораб ' + c.name : c.name) : ''; };
    const objN = list.filter((p) => p.status !== 'done').length;
    const pill = (id, label, k) => <button key={id || '_'} type="button" role="tab" aria-selected={crew === id} className={crew === id ? 'on' : ''} onClick={() => setCrew(id)}>{label}{k != null ? <span>{k}</span> : null}</button>;
    const tab = (k, l) => <button type="button" role="tab" aria-selected={by === k} className={by === k ? 'on' : ''} onClick={() => setBy(k)}>{l}</button>;
    return (
      <div className="lw-scope lw-sup">
        <div className="lw-sup-h">
          <div>
            <h2>Календарь работ</h2>
            <div className="lab">{(cur ? (cur.id ? 'Бригада: ' + cur.name : 'Объекты без прораба') : 'Все бригады') + ' · ' + objN + ' ' + plural(objN, 'объект', 'объекта', 'объектов') + ' · ' + dateR(w.from, { month: 'short' }) + ' — ' + dateR(w.to, { month: 'short', year: 'numeric' })}</div>
          </div>
          {cur && cur.id ? <a className="lw-btn-l" href={eyesHref(cur)} target="_blank" rel="noopener">Кабинет прораба глазами<Ic n="ne" s={14} /></a> : null}
        </div>
        <div className="lw-sup-bar">
          <div className="cv-ctabs" role="tablist" aria-label="Бригада">{pill('all', 'Все бригады', all.filter((p) => p.status !== 'done').length)}{crews.map((c) => pill(c.id, c.name, c.n))}</div>
          <div className="cv-ctabs" role="tablist" aria-label="Строки">{tab('obj', 'По объектам')}{tab('people', 'По людям')}</div>
          <div className="lw-wknav" style={{ marginTop: 0 }}>
            <button type="button" className="lw-btn-l" onClick={() => setFrom(isoAdd(w.from, -7))} aria-label="Прошлая неделя"><Ic n="left" s={14} /></button>
            <button type="button" className="lw-btn-l" disabled={from === t0} onClick={() => setFrom(t0)}>Эта неделя</button>
            <button type="button" className="lw-btn-l" onClick={() => setFrom(isoAdd(w.from, 7))} aria-label="Следующая неделя"><Ic n="right" s={14} /></button>
            <span className="lab">Только просмотр. Охрой — работы без мастера, с мастером в отпуске и просроченные. Клик открывает кабинет прораба глазами.</span>
          </div>
        </div>
        <div className="cv-w lw-wkw"><WeekW w={w} by={by} max={6} rowSub={rowSub} onRow={by === 'obj' ? go : undefined} onWork={go} /></div>
        <h3 className="lw-h3">Завтра, {nextLine(n).replace(/^./, (c) => c.toLowerCase())}</h3>
        <TomorrowW n={n} rowSub={rowSub} onObj={go} onWork={(r) => go(r)} />
      </div>);
  }

  window.SuperWeekZone = SuperWeekZone;
})();
