// Session — demo flow: predefiniowany skrypt, user klika send, NPC odpowiada, po skrypcie auto-end

const DEMO_SCRIPT = [
  {
    user: "Hej Marek, masz chwilę? Chciałbym pogadać o czymś, co mnie zastanawia w ostatnich tygodniach.",
    npc: "Jasne, siadaj. Coś się stało?",
  },
  {
    user: "Zauważyłem, że przez ostatnie 3 tygodnie spóźniłeś się z dwoma PR-ami i dwa razy nie byłeś na standupie. Wcześniej to nie był twój styl. Co się dzieje?",
    npc: "No... rzeczywiście trochę się zdarzało. Ale ten PR to nie była moja wina, reviewer siedział dwa dni. A standup... no raz zaspałem, drugi raz był dentysta.",
  },
  {
    user: "Rozumiem, że były powody. Ale nie chcę rozmawiać o konkretnych przypadkach — bardziej o tym, co się u ciebie ogólnie dzieje. Wszystko ok?",
    npc: "(pauza) ...szczerze? Nie bardzo. Córka choruje od miesiąca, chodzę z nią po lekarzach. Żona pracuje rano, więc ja ją ogarniam. Nie chciałem tego wyciągać do pracy.",
  },
  {
    user: "Dzięki, że mi to mówisz. To musi być wyczerpujące — i ogarniać pracę na 100% i troszczyć się o chore dziecko. Jak się trzymasz?",
    npc: "Średnio. Śpię po 5 godzin, rano jestem rozwalony. Ale staram się nie odpuszczać roboty, bo nie chcę, żeby zespół to odczuł.",
  },
  {
    user: "Doceniam, że próbujesz — ale widać, że coś się sypie. Pomyślmy razem, jak to ułatwić. Co by pomogło? Zdalny tryb? Przesunięcie deadline'ów? Zdjęcie którejś z odpowiedzialności?",
    npc: "Najbardziej pomogłaby mi elastyczność rano — móc pracować zdalnie, zawieźć ją do lekarza i potem nadgonić po południu. I może ktoś drugi do review PR-ów, żebym nie był bottleneckiem.",
  },
  {
    user: "Okej, to się da zrobić. Umawiamy się: zdalnie rano do odwołania, review rozdzielamy z Kasią. Sprawdzimy się za 2 tygodnie. I proszę — mów mi, jak się coś zmieni, zanim to znowu zacznie się sypać.",
    npc: "Dzięki. Naprawdę. Bałem się, że będzie pretensja, a wyszła rozmowa. Odezwę się, jak coś się zmieni.",
  },
];

const Session = ({setRoute, scenario, setEndType}) => {
  const s = scenario || SCENARIO;
  // Wybierz scenariusz-skrypt na podstawie scenario.id; fallback: DEMO_SCRIPT (Marek)
  const scriptPack = (window.SCENARIO_SCRIPTS && s.id && window.SCENARIO_SCRIPTS[s.id]) || null;
  const SCRIPT = scriptPack ? scriptPack.script : DEMO_SCRIPT;
  const OPENING = scriptPack ? scriptPack.opening : "Hej. Mówiłeś że chcesz pogadać. O czym?";
  const [messages, setMessages] = React.useState([]);
  const [step, setStep] = React.useState(0); // indeks do SCRIPT
  const [typing, setTyping] = React.useState(false);
  const [micOn, setMicOn] = React.useState(false);
  const [ended, setEnded] = React.useState(false);
  const [started, setStarted] = React.useState(false);
  const [showComplete, setShowComplete] = React.useState(false);
  const scroller = React.useRef(null);

  const userTurns = messages.filter(m=>m.who==="user").length;
  const totalTurns = SCRIPT.length;
  const isLastStep = step >= totalTurns;
  const currentLine = isLastStep ? null : SCRIPT[step];

  React.useEffect(() => {
    if (scroller.current) scroller.current.scrollTop = scroller.current.scrollHeight;
  }, [messages, typing, showComplete]);

  const fmtTime = (offsetSec) => {
    const start = new Date(Date.now() - 8*60*1000);
    const t = new Date(start.getTime() + offsetSec*1000);
    return `${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`;
  };

  const startSession = () => {
    setStarted(true);
    setTyping(true);
    setTimeout(()=>{
      setMessages([{who:"npc", text:OPENING, t:0}]);
      setTyping(false);
    }, 1200);
  };

  const sendNext = () => {
    if (ended || typing || isLastStep) return;
    const line = SCRIPT[step];
    const baseT = messages.length * 32;
    setMessages(m=>[...m,{who:"user", text:line.user, t:baseT}]);
    setTyping(true);
    setStep(s=>s+1);

    setTimeout(()=>{
      setMessages(m=>[...m, {who:"npc", text:line.npc, t:baseT+20}]);
      setTyping(false);
      // Jeśli to była ostatnia linia — pokaż complete state i auto-end
      if (step + 1 >= totalTurns) {
        setTimeout(()=>{
          setShowComplete(true);
          setTimeout(()=>end("goal-achieved"), 4200);
        }, 800);
      }
    }, 1100 + Math.random()*700);
  };

  const end = (type="user-initiated") => {
    if (ended) return;
    setEnded(true);
    setEndType && setEndType(type);
    setTimeout(()=>setRoute("results"), 900);
  };

  const initials = s.npc.name.split(" ").map(x=>x[0]).slice(0,2).join("");

  // Demo preview: pokaż user co wyślesz jako następne (albo ghost bubble)
  const previewText = currentLine ? currentLine.user : "";

  return (
    <div className="scene fade-in">
      {/* Slim header */}
      <div style={{borderBottom:"1px solid var(--line)",padding:"16px 32px",display:"flex",alignItems:"center",justifyContent:"space-between",background:"rgba(10,10,16,.6)",backdropFilter:"blur(10px)"}}>
        <button className="btn link" onClick={()=>setRoute(started?"rpg-library":"briefing")}>
          <Icon name="arrow-left" size={14}/> {started?"Zapisz i wyjdź":"Wróć"}
        </button>
        <div style={{display:"flex",alignItems:"center",gap:12,opacity:started?1:0.5,transition:"opacity .4s"}}>
          <div style={{width:32,height:32,borderRadius:"50%",position:"relative",overflow:"hidden",flexShrink:0}}>
            <div className="mesh" style={{position:"absolute",inset:0}}/>
            <div style={{position:"absolute",inset:0,display:"grid",placeItems:"center",fontFamily:"var(--serif)",fontSize:13,color:"rgba(255,255,255,.85)"}}>{initials}</div>
          </div>
          <div style={{textAlign:"left"}}>
            <div style={{fontSize:14,fontWeight:500}}>{s.npc.name}</div>
            <div className="muted" style={{fontSize:11}}>{s.npc.role}</div>
          </div>
        </div>
        <div style={{fontFamily:"var(--mono)",fontSize:11,color:"var(--fg-4)",letterSpacing:".06em",minWidth:120,textAlign:"right",opacity:started?1:0.3,textTransform:"uppercase"}}>
          {started ? `Tura ${Math.min(userTurns+1,totalTurns)} / ${totalTurns}` : ""}
        </div>
      </div>

      {/* Body */}
      <div ref={scroller} style={{flex:1,overflowY:"auto",padding:"48px 24px"}}>
        <div style={{maxWidth:680,margin:"0 auto"}}>
          {!started && (
            <div className="fade-in" style={{textAlign:"center",paddingTop:60}}>
              <div style={{margin:"0 auto 28px",width:96,height:96,borderRadius:"50%",position:"relative",overflow:"hidden"}}>
                <div className="mesh" style={{position:"absolute",inset:0}}/>
                <div style={{position:"absolute",inset:0,display:"grid",placeItems:"center",fontFamily:"var(--serif)",fontSize:36,color:"#fff",textShadow:"0 2px 12px rgba(0,0,0,.3)"}}>{initials}</div>
              </div>
              <div style={{fontFamily:"var(--serif)",fontSize:28,letterSpacing:"-.01em",marginBottom:8}}>{s.npc.name}</div>
              <div className="muted" style={{fontSize:14,marginBottom:8}}>{s.npc.role}</div>
              <div className="muted" style={{fontSize:13,maxWidth:380,margin:"0 auto 36px",lineHeight:1.6}}>{s.npc.mood}</div>
              <button className="btn primary lg" onClick={startSession}>
                <Icon name="play" size={14}/> Rozpocznij sesję
              </button>
              <div className="muted" style={{fontSize:12,marginTop:16,fontFamily:"var(--mono)",letterSpacing:".04em"}}>DEMO · klikaj „Wyślij” żeby przejść przez rozmowę</div>
            </div>
          )}

          {messages.map((m,i) => {
            const prev = messages[i-1];
            const next = messages[i+1];
            const firstInGroup = !prev || prev.who !== m.who;
            const lastInGroup = !next || next.who !== m.who;
            const firstNpcOrAfterUser = m.who === "npc" && firstInGroup;

            if (m.who==="npc") return (
              <div key={i} className="msg-row npc">
                <div className={`msg-avatar ${lastInGroup?"":"hidden"}`}>
                  <div className="mesh" style={{position:"absolute",inset:0}}/>
                  <div className="mono">{initials}</div>
                </div>
                <div className="msg-col npc">
                  {firstNpcOrAfterUser && (
                    <div className="msg-meta">
                      <span className="name">{s.npc.name.split(" ")[0]}</span>
                      <span>·</span>
                      <span>{fmtTime(m.t||0)}</span>
                    </div>
                  )}
                  <div className="bubble npc">{m.text}</div>
                </div>
              </div>
            );
            return (
              <div key={i} className="msg-row user">
                <div className="msg-col user">
                  {firstInGroup && (
                    <div className="msg-meta">
                      <span>{fmtTime(m.t||0)}</span>
                    </div>
                  )}
                  <div className="bubble user">{m.text}</div>
                </div>
              </div>
            );
          })}
          {typing && (
            <div className="msg-row npc">
              <div className="msg-avatar">
                <div className="mesh" style={{position:"absolute",inset:0}}/>
                <div className="mono">{initials}</div>
              </div>
              <div className="msg-col npc">
                <div className="msg-meta">
                  <span className="name">{s.npc.name.split(" ")[0]}</span>
                  <span>pisze…</span>
                </div>
                <div className="bubble typing-bubble">
                  <span className="typing"><span/><span/><span/></span>
                </div>
              </div>
            </div>
          )}

          {showComplete && !ended && (
            <div className="fade-in" style={{margin:"40px auto 0",maxWidth:440,textAlign:"center",padding:"28px 24px",border:"1px solid rgba(183,131,255,.28)",borderRadius:16,background:"linear-gradient(180deg, rgba(183,131,255,.06), rgba(183,131,255,.02))"}}>
              <div style={{width:44,height:44,margin:"0 auto 14px",borderRadius:"50%",background:"rgba(183,131,255,.14)",display:"grid",placeItems:"center",color:"var(--accent)"}}>
                <Icon name="check" size={20}/>
              </div>
              <div style={{fontFamily:"var(--serif)",fontSize:22,letterSpacing:"-.01em",marginBottom:8}}>Rozmowa zamknięta</div>
              <div className="muted" style={{fontSize:13,lineHeight:1.6,marginBottom:4}}>
                Dotarliście razem do konkretu — ustalenia, follow-up, zaufanie.
              </div>
              <div className="muted" style={{fontSize:12,fontFamily:"var(--mono)",letterSpacing:".04em",textTransform:"uppercase",marginTop:14,opacity:.6}}>
                Generuję ocenę…
              </div>
            </div>
          )}

          {ended && (
            <div className="msg-row system"><div className="body">Sesja zakończona</div></div>
          )}
        </div>
      </div>

      {/* Composer — demo mode: pokazuje następną wiadomość jako preview */}
      <div style={{borderTop:"1px solid var(--line)",padding:"18px 24px 22px",background:"rgba(10,10,16,.7)",backdropFilter:"blur(10px)"}}>
        <div style={{maxWidth:680,margin:"0 auto"}}>
          {!started ? (
            <div className="input-wrap" style={{opacity:.5}}>
              <textarea placeholder="Rozpocznij sesję, żeby pisać…" disabled rows={1}/>
              <div className="acts">
                <button className="mic-btn" disabled><Icon name="mic" size={16}/></button>
                <button className="send-btn" disabled><Icon name="send" size={16}/></button>
              </div>
            </div>
          ) : isLastStep || showComplete || ended ? (
            <div className="input-wrap" style={{opacity:.5}}>
              <textarea placeholder="Rozmowa zakończona" disabled rows={1}/>
              <div className="acts">
                <button className="send-btn" disabled><Icon name="send" size={16}/></button>
              </div>
            </div>
          ) : (
            <React.Fragment>
              <div style={{fontSize:11,fontFamily:"var(--mono)",letterSpacing:".06em",textTransform:"uppercase",color:"var(--fg-4)",marginBottom:8,display:"flex",alignItems:"center",gap:8}}>
                <span style={{width:6,height:6,borderRadius:"50%",background:"var(--accent)",boxShadow:"0 0 8px var(--accent)"}}/>
                Twoja następna wiadomość · kliknij Wyślij
              </div>
              <div className="input-wrap demo-preview" style={{cursor:typing?"wait":"pointer"}} onClick={()=>!typing && sendNext()}>
                <textarea
                  value={previewText}
                  readOnly
                  rows={Math.min(4, Math.ceil(previewText.length/60))}
                  onKeyDown={e=>{if(e.key==="Enter"&&!e.shiftKey){e.preventDefault();sendNext();}}}
                  style={{cursor:typing?"wait":"pointer",pointerEvents:"none"}}
                />
                <div className="acts">
                  <button className={`mic-btn ${micOn?"on":""}`} onClick={(e)=>{e.stopPropagation();setMicOn(v=>!v);}} title="Dyktowanie"><Icon name="mic" size={16}/></button>
                  <button className="send-btn" onClick={(e)=>{e.stopPropagation();sendNext();}} disabled={typing}><Icon name="send" size={16}/></button>
                </div>
              </div>
            </React.Fragment>
          )}
          {started && !ended && !showComplete && !isLastStep && (
            <div style={{marginTop:8,textAlign:"right"}}>
              <button className="btn link" style={{fontSize:12,color:"var(--fg-4)"}} onClick={()=>end("user-initiated")}>Zakończ wcześniej</button>
            </div>
          )}
        </div>
      </div>
    </div>
  );
};

Object.assign(window, { Session });
