// New HR screens: Programs list, Catalog, Company context, User sessions drill-down

// ---------------- Programs List (entry point) ----------------
const HR_VIEW_KEY = "hr-programs-view";
const HR_SORT_KEY = "hr-programs-sort";

const HrProgramsList = ({setRoute, setActiveProgram}) => {
  const [filter, setFilter] = React.useState("all");
  const [view, setView] = React.useState(()=> localStorage.getItem(HR_VIEW_KEY) || "cards");
  const [sortRaw, setSortRaw] = React.useState(()=> localStorage.getItem(HR_SORT_KEY) || "modified:desc");
  const [sortField, sortDir] = sortRaw.split(":");

  React.useEffect(()=>{ localStorage.setItem(HR_VIEW_KEY, view); },[view]);
  React.useEffect(()=>{ localStorage.setItem(HR_SORT_KEY, sortRaw); },[sortRaw]);

  const ctxEmpty = !HR_CONTEXT.industry && !HR_CONTEXT.culture && !HR_CONTEXT.situations;

  const filtered = HR_PROGRAMS.filter(p => filter==="all" ? true : p.status===filter);

  // Sort
  const sortKeys = {
    "modified":  p => p.modifiedAt ?? 0,
    "created":   p => p.createdTs ?? 0,
    "deadline":  p => p.deadlineTs ?? Infinity,
    "assigned":  p => p.assigned ?? 0,
    "score":     p => p.avgScore ?? -1,
  };
  const getter = sortKeys[sortField] || sortKeys["modified"];
  const programs = [...filtered].sort((a,b) => {
    const av = getter(a), bv = getter(b);
    if (av === bv) return 0;
    return (av < bv ? -1 : 1) * (sortDir==="asc" ? 1 : -1);
  });

  const counts = {
    all: HR_PROGRAMS.length,
    live: HR_PROGRAMS.filter(p=>p.status==="live").length,
    draft: HR_PROGRAMS.filter(p=>p.status==="draft").length,
    done: HR_PROGRAMS.filter(p=>p.status==="done").length,
  };

  const filters = [
    {id:"all", label:"Wszystkie"},
    {id:"live", label:"Live"},
    {id:"draft", label:"Draft"},
    {id:"done", label:"Zakończone"},
  ];

  const openProgram = (id) => {
    setActiveProgram(id);
    setRoute("hr-dashboard");
  };

  const toggleSortDir = () => setSortRaw(`${sortField}:${sortDir==="asc"?"desc":"asc"}`);

  return (
    <div className="screen wide slide-up">
      {/* Context banner — only when empty */}
      {ctxEmpty && (
        <div className="ctx-banner">
          <div className="ctx-banner-dot"><Icon name="info" size={14}/></div>
          <div style={{flex:1}}>
            <div style={{fontSize:13,fontWeight:500,marginBottom:2}}>Kontekst firmy nie jest uzupełniony</div>
            <div style={{fontSize:12,color:"var(--fg-3)",lineHeight:1.5}}>AI użyje domyślnego profilu. Uzupełnij, żeby rozmowy lepiej pasowały do waszej rzeczywistości.</div>
          </div>
          <button className="btn ghost sm" onClick={()=>setRoute("hr-context")}>Uzupełnij →</button>
        </div>
      )}

      <div className="flex between" style={{marginBottom:32,alignItems:"flex-end"}}>
        <div>
          <h1 className="page-title" style={{marginBottom:12}}>Programy <em>rozwojowe</em></h1>
          <div className="subtitle">Stwórz program, przypisz zespołom, śledź postępy. Każdy program = zestaw scenariuszy z deadlinem i kryterium ukończenia.</div>
        </div>
        <button className="btn primary lg" onClick={()=>setRoute("hr-program-new")}>
          <Icon name="plus" size={14}/> Nowy program
        </button>
      </div>

      {/* Toolbar: filters + sort + view toggle */}
      <div style={{display:"flex",gap:12,flexWrap:"wrap",marginBottom:24,alignItems:"center"}}>
        <div style={{display:"flex",gap:8,flexWrap:"wrap"}}>
          {filters.map(f => (
            <button key={f.id}
              className={`pill ${filter===f.id?"on":""}`}
              onClick={()=>setFilter(f.id)}>
              {f.label}
              <span style={{marginLeft:8,opacity:.5,fontFamily:"var(--mono)",fontSize:11}}>{counts[f.id]}</span>
            </button>
          ))}
        </div>
        <div style={{flex:1}}/>

        <div className="filter-group">
          <span className="filter-label">Sortuj</span>
          <select className="select-pill" value={sortField} onChange={e=>setSortRaw(`${e.target.value}:${sortDir}`)}>
            <option value="modified">Ostatnio modyfikowane</option>
            <option value="created">Data utworzenia</option>
            <option value="deadline">Deadline</option>
            <option value="assigned">Liczba przypisanych</option>
            <option value="score">Średni wynik</option>
          </select>
          <button className="icon-btn" onClick={toggleSortDir} title={sortDir==="asc"?"Rosnąco":"Malejąco"} style={{padding:"6px 8px",border:"1px solid var(--line)",borderRadius:8}}>
            <Icon name={sortDir==="asc"?"trend-up":"trend-down"} size={13}/>
          </button>
        </div>

        <div className="view-toggle">
          <button className={view==="cards"?"on":""} onClick={()=>setView("cards")} title="Widok kart"><Icon name="grid" size={14}/></button>
          <button className={view==="list"?"on":""} onClick={()=>setView("list")} title="Widok listy"><Icon name="layers" size={14}/></button>
        </div>
      </div>

      {programs.length===0 ? (
        <ProgramsEmpty setRoute={setRoute}/>
      ) : view==="cards" ? (
        <div className="grid-2" style={{gap:20}}>
          {programs.map(p => <ProgramCard key={p.id} p={p} onClick={()=>openProgram(p.id)}/>)}
        </div>
      ) : (
        <ProgramsListView programs={programs} onOpen={openProgram}/>
      )}
    </div>
  );
};

const ProgramCard = ({p, onClick}) => {
  const isDraft = p.status==="draft";
  const isDone  = p.status==="done";
  const isLive  = p.status==="live";

  return (
    <div
      className={`card hover program-card ${isDone?"is-done":""}`}
      onClick={onClick}
      style={{cursor:"pointer",position:"relative",overflow:"hidden"}}
    >
      {/* Status stripe */}
      <div style={{position:"absolute",left:0,top:0,bottom:0,width:3,background: isLive?"var(--ok)" : isDraft?"var(--line-2)" : "var(--fg-5, var(--fg-4))"}}/>

      <div className="card-body" style={{padding:"24px 26px 22px 28px"}}>
        <div className="flex between" style={{marginBottom:12,alignItems:"flex-start"}}>
          <div style={{flex:1,minWidth:0}}>
            <div style={{display:"flex",gap:8,alignItems:"center",marginBottom:8,flexWrap:"wrap"}}>
              {isLive && <span className="chip" style={{background:"rgba(52,211,153,.12)",color:"var(--ok)",borderColor:"rgba(52,211,153,.3)",fontSize:10,letterSpacing:".06em"}}>LIVE</span>}
              {isDraft && <span className="chip" style={{fontSize:10,letterSpacing:".06em",color:"var(--fg-3)"}}>DRAFT</span>}
              {isDone && <span className="chip" style={{fontSize:10,letterSpacing:".06em",color:"var(--fg-4)"}}>ZAKOŃCZONY</span>}
              {p.mode==="suggested" && <span className="chip" style={{fontSize:10,letterSpacing:".06em",color:"var(--fg-3)"}}>SUGEROWANY</span>}
              {p.mode==="required" && isLive && <span className="chip accent" style={{fontSize:10}}>OBOWIĄZKOWY</span>}
            </div>
            <div style={{fontFamily:"var(--serif)",fontSize:26,letterSpacing:"-.01em",marginBottom:6,lineHeight:1.15}}>{p.name}</div>
            <div className="muted" style={{fontSize:12,lineHeight:1.5}}>{p.skills} umiejętności · {p.scenarios} scenariuszy · {p.deadlineShort}</div>
          </div>
          <Icon name="arrow-right" size={16}/>
        </div>

        {/* KPI inline */}
        {!isDraft ? (
          <div style={{display:"flex",gap:24,margin:"18px 0 14px",paddingTop:14,borderTop:"1px solid var(--line)"}}>
            <div>
              <div style={{fontFamily:"var(--serif)",fontSize:22}}>{p.assigned}</div>
              <div className="muted" style={{fontSize:11,fontFamily:"var(--mono)",letterSpacing:".04em",textTransform:"uppercase",marginTop:2}}>przypisanych</div>
            </div>
            <div>
              <div style={{fontFamily:"var(--serif)",fontSize:22}}>{p.active}</div>
              <div className="muted" style={{fontSize:11,fontFamily:"var(--mono)",letterSpacing:".04em",textTransform:"uppercase",marginTop:2}}>aktywnych</div>
            </div>
            <div>
              <div style={{fontFamily:"var(--serif)",fontSize:22,color:p.overdue>0?"var(--bad)":"var(--fg)"}}>{p.overdue}</div>
              <div className="muted" style={{fontSize:11,fontFamily:"var(--mono)",letterSpacing:".04em",textTransform:"uppercase",marginTop:2}}>{p.overdue>0?"przeterm.":"po term."}</div>
            </div>
            <div style={{flex:1,textAlign:"right"}}>
              {p.avgScore !== null && (
                <>
                  <div style={{fontFamily:"var(--serif)",fontSize:22,color:p.avgScore>=70?"var(--ok)":"var(--warn)"}}>{p.avgScore}%</div>
                  <div className="muted" style={{fontSize:11,fontFamily:"var(--mono)",letterSpacing:".04em",textTransform:"uppercase",marginTop:2}}>śr. wynik</div>
                </>
              )}
            </div>
          </div>
        ) : (
          <div style={{padding:"18px 0 4px",color:"var(--fg-3)",fontSize:13}}>Jeszcze nie opublikowany. Kliknij aby dokończyć konfigurację.</div>
        )}

        {/* Score-band breakdown — 3 koszyki: poniżej progu / w progu / wysoki */}
        {p.histo && (()=>{
          // histogram ma 10 koszyków po 10%. Próg 70%.
          const low  = p.histo.slice(0,6).reduce((a,b)=>a+b,0);  // 0-60
          const mid  = p.histo.slice(6,8).reduce((a,b)=>a+b,0);  // 60-80
          const high = p.histo.slice(8,10).reduce((a,b)=>a+b,0); // 80-100
          const total = low + mid + high;
          if (!total) return null;
          const pct = (n) => (n/total)*100;
          return (
            <div>
              <div className="flex between" style={{marginBottom:8,alignItems:"baseline"}}>
                <div className="muted" style={{fontSize:11,fontFamily:"var(--mono)",letterSpacing:".04em",textTransform:"uppercase"}}>Rozkład wyników</div>
                <div className="muted" style={{fontSize:11}}>{total} prób · próg 70%</div>
              </div>
              <div className="band-bar" title={`poniżej 60%: ${low} · 60–80%: ${mid} · 80–100%: ${high}`}>
                {low>0  && <div className="band-seg band-low"  style={{width:`${pct(low)}%`}}  title={`Poniżej progu (0–60%): ${low} prób · ${Math.round(pct(low))}%`}>{pct(low)>=12 && low}</div>}
                {mid>0  && <div className="band-seg band-mid"  style={{width:`${pct(mid)}%`}}  title={`W progu (60–80%): ${mid} prób · ${Math.round(pct(mid))}%`}>{pct(mid)>=12 && mid}</div>}
                {high>0 && <div className="band-seg band-high" style={{width:`${pct(high)}%`}} title={`Powyżej (80–100%): ${high} prób · ${Math.round(pct(high))}%`}>{pct(high)>=12 && high}</div>}
              </div>
              <div style={{display:"flex",gap:14,marginTop:8,fontSize:11,color:"var(--fg-3)"}}>
                <span style={{display:"flex",alignItems:"center",gap:6}}><span className="band-dot band-low"/>0–60%</span>
                <span style={{display:"flex",alignItems:"center",gap:6}}><span className="band-dot band-mid"/>60–80%</span>
                <span style={{display:"flex",alignItems:"center",gap:6}}><span className="band-dot band-high"/>80–100%</span>
              </div>
            </div>
          );
        })()}
      </div>
    </div>
  );
};

const ProgramsListView = ({programs, onOpen}) => (
  <div className="program-list">
    <div className="program-list-head">
      <span>Program</span>
      <span>Status</span>
      <span>Tryb</span>
      <span style={{textAlign:"right"}}>Przypisanych</span>
      <span style={{textAlign:"right"}}>Śr. wynik</span>
      <span>Deadline</span>
      <span/>
    </div>
    {programs.map(p => {
      const isDraft = p.status==="draft";
      const isDone  = p.status==="done";
      const isLive  = p.status==="live";
      return (
        <div key={p.id} className={`program-list-row ${isDone?"is-done":""}`} onClick={()=>onOpen(p.id)}>
          <div>
            <div style={{fontSize:14,fontWeight:500,lineHeight:1.3}}>{p.name}</div>
            <div className="muted" style={{fontSize:11,marginTop:2}}>{p.skills} umiej. · {p.scenarios} scen.</div>
          </div>
          <div>
            {isLive && <span className="chip" style={{background:"rgba(52,211,153,.12)",color:"var(--ok)",borderColor:"rgba(52,211,153,.3)",fontSize:10}}>LIVE</span>}
            {isDraft && <span className="chip" style={{fontSize:10,color:"var(--fg-3)"}}>DRAFT</span>}
            {isDone && <span className="chip" style={{fontSize:10,color:"var(--fg-4)"}}>ZAKOŃCZONY</span>}
          </div>
          <div style={{fontSize:12,color:"var(--fg-3)"}}>{p.mode==="required"?"Obowiązkowy":"Sugerowany"}</div>
          <div style={{textAlign:"right",fontFamily:"var(--mono)",fontSize:13}}>{p.assigned ?? "—"}</div>
          <div style={{textAlign:"right",fontFamily:"var(--mono)",fontSize:13,color:p.avgScore>=70?"var(--ok)":p.avgScore!=null?"var(--warn)":"var(--fg-4)"}}>{p.avgScore!=null?`${p.avgScore}%`:"—"}</div>
          <div style={{fontSize:12,color:"var(--fg-3)"}}>{p.deadlineShort || "—"}</div>
          <div style={{textAlign:"right",color:"var(--fg-4)"}}><Icon name="arrow-right" size={14}/></div>
        </div>
      );
    })}
  </div>
);

const ProgramsEmpty = ({setRoute}) => (
  <div style={{padding:"80px 40px",textAlign:"center",border:"1px dashed var(--line-2)",borderRadius:16}}>
    <div style={{fontFamily:"var(--serif)",fontSize:32,letterSpacing:"-.02em",marginBottom:12}}>Brak programów w tym widoku.</div>
    <div style={{color:"var(--fg-3)",fontSize:14,marginBottom:28,maxWidth:480,margin:"0 auto 28px",lineHeight:1.5}}>
      Zacznij od kontekstu firmy, potem wybierz umiejętności z katalogu i stwórz pierwszy program.
    </div>
    <div style={{display:"flex",gap:12,justifyContent:"center"}}>
      <button className="btn ghost" onClick={()=>setRoute("hr-context")}>Kontekst firmy</button>
      <button className="btn ghost" onClick={()=>setRoute("hr-catalog")}>Przeglądaj katalog</button>
      <button className="btn primary" onClick={()=>setRoute("hr-program-new")}><Icon name="plus" size={14}/> Stwórz program</button>
    </div>
  </div>
);

Object.assign(window, { HrProgramsList });
