/* StrataSnap prototype — resident side. Babel/JSX.
   ReportFlow (multi-step), Confirmation, StatusPage, StopScreen, ExpiredPage. */

const DRAFT_KEY = 'strata_draft_v1';
const BLANK = { category: null, photos: [], voiceNotes: [], note: '', name: '', email: '', phone: '', unit: '' };

// Single-screen resident report. One scrollable form — location (from QR),
// type of issue, what happened, optional photo, contact — then Send. Scope /
// privacy are inline helper text, not separate steps.
function ReportFlow({ locationId, setup, onExit, createTicket, onViewStatus }) {
  const SS = window.SS;
  const emergencyContact = (setup && setup.emergencyContact) || (SS.setupSeed && SS.setupSeed().emergencyContact) || 'the building emergency contact';
  const [locId, setLocId] = React.useState(locationId);
  const [picker, setPicker] = React.useState(false);
  const reportLocations = SS.setupLocations(setup, { activeOnly: true });
  const loc = SS.setupLocationById(setup, locId) || reportLocations[0] || SS.LOCATIONS[2];
  const [stopped, setStopped] = React.useState(null);
  const [created, setCreated] = React.useState(null);
  const [d, setD] = React.useState(() => {
    try { const s = JSON.parse(localStorage.getItem(DRAFT_KEY)); if (s) return { ...BLANK, ...s, photos: BLANK.photos, voiceNotes: BLANK.voiceNotes }; } catch (e) {}
    return BLANK;
  });
  const set = (patch) => setD((x) => ({ ...x, ...patch }));
  React.useEffect(() => {
    try { localStorage.setItem(DRAFT_KEY, JSON.stringify({ category: d.category, note: d.note, name: d.name, email: d.email, phone: d.phone, unit: d.unit })); } catch (e) {}
  }, [d.category, d.note, d.name, d.email, d.phone, d.unit]);

  const [up, setUp] = React.useState('idle');
  const fileRef = React.useRef(null);
  const recRef = React.useRef(null);
  const chunksRef = React.useRef([]);
  const recStartedRef = React.useRef(0);
  const [rec, setRec] = React.useState('idle');
  const [mediaErr, setMediaErr] = React.useState('');

  function dataUrlFromFile(file) {
    return new Promise((resolve, reject) => {
      const reader = new FileReader();
      reader.onload = () => resolve(reader.result);
      reader.onerror = reject;
      reader.readAsDataURL(file);
    });
  }

  const addPhoto = () => {
    setMediaErr('');
    if (fileRef.current) fileRef.current.click();
  };
  const onPhotoPicked = async (e) => {
    const file = e.target.files && e.target.files[0];
    e.target.value = '';
    if (!file) return;
    setUp('uploading');
    try {
      const url = await dataUrlFromFile(file);
      set({ photos: [...d.photos, { id: SS.uid('ph'), kind: d.category || 'default', name: file.name || 'Resident photo', url }] });
      setUp('idle');
    } catch (err) {
      setUp('failed');
      setMediaErr('Photo could not be added. Try again.');
    }
  };
  const removePhoto = (id) => set({ photos: d.photos.filter((p) => p.id !== id) });

  async function startVoice() {
    setMediaErr('');
    if (!navigator.mediaDevices || !window.MediaRecorder) {
      setMediaErr('Voice notes are not available in this browser.');
      return;
    }
    try {
      const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
      const recorder = new MediaRecorder(stream);
      chunksRef.current = [];
      recStartedRef.current = Date.now();
      recorder.ondataavailable = (e) => { if (e.data && e.data.size) chunksRef.current.push(e.data); };
      recorder.onstop = async () => {
        stream.getTracks().forEach((track) => track.stop());
        const blob = new Blob(chunksRef.current, { type: recorder.mimeType || 'audio/webm' });
        const url = await dataUrlFromFile(blob);
        const durationMs = Math.max(1000, Date.now() - recStartedRef.current);
        set({ voiceNotes: [...d.voiceNotes, { id: SS.uid('vn'), url, mime: blob.type, durationMs }] });
        setRec('idle');
      };
      recRef.current = recorder;
      recorder.start();
      setRec('recording');
    } catch (err) {
      setMediaErr('Microphone access was blocked or unavailable.');
      setRec('idle');
    }
  }
  function stopVoice() {
    if (recRef.current && recRef.current.state === 'recording') recRef.current.stop();
  }
  const removeVoice = (id) => set({ voiceNotes: d.voiceNotes.filter((v) => v.id !== id) });

  function submit() {
    const t = createTicket({ locationId: loc.id, locationName: loc.name, category: d.category, note: d.note, name: d.name, email: d.email, phone: d.phone, unit: d.unit, photos: d.photos, voiceNotes: d.voiceNotes });
    try { localStorage.removeItem(DRAFT_KEY); } catch (e) {}
    setCreated(t);
  }

  const STEPS = ['category', 'describe', 'photo', 'review'];
  const RAIL = ['Category', 'Describe', 'Media', 'Review'];
  const [step, setStep] = React.useState(0);
  const name = STEPS[step];
  const total = STEPS.length;
  const back = () => { if (step === 0) onExit(); else setStep((s) => s - 1); };
  const next = () => setStep((s) => Math.min(total - 1, s + 1));
  const canSend = d.category && d.note.trim();
  const stepOk = { category: !!d.category, describe: !!d.note.trim(), photo: true, review: true }[name];

  if (stopped) return <StopScreen reason={stopped} setup={setup} onBack={() => setStopped(null)} />;
  if (created) return <Confirmation ticket={created} onViewStatus={() => onViewStatus(created.token)} onDone={onExit} />;

  return (
    <div className="screen">
      <StatusBar />
      <div className="nav">
        <button className="iconbtn" onClick={back}><Icon name="back" size={18} /></button>
        <span className="t" style={{ textAlign: 'center', flex: '1 1 auto' }}>Report an issue</span>
        <span style={{ width: 40, flex: '0 0 auto' }} />
      </div>
      <div className="steprail">
        {RAIL.map((lbl, i) => (
          <div className={'sr-item' + (i === step ? ' on' : '') + (i < step ? ' done' : '')} key={lbl} onClick={() => { if (i < step) setStep(i); }}>
            <span className="sr-dot">{i < step ? <Icon name="check" size={13} /> : (i + 1)}</span>
            <span className="sr-lbl">{lbl}</span>
          </div>
        ))}
      </div>

      <div className="scroll">
        <div className="pad osr">
          <div className="osr-locrow">
            <span className="osr-loc-ic"><Icon name="pin" size={16} /></span>
            <div className="osr-loc-t">
              <div className="osr-loc-name">{loc.name}</div>
              <div className="osr-loc-meta">Scanned from QR code</div>
            </div>
            <button className="linkbtn" onClick={() => setPicker(true)}>Change</button>
          </div>

          <div className="stepfade" key={name}>
          {name === 'category' && (
            <React.Fragment>
              <div className="osr-titlerow">
                <div>
                  <h1 className="osr-h1">What's the issue?</h1>
                  <p className="osr-sub">Pick the category that fits best.</p>
                </div>
                <button className="emerg-ico" onClick={() => setStopped('emergency')} aria-label="Emergency help" title="Emergency? Get help"><Icon name="alert" size={20} /></button>
              </div>
              <Note variant="warn" icon="alert" title="Emergency or immediate safety risk?">Do not use this form for an active flood, fire, security issue, elevator entrapment, or immediate safety risk. Call {emergencyContact} or emergency services first.</Note>
              <div className="cat-grid" style={{ marginTop: 16 }}>
                {SS.CATEGORIES.map((c) => (
                  <button key={c.id} className={'cat-chip' + (d.category === c.id ? ' sel' : '')} onClick={() => { set({ category: c.id }); setTimeout(next, 160); }}>
                    {c.img ? <img className="cat-art" src={c.img} alt="" /> : <span className="cat-tile"><Icon name={c.icon} size={17} /></span>}
                    <span>{c.short}</span>
                  </button>
                ))}
              </div>
              <p className="osr-help">For an issue inside your own unit, contact your strata manager or owner directly.</p>
            </React.Fragment>
          )}

          {name === 'describe' && (
            <React.Fragment>
              <h1 className="osr-h1" style={{ marginTop: 16 }}>Describe the issue</h1>
              <p className="osr-sub">A sentence or two is plenty.</p>
              {['plumbing', 'electrical', 'door', 'structural', 'elevator'].includes(d.category) && (
                <Note variant="warn" icon="alert" title="Use the emergency contact for urgent cases">If this is active flooding, fire, a security/access failure, elevator entrapment, or an immediate trip/safety risk, call {emergencyContact} before submitting.</Note>
              )}
              <textarea id="osr-note" className="inp" autoFocus autoComplete="off" placeholder="Example: Water is leaking near the parkade elevator." value={d.note} onChange={(e) => set({ note: e.target.value })} style={{ marginTop: 16, minHeight: 130 }} />
            </React.Fragment>
          )}

          {name === 'photo' && (
            <React.Fragment>
              <h1 className="osr-h1" style={{ marginTop: 16 }}>Add media</h1>
              <p className="osr-sub">Optional. Add a photo, or record a short voice note if it is easier than typing.</p>
              <input ref={fileRef} type="file" accept="image/*" capture="environment" onChange={onPhotoPicked} style={{ display: 'none' }} />
              {up === 'failed' && (
                <div className="note warn" style={{ alignItems: 'center', marginTop: 16, marginBottom: 0 }}>
                  <Icon name="alert" size={18} />
                  <div className="flex1"><span className="h">Photo didn't go through</span>{mediaErr || 'Check your file and try again — your report is safe.'}</div>
                  <button className="btn btn-sm btn-out" style={{ flex: '0 0 auto' }} onClick={addPhoto}>Retry</button>
                </div>
              )}
              <div className="osr-photos" style={{ marginTop: 16 }}>
                {d.photos.map((p, i) => (
                  <div key={p.id} className="osr-photo"><IssuePhoto seed={p} i={i} /><button className="osr-photo-x" onClick={() => removePhoto(p.id)}><Icon name="x" size={14} /></button></div>
                ))}
                {up === 'uploading' && <div className="osr-photo up"><div className="spin" /></div>}
                {up !== 'uploading' && (
                  <button className={'osr-photo add' + (d.photos.length ? '' : ' wide')} onClick={addPhoto}>
                    <img className="add-cam" src="art/camera-add.png" alt="" onError={(e) => { e.target.style.display = 'none'; }} /><span>{d.photos.length ? 'Add another' : 'Take or add a photo'}</span>
                  </button>
                )}
              </div>
              <div className="voice-box">
                <div className="voice-copy">
                  <span className="voice-k">Voice note</span>
                  <span className="voice-v">Optional. Keep it under 30 seconds.</span>
                </div>
                {rec === 'recording' ?
                  <button className="voice-btn recording" onClick={stopVoice}><Icon name="stop" size={16} /> Stop</button> :
                  <button className="voice-btn" onClick={startVoice}><Icon name="mic" size={16} /> Record</button>
                }
              </div>
              {mediaErr && up !== 'failed' && <p className="send-hint" style={{ color: 'var(--st-amber)', marginTop: 10 }}>{mediaErr}</p>}
              {d.voiceNotes.length > 0 && (
                <div className="voice-list">
                  {d.voiceNotes.map((v, i) => (
                    <div className="voice-item" key={v.id}>
                      <Icon name="mic" size={16} />
                      <span>Voice note {i + 1} · {Math.round((v.durationMs || 0) / 1000)}s</span>
                      <audio src={v.url} controls />
                      <button className="iconbtn" onClick={() => removeVoice(v.id)} aria-label="Remove voice note"><Icon name="x" size={14} /></button>
                    </div>
                  ))}
                </div>
              )}
            </React.Fragment>
          )}

          {name === 'review' && (
            <React.Fragment>
              <h1 className="osr-h1" style={{ marginTop: 16 }}>Review your report</h1>
              <p className="osr-sub">Check the details before submitting.</p>
              <Note variant="warn" icon="alert" title="Not monitored in real time">This sends the issue to council or management. It does not guarantee immediate dispatch. Urgent issues should be reported using the emergency contact instructions.</Note>
              <div className="rev-list">
                <div className="rev-row"><span className="rev-ic"><Icon name="pin" size={16} /></span><div><div className="rev-k">Location</div><div className="rev-v">{loc.name}</div></div></div>
                <div className="rev-row"><span className="rev-ic"><Icon name="qr" size={16} /></span><div><div className="rev-k">Source</div><div className="rev-v">QR poster · {SS.posterCode(loc.id)}</div></div></div>
                <div className="rev-row"><span className="rev-ic">{SS.CATEGORIES.find((c) => c.id === d.category) && SS.CATEGORIES.find((c) => c.id === d.category).img ? <img src={SS.CATEGORIES.find((c) => c.id === d.category).img} alt="" style={{ width: 22, height: 22 }} /> : <Icon name="drop" size={16} />}</span><div><div className="rev-k">Category</div><div className="rev-v">{SS.catLabel(d.category)}</div></div></div>
                <div className="rev-row"><span className="rev-ic"><Icon name="message" size={16} /></span><div><div className="rev-k">Description</div><div className="rev-v">{d.note}</div></div></div>
                {d.photos.length > 0 && (
                  <div className="rev-row"><span className="rev-ic"><Icon name="image" size={16} /></span><div style={{ flex: 1 }}><div className="rev-k">Photos ({d.photos.length})</div><div className="rev-thumbs">{d.photos.map((p, i) => <IssuePhoto key={p.id} seed={p} i={i} />)}</div></div></div>
                )}
                {d.voiceNotes.length > 0 && (
                  <div className="rev-row"><span className="rev-ic"><Icon name="mic" size={16} /></span><div><div className="rev-k">Voice notes</div><div className="rev-v">{d.voiceNotes.length} attached</div></div></div>
                )}
              </div>

              <div className="osr-label" style={{ marginTop: 22 }}>2D building map</div>
              <div className="rev-map">
                <img className="rev-map-img" src="art/floor-map.png" alt="" onError={(e) => { e.target.closest('.rev-map').classList.add('noimg'); }} />
                <span className="rev-map-pin"><Icon name="pin" size={16} fill={true} /></span>
                <span className="rev-map-cap">{loc.name}</span>
              </div>
              <div className="osr-label" style={{ marginTop: 18 }}>Contact for updates <span className="opt-note">· optional</span></div>
              <input className="inp" autoComplete="email" placeholder="Email or phone — so we can update you" value={d.email} onChange={(e) => set({ email: e.target.value })} />
              <p className="osr-privacy"><Icon name="lock" size={13} /> Secure · Private · only shared with building staff who can act.</p>
            </React.Fragment>
          )}
          </div>
        </div>
      </div>
      <div className="footer">
        {name === 'review'
          ? <Btn variant="acc" onClick={submit} disabled={!canSend}><Icon name="send" size={18} /> Submit report</Btn>
          : <Btn variant="acc" onClick={next} disabled={!stepOk}>{name === 'photo' && !d.photos.length ? 'Skip for now' : 'Next'}</Btn>}
        <HomeInd />
      </div>
      {picker && (
        <PickSheet title="Where is the issue?" subtitle="Pick the closest spot in the building."
          options={reportLocations.map((l) => l.name)} current={loc.name}
          onClose={() => setPicker(false)}
          onPick={(nm) => { setLocId((reportLocations.find((l) => l.name === nm) || loc).id); setPicker(false); }} />
      )}
    </div>
  );
}

function Confirmation({ ticket, onViewStatus, onDone }) {
  return (
    <div className="screen">
      <StatusBar />
      <div className="center-wrap">
        <img className="confirm-art" src="art/building-check.png" alt="" onError={(e) => { e.target.style.display = 'none'; }} />
        <h1 className="h-title" style={{ textAlign: 'center' }}>Issue report sent</h1>
        <p className="h-sub" style={{ textAlign: 'center', margin: '10px auto 0' }}>Council or management will review it and post updates when available. This does not guarantee immediate dispatch.</p>
        <div className="ref-pill"><Icon name="check" size={15} />Reference: {ticket.id}</div>
        <div className="ref-pill" style={{ marginTop: 10 }}><Icon name="lock" size={15} />Status code: {String(ticket.token || '').toUpperCase()}</div>
        <div className="panel" style={{ marginTop: 22, width: '100%', textAlign: 'left' }}>
          <div className="prow" style={{ cursor: 'default' }}><span className="k">What’s next</span></div>
          {['Your issue is added to the building log', 'Updates will appear here when it’s reviewed', 'You’ll hear when it’s scheduled or resolved'].map((s, i) => (
            <div className="prow whatsnext" key={i} style={{ cursor: 'default' }}>
              <span className="av" style={{ background: 'var(--acc-tint)', borderColor: 'var(--acc-tint-border)', color: 'var(--acc-text)', flex: '0 0 auto' }}>{i + 1}</span>
              <span className="wn-v">{s}</span>
            </div>
          ))}
        </div>
      </div>
      <div className="footer">
        <div className="row">
          <Btn variant="out" onClick={onDone}>Done</Btn>
          <Btn variant="acc" onClick={onViewStatus}>Track issue</Btn>
        </div>
        <div className="poweredby">Powered by <b>Strata Match</b> · StrataSnap is a separate product</div>
        <HomeInd />
      </div>
    </div>
  );
}

function StopScreen({ onBack, reason, setup }) {
  const emergencyContact = (setup && setup.emergencyContact) || (window.SS && window.SS.setupSeed && window.SS.setupSeed().emergencyContact) || '604 555 0100';
  if (reason === 'emergency') {
    return (
      <div className="screen">
        <StatusBar />
        <div className="nav"><button className="iconbtn" onClick={onBack}><Icon name="back" size={18} /></button><span className="t">Emergency</span></div>
        <div className="scroll">
          <div className="pad">
            <div className="big-check" style={{ background: 'var(--st-urgent-bg)', color: 'var(--danger)', margin: '6px 0 18px' }}><Icon name="alert" size={32} /></div>
            <h1 className="osr-h1" style={{ marginTop: 0 }}>Get emergency help first</h1>
            <p className="osr-sub">StrataSnap isn't monitored in real time. For an active flood, fire, security issue, elevator entrapment, or immediate safety risk, call the right line now — then log it here afterward for the record.</p>
            <div className="group" style={{ marginTop: 16 }}>
              <a className="opt" href="tel:911" style={{ textDecoration: 'none' }}><span className="well" style={{ color: 'var(--danger)' }}><Icon name="alert" size={18} /></span><span className="lbl">Fire, flooding, or injury<span className="desc">Call 911</span></span><Icon name="chevronR" size={16} className="chev" /></a>
              <a className="opt" href={'tel:' + String(emergencyContact).replace(/[^0-9+]/g, '')} style={{ textDecoration: 'none' }}><span className="well"><Icon name="building" size={18} /></span><span className="lbl">Building emergency line<span className="desc">{emergencyContact} · 24/7 or as posted</span></span><Icon name="chevronR" size={16} className="chev" /></a>
              <a className="opt" href="tel:6045550148" style={{ textDecoration: 'none' }}><span className="well"><Icon name="elevator" size={18} /></span><span className="lbl">Elevator entrapment<span className="desc">604 555 0148 · monitoring co.</span></span><Icon name="chevronR" size={16} className="chev" /></a>
            </div>
          </div>
        </div>
        <div className="footer"><Btn variant="out" onClick={onBack}>Back to report</Btn><HomeInd /></div>
      </div>
    );
  }
  if (reason === 'unit') {
    return (
      <div className="screen">
        <StatusBar />
        <div className="nav"><button className="iconbtn" onClick={onBack}><Icon name="back" size={18} /></button><span className="t">Report an issue</span></div>
        <div className="scroll">
          <div className="pad">
            <div className="big-check" style={{ background: 'var(--acc-tint)', color: 'var(--acc-text)', margin: '6px 0 18px' }}><Icon name="home" size={32} /></div>
            <h1 className="h-title">That’s usually handled inside your unit</h1>
            <p className="h-sub">Repairs inside your own home are normally the owner’s responsibility, not the strata’s. Here’s who to reach:</p>
            <div className="group" style={{ marginTop: 16 }}>
              <div className="opt" style={{ cursor: 'default', alignItems: 'flex-start' }}>
                <span className="well"><Icon name="user" size={18} /></span>
                <span className="lbl" style={{ fontWeight: 500, fontSize: 15.5, lineHeight: 1.45 }}>If you rent<span className="desc" style={{ display: 'block' }}>Contact your landlord or property manager.</span></span>
              </div>
              <div className="opt" style={{ cursor: 'default', alignItems: 'flex-start' }}>
                <span className="well"><Icon name="door" size={18} /></span>
                <span className="lbl" style={{ fontWeight: 500, fontSize: 15.5, lineHeight: 1.45 }}>If you own<span className="desc" style={{ display: 'block' }}>Call a licensed trade — a plumber, electrician, or handyman.</span></span>
              </div>
              <div className="opt" style={{ cursor: 'default', alignItems: 'flex-start' }}>
                <span className="well"><Icon name="message" size={18} /></span>
                <span className="lbl" style={{ fontWeight: 500, fontSize: 15.5, lineHeight: 1.45 }}>Not sure whose it is?<span className="desc" style={{ display: 'block' }}>Ask your council — they can help you figure it out.</span></span>
              </div>
            </div>
            <Note variant="warn" icon="alert" title="Active flooding or a safety risk?">Treat it as an emergency and call your building’s emergency line right away.</Note>
          </div>
        </div>
        <div className="footer">
          <Btn variant="out" onClick={onBack}>It’s actually a common area</Btn>
          <HomeInd />
        </div>
      </div>
    );
  }
  return (
    <div className="screen">
      <StatusBar />
      <div className="nav"><button className="iconbtn" onClick={onBack}><Icon name="back" size={18} /></button><span className="t">Report an issue</span></div>
      <div className="center-wrap">
        <div className="big-check" style={{ background: 'var(--raise)', color: 'var(--ink-500)' }}><Icon name="message" size={34} /></div>
        <h1 className="h-title" style={{ textAlign: 'center' }}>This isn’t the right channel</h1>
        <p className="h-sub" style={{ textAlign: 'center', margin: '10px auto 0' }}>StrataSnap only handles common-property repairs and maintenance. For questions, billing, or neighbour matters, please contact your council directly.</p>
      </div>
      <div className="footer"><Btn variant="out" onClick={onBack}>Back</Btn><HomeInd /></div>
    </div>
  );
}

function StatusPage({ ticket, onExit, expired }) {
  const SS = window.SS;
  if (expired || !ticket) return <ExpiredPage onExit={onExit} />;
  const updates = SS.publicUpdates(ticket);
  const latest = updates[updates.length - 1];
  const STAGES = ['Reported', 'Reviewed', 'In progress', 'Closed'];
  const stageIdx = {
    'New': 0,
    'Needs review': 1,
    'Needs clarification': 1,
    'Waiting for reporter': 2,
    'Waiting on outside party': 2,
    'Scheduled': 2,
    'Resolved': 3,
    'Closed': 3,
    'Closed - not enough information': 3,
    'Closed - not strata issue': 3,
    'Closed - duplicate': 3,
    'Closed - resolved': 3,
  }[ticket.status];
  const cur = stageIdx == null ? 1 : stageIdx;
  const nextStepText = ['Council will review your report shortly.', 'Council is reviewing and will assign next steps.', 'Work is being scheduled or carried out — you\u2019ll be notified.', SS.waitingLine(ticket.status) || 'This report is closed.'][cur];
  return (
    <div className="screen">
      <StatusBar />
      <div className="nav">
        <button className="iconbtn" onClick={onExit}><Icon name="x" size={18} /></button>
        <span className="t">Report status</span>
      </div>
      <div className="scroll">
        <div className="status-hero">
          <span className="id-mono">{ticket.id}</span>
          <h1 className="h-title" style={{ marginTop: 8 }}>{ticket.summary}</h1>
          <div style={{ marginTop: 12 }}><StatusDot status={ticket.status} big /></div>
          <p className="h-sub" style={{ marginTop: 6 }}>{SS.waitingLine(ticket.status)}</p>
          {latest && (
            <div className="update-card">
              <div className="lbl"><Icon name="eye" size={13} /> Latest update from council</div>
              <div className="body">{latest.body}</div>
              <div className="when">{SS.whenLabel(latest.at)} · {latest.author}</div>
            </div>
          )}
        </div>
        <div className="pad">
          <div className="sec-label">Progress</div>
          <div className="track-steps">
            {STAGES.map((s, i) => (
              <div className={'tk-step' + (i < cur ? ' done' : '') + (i === cur ? ' on' : '')} key={s}>
                <span className="tk-step-dot">{i < cur ? <Icon name="check" size={13} /> : (i === cur ? <span className="tk-pulse" /> : i + 1)}</span>
                <span className="tk-step-lbl">{s}</span>
              </div>
            ))}
          </div>
          <div className="track-next"><Icon name="info" size={16} /><div><span className="tn-k">Next step</span>{nextStepText}</div></div>

          <div className="sec-label">Details</div>
          <div className="kv"><span className="k">Building</span><span className="v">Harbour View Strata</span></div>
          <div className="kv"><span className="k">Location</span><span className="v">{ticket.locationName}</span></div>
          <div className="kv"><span className="k">Submitted</span><span className="v">{SS.dateLabel(ticket.createdAt)}</span></div>
          <div className="kv"><span className="k">Category</span><span className="v">{SS.catLabel(ticket.category)}</span></div>

          <div className="sec-label">Where it occurred</div>
          <div className="rev-map">
            <img className="rev-map-img" src="art/floor-map.png" alt="" onError={(e) => { e.target.closest('.rev-map').classList.add('noimg'); }} />
            <span className="rev-map-pin"><Icon name="pin" size={16} fill={true} /></span>
            <span className="rev-map-cap">{ticket.locationName}</span>
          </div>

          {updates.length > 0 && <div className="sec-label">Updates</div>}
          <div className="timeline">
            {updates.slice().reverse().map((e) => (
              <div className="te m-update" key={e.id}>
                <span className="marker" />
                <div className="when">{SS.whenLabel(e.at)}</div>
                <div className="body">{e.body}</div>
                <div className="who">{e.author}</div>
              </div>
            ))}
          </div>
          <div className="poweredby" style={{ marginTop: 18 }}>Powered by <b>Strata Match</b></div>
        </div>
      </div>
    </div>
  );
}

function ExpiredPage({ onExit }) {
  return (
    <div className="screen">
      <StatusBar />
      <div className="nav"><button className="iconbtn" onClick={onExit}><Icon name="x" size={18} /></button><span className="t">Report status</span></div>
      <div className="center-wrap">
        <div className="big-check" style={{ background: 'var(--raise)', color: 'var(--ink-400)' }}><Icon name="clock" size={34} /></div>
        <h1 className="h-title" style={{ textAlign: 'center' }}>This link has expired</h1>
        <p className="h-sub" style={{ textAlign: 'center', margin: '10px auto 0' }}>Status links expire once a report is closed, or if the link was revoked. If you still need help, submit a new report or contact your council.</p>
      </div>
      <div className="footer"><Btn variant="out" onClick={onExit}>Close</Btn><HomeInd /></div>
    </div>
  );
}

function ScanLanding({ onScanned, onFind, setup, locationId = 'p2' }) {
  const SS = window.SS;
  const reportLocations = SS.setupLocations(setup, { activeOnly: true });
  const loc = SS.setupLocationById(setup, locationId) || reportLocations[0] || SS.LOCATIONS[2];
  const emergencyContact = (setup && setup.emergencyContact) || (SS.setupSeed && SS.setupSeed().emergencyContact) || 'the building emergency contact';
  const [pick, setPick] = React.useState(false);
  const qrUrl = SS.qrScanUrl(setup, loc);

  return (
    <div className="screen qr-start">
      <StatusBar />
      <div className="qr-start-head">
        <img className="qr-building-outline" src="art/condo-cluster.png" alt="" aria-hidden="true" onError={(e) => { e.currentTarget.style.display = 'none'; }} />
        <div className="rh-bar">
          <Logo tone="dark" size={26} />
        </div>
        <div className="qr-paper">
          <div className="qr-mark"><QRGraphic value={qrUrl} size={78} fg="#0E1A2B" /></div>
          <div className="qr-paper-copy">
            <div className="qr-paper-top">QR poster scanned</div>
            <div className="qr-paper-title">{loc.name}</div>
            <p>Poster ID {loc.qrId || SS.posterCode(loc.id)} · {(setup && setup.buildingName) || SS.BUILDING.name}</p>
          </div>
        </div>
      </div>

      <div className="scroll">
        <div className="pad qr-start-body">
          <h1 className="osr-h1">Report a building issue here</h1>
          <p className="osr-sub">Use this for repairs, hazards, access problems, cleanliness, or other common-property issues.</p>
          <div className="rh-steps qr-how">
            <div><span>1</span><b>Location is prefilled</b><p>Council knows exactly where to look.</p></div>
            <div><span>2</span><b>Add the issue</b><p>Pick a category and add a short note.</p></div>
            <div><span>3</span><b>Track updates</b><p>Save the report number after submitting.</p></div>
          </div>
          <div className="note" style={{ marginTop: 16 }}>
            <Icon name="lock" size={18} />
            <div><span className="h">No resident app required</span>Your contact details are optional and used only for updates about this report.</div>
          </div>
          <div className="note warn" style={{ marginTop: 12 }}>
            <Icon name="alert" size={18} />
            <div><span className="h">Emergency or immediate safety risk?</span>Do not use this form for active flood, fire, security, elevator entrapment, or immediate safety issues. Call {emergencyContact} or emergency services first.</div>
          </div>
          <div className="qr-actions">
            <button className="btn btn-out" onClick={() => setPick(true)}><Icon name="pin" size={17} /> Change location</button>
            <button className="btn btn-out" onClick={onFind}><Icon name="search" size={17} /> Track report</button>
          </div>
        </div>
      </div>
      <div className="footer">
        <Btn variant="acc" onClick={() => onScanned(loc.id)}>Continue to report</Btn>
        <HomeInd />
      </div>
      {pick && (
        <PickSheet title="Where are you?" subtitle="Pick the closest spot in the building."
          options={reportLocations.map((l) => l.name)} current={loc.name}
          onClose={() => setPick(false)}
          onPick={(nm) => onScanned((reportLocations.find((l) => l.name === nm) || loc).id)} />
      )}
    </div>
  );
}

function FindReport({ onBack, onFound, tickets, lookupReport }) {
  const [ref, setRef] = React.useState('');
  const [err, setErr] = React.useState(false);
  const [loading, setLoading] = React.useState(false);
  const submit = async () => {
    const code = ref.trim().toUpperCase().replace(/^#/, '');
    const t = (tickets || []).find((x) => x.id.toUpperCase() === code || x.id.toUpperCase() === 'SS-' + code || String(x.token || '').toUpperCase() === code);
    if (t) {
      onFound(t.token, t);
      return;
    }
    if (lookupReport) {
      setLoading(true);
      try {
        const found = await lookupReport(code.toLowerCase());
        if (found) {
          onFound(found.token, found);
          return;
        }
      } catch (e) {}
      setLoading(false);
    }
    setErr(true);
  };
  return (
    <div className="screen">
      <StatusBar />
      <div className="nav"><button className="iconbtn" onClick={onBack}><Icon name="back" size={18} /></button><span className="t">Track a report</span></div>
      <div className="scroll">
        <div className="pad">
          <h1 className="osr-h1" style={{ marginTop: 10 }}>Track an existing report</h1>
          <p className="osr-sub">Enter the status code from your confirmation, or a recent reference saved on this device.</p>
          <div className="osr-label" style={{ marginBottom: 8 }}>Status code or reference</div>
          <input className="inp" autoFocus placeholder="STATUS CODE" value={ref}
            onChange={(e) => { setRef(e.target.value); setErr(false); }}
            onKeyDown={(e) => { if (e.key === 'Enter') submit(); }} style={{ textTransform: 'uppercase' }} />
          {err && <p className="send-hint" style={{ textAlign: 'left', color: 'var(--st-amber)', margin: '10px 0 0' }}>We couldn't find a report with that code. Check the confirmation and try again.</p>}
          <Note icon="info" >Your status code is in the confirmation screen and can only open this one report.</Note>
        </div>
      </div>
      <div className="footer">
        <Btn variant="acc" onClick={submit} disabled={!ref.trim() || loading}>{loading ? 'Checking...' : 'Find my report'}</Btn>
        <HomeInd />
      </div>
    </div>
  );
}

function ResidentHome({ tickets, onReport, onOpenTicket, onMap, onMyIssues }) {
  const SS = window.SS;
  const open = (t) => SS.isOpenTicket(t);
  const openCount = tickets.filter(open).length;
  const recent = tickets.slice().sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt)).slice(0, 2);
  return (
    <div className="screen rh">
      <div className="rh-head">
        <img className="rh-hero-img" src="art/condo-hero.png" alt="" onError={(e) => { e.target.style.display = 'none'; }} />
        <div className="rh-bar">
          <Logo tone="dark" size={26} />
          <button className="rh-bell" aria-label="Notifications"><Icon name="message" size={20} /><span className="rh-dot" /></button>
        </div>
        <div className="rh-greet">
          <div className="rh-hello">Harbour View Strata</div>
          <h1 className="rh-bldg">Report a building issue</h1>
          <p className="rh-tag">No app required. Takes under a minute.</p>
        </div>
      </div>

      <div className="scroll">
        <div className="rh-primary">
          <button className="rh-report-card" onClick={onReport}>
            <span className="rh-report-ic"><Icon name="qr" size={24} /></span>
            <span className="rh-report-main">
              <span className="rh-report-k">Start a report</span>
              <span className="rh-report-v">Scan a QR poster or choose the closest building location.</span>
            </span>
            <Icon name="chevronR" size={18} className="rh-chev" />
          </button>
          <div className="rh-quick">
            <button onClick={onMyIssues}><Icon name="search" size={17} /> Track a report</button>
            <button onClick={onMap}><Icon name="ssMap" size={17} /> Pick location</button>
          </div>
          <p className="rh-trust"><Icon name="lock" size={13} /> Your contact details are only used for updates about your report.</p>
        </div>

        <div className="rh-sec">
          <h2>What happens next</h2>
        </div>
        <div className="rh-steps">
          <div><span>1</span><b>Submit</b><p>Tell council or management what happened.</p></div>
          <div><span>2</span><b>Review</b><p>The issue is checked and assigned to the right person.</p></div>
          <div><span>3</span><b>Updates</b><p>You can follow progress using your report reference.</p></div>
        </div>

        <div className="rh-sec compact">
          <h2>Building updates</h2>
          <button className="linkbtn" onClick={onMyIssues}>{openCount} open<Icon name="chevronR" size={15} /></button>
        </div>
        <div className="rh-list quiet">
          {recent.map((t) => (
            <button className="rh-row" key={t.id} onClick={() => onOpenTicket(t.id)}>
              <span className={'rh-thumb cat-' + t.category}><CatIcon id={t.category} size={22} /></span>
              <span className="rh-row-main">
                <span className="rh-row-t">{t.summary}</span>
                <span className="rh-row-d">{t.locationName.replace(' – Elevator Lobby', '')} · {SS.dateLabel(t.createdAt)}</span>
                <span className="rh-row-status"><StatusDot status={t.status} short /></span>
              </span>
              <Icon name="chevronR" size={18} className="rh-chev" />
            </button>
          ))}
        </div>
      </div>

      <nav className="rh-tabs">
        <a className="on"><Icon name="home" size={22} /> Home</a>
        <a onClick={onReport}><Icon name="pin" size={22} /> Report issue</a>
        <a onClick={onMyIssues}><Icon name="list" size={22} /> Track</a>
      </nav>
    </div>
  );
}

Object.assign(window, { ReportFlow, StatusPage, StopScreen, ExpiredPage, Confirmation, ScanLanding, FindReport, ResidentHome });
