const {S,Head,I,P,PEOPLE,AV}=window.WFA;
const {TODAY:SC_TODAY,WD_SHORT:SC_WDS,wdIndex:scWd,addDays:scAdd,weekStart:scWeek,fmtLong:scLong}=window.WFA_TODAY;
const {UIButton,UIInput,UISelect,UICard,UIAvatar,UIAvatarGroup,UIPill,UITabs,UIModal,UIDataTable,UIStat,UIBanner,UIToggle,UIDrawer,UIEmptyState,UIProgress,UITextarea,UIToggleGroup}=window.XCOPEDesignSystem_bf80f1;

const SC_WD=["Seg","Ter","Qua","Qui","Sex","Sáb","Dom"];
const sc2=n=>String(n).padStart(2,"0");
const scHM=m=>sc2(Math.floor(m/60))+":"+sc2(m%60);
const scDur=m=>Math.floor(m/60)+"h"+(m%60?" "+sc2(m%60):"");

// shift patterns the company defines once and assigns to people
const SC_PADROES=[
  {id:"std",name:"Padrão 40h",desc:"Segunda a sexta, 09:00–18:00 com 1h de almoço",dias:[1,1,1,1,1,0,0],in:9*60,out:18*60,pausa:60,total:2400},
  {id:"cedo",name:"Turno da manhã",desc:"Segunda a sexta, 07:00–15:30",dias:[1,1,1,1,1,0,0],in:7*60,out:15*60+30,pausa:30,total:2400},
  {id:"tarde",name:"Turno da tarde",desc:"Segunda a sexta, 14:00–22:30",dias:[1,1,1,1,1,0,0],in:14*60,out:22*60+30,pausa:30,total:2400},
  {id:"p30",name:"Parcial 30h",desc:"Segunda a sexta, 09:00–15:00",dias:[1,1,1,1,1,0,0],in:9*60,out:15*60,pausa:0,total:1800},
  {id:"fds",name:"Fim de semana",desc:"Sábado e domingo, 10:00–19:00",dias:[0,0,0,0,0,1,1],in:10*60,out:19*60,pausa:60,total:960},
];
// who is on which pattern, plus this week's exceptions
const SC_PESSOAS=[
  {id:1,who:"Hugo Montenegro",dept:"Pessoas",pad:"std",excecao:null},
  {id:2,who:"Rui Pinto",dept:"Engenharia",pad:"std",excecao:{dia:2,tipo:"remoto",label:"Remoto"}},
  {id:3,who:"Ana Reis",dept:"Produto",pad:"p30",excecao:{dia:1,tipo:"ferias",label:"Férias"}},
  {id:4,who:"Carla Dias",dept:"Pessoas",pad:"std",excecao:null},
  {id:5,who:"Sofia Melo",dept:"Dados",pad:"cedo",excecao:null},
  {id:6,who:"Zain Franci",dept:"Produto",pad:"std",excecao:{dia:4,tipo:"ferias",label:"Férias"}},
  {id:7,who:"Tomás Jervell",dept:"Comercial",pad:"std",excecao:null},
  {id:8,who:"João Alves",dept:"Dados",pad:"tarde",excecao:null},
  {id:9,who:"Mira Mango",dept:"Comercial",pad:"fds",excecao:null},
];
const SC_EXC={remoto:{tone:"info",label:"Remoto"},ferias:{tone:"warning",label:"Férias"},formacao:{tone:"success",label:"Formação"}};

S.schedules=()=>{
  const [tab,setTab]=React.useState("semana");
  const [pessoas,setPessoas]=React.useState(SC_PESSOAS);
  const [padroes,setPadroes]=React.useState(SC_PADROES);
  const [novo,setNovo]=React.useState(false);
  const [atribuir,setAtribuir]=React.useState(null);
  const [sel,setSel]=React.useState(null);
  const [aviso,setAviso]=React.useState(null);
  const [dept,setDept] =React.useState("all");
  React.useEffect(()=>{if(!aviso)return;const t=setTimeout(()=>setAviso(null),3200);return ()=>clearTimeout(t);},[aviso]);

  const semana=Array.from({length:7},(_,i)=>scAdd(scWeek(SC_TODAY),i));
  const hojeIdx=scWd(SC_TODAY);
  const depts=[...new Set(pessoas.map(p=>p.dept))];
  const vis=pessoas.filter(p=>dept==="all"||p.dept===dept);
  const padrao=id=>padroes.find(x=>x.id===id);
  const cur=sel?pessoas.find(p=>p.id===sel):null;

  // cover: how many people are scheduled each day
  const cobertura=semana.map((_,i)=>vis.filter(p=>{
    const pad=padrao(p.pad);
    if(!pad.dias[i])return false;
    if(p.excecao&&p.excecao.dia===i&&p.excecao.tipo==="ferias")return false;
    return true;}).length);
  const minCobertura=Math.min(...cobertura.slice(0,5));

  const mudaPadrao=(pid,padId)=>{setPessoas(ps=>ps.map(p=>p.id===pid?{...p,pad:padId}:p));
    setAviso(pessoas.find(p=>p.id===pid).who+" passou para "+padrao(padId).name+".");};

  const cols="minmax(180px,1.4fr) repeat(7,minmax(72px,1fr))";

  return <React.Fragment>
  <Head scoped title="Horários" desc={pessoas.length+" pessoas · "+padroes.length+" padrões de horário"}
    actions={<div className="row" style={{gap:8}}>
      <UIButton variant="secondary" onClick={()=>setAtribuir({})}>Atribuir padrão</UIButton>
      <UIButton icon={<I d={P.plus} size={16}/>} onClick={()=>setNovo(true)}>Novo padrão</UIButton>
    </div>}/>

  {aviso&&<UIBanner tone="success" title="Feito" style={{marginBottom:16}}>{aviso}</UIBanner>}
  {minCobertura<3&&<UIBanner tone="warning" title="Cobertura baixa num dia da semana" style={{marginBottom:16}}>
    Há dias úteis com apenas {minCobertura} pessoas escaladas. Verifica se cobre o serviço mínimo do departamento.
  </UIBanner>}

  <UICard style={{marginBottom:16,padding:"14px 20px"}}>
    <div style={{display:"flex",alignItems:"center",justifyContent:"space-between",gap:24,flexWrap:"wrap",fontSize:"var(--ui-fs-sm)"}}>
      <div style={{display:"flex",alignItems:"center",gap:32,flexWrap:"wrap"}}>
        <span className="row" style={{gap:8}}><span className="muted">Semana</span><strong>{semana[0].getDate()} a {semana[6].getDate()} de julho</strong></span>
        <span className="row" style={{gap:8}}><span className="muted">Escaladas hoje</span><strong style={{fontVariantNumeric:"tabular-nums"}}>{cobertura[hojeIdx]}</strong></span>
        <span className="row" style={{gap:8}}><span className="muted">Horas previstas</span><strong style={{fontVariantNumeric:"tabular-nums"}}>{scDur(vis.reduce((n,p)=>n+padrao(p.pad).total,0))}</strong></span>
      </div>
      <span className="row" style={{gap:8}}><span className="muted">Exceções esta semana</span><UIPill tone="info" dot>{vis.filter(p=>p.excecao).length}</UIPill></span>
    </div>
  </UICard>

  <UICard style={{padding:0,overflow:"hidden",flex:1,minHeight:0,display:"flex",flexDirection:"column"}}>
    <div className="row" style={{padding:"12px 16px",borderBottom:"1px solid var(--ui-divider)",gap:16,flexWrap:"wrap"}}>
      <UITabs value={tab} onChange={setTab} items={[{value:"semana",label:"Semana"},{value:"padroes",label:"Padrões",count:padroes.length},{value:"pessoas",label:"Por pessoa",count:pessoas.length}]}/>
      <div className="spring"/>
      {tab==="semana"&&<UIToggleGroup spacing={0} value={dept} onChange={v=>setDept(v||"all")} items={[["all","Todos"],...depts.map(d=>[d,d])].map(([value,label])=>({value,label}))}/>}
    </div>

    {tab==="semana"&&<div style={{flex:1,minHeight:0,overflow:"auto"}}>
      <div style={{display:"grid",gridTemplateColumns:cols,position:"sticky",top:0,zIndex:1,background:"var(--ui-surface)",borderBottom:"1px solid var(--ui-border)"}}>
        <div style={{padding:"12px 16px",fontSize:"var(--ui-fs-xs)",fontWeight:600,letterSpacing:"0.06em",textTransform:"uppercase",color:"var(--ui-text-3)"}}>Pessoa</div>
        {semana.map((dt,i)=>{const hoje=i===hojeIdx;
          return <div key={i} style={{padding:"10px 6px",textAlign:"center",background:hoje?"var(--ui-surface-2)":"transparent"}}>
            <div className="muted" style={{fontSize:"var(--ui-fs-xs)",fontWeight:600}}>{SC_WD[i]}</div>
            <div style={{fontSize:"var(--ui-fs-sm)",fontWeight:hoje?700:500,fontVariantNumeric:"tabular-nums",marginTop:2}}>{dt.getDate()}</div>
          </div>;})}
      </div>

      {vis.map(p=>{const pad=padrao(p.pad);
        return <div key={p.id} style={{display:"grid",gridTemplateColumns:cols,alignItems:"stretch",borderBottom:"1px solid var(--ui-divider)"}}>
          <div className="row" style={{gap:10,padding:"10px 16px",minWidth:0,cursor:"pointer"}} onClick={()=>setSel(p.id)}>
            {AV(p.who,"xs")}
            <div style={{minWidth:0}}>
              <div style={{fontSize:"var(--ui-fs-sm)",fontWeight:600,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"}}>{p.who}</div>
              <div className="muted" style={{fontSize:"var(--ui-fs-xs)"}}>{pad.name}</div>
            </div>
          </div>
          {semana.map((dt,i)=>{
            const trabalha=pad.dias[i];
            const exc=p.excecao&&p.excecao.dia===i?p.excecao:null;
            const hoje=i===hojeIdx;
            return <div key={i} style={{padding:6,background:hoje?"var(--ui-surface-2)":"transparent",display:"flex"}}>
              {exc
                ? <span style={{flex:1,borderRadius:"var(--ui-r-sm)",background:"var(--ui-"+SC_EXC[exc.tipo].tone+"-bg)",color:"var(--ui-"+SC_EXC[exc.tipo].tone+")",display:"grid",placeItems:"center",fontSize:"var(--ui-fs-xs)",fontWeight:600,minHeight:38}}>{SC_EXC[exc.tipo].label}</span>
                : trabalha
                  ? <span style={{flex:1,borderRadius:"var(--ui-r-sm)",background:"var(--ui-surface-3)",borderLeft:"3px solid var(--ui-data)",display:"flex",flexDirection:"column",justifyContent:"center",padding:"0 8px",minHeight:38}}>
                      <span style={{fontSize:"var(--ui-fs-xs)",fontWeight:600,fontVariantNumeric:"tabular-nums"}}>{scHM(pad.in)}</span>
                      <span className="muted" style={{fontSize:"var(--ui-fs-xs)",fontVariantNumeric:"tabular-nums"}}>{scHM(pad.out)}</span>
                    </span>
                  : <span style={{flex:1,minHeight:38}}/>}
            </div>;})}
        </div>;})}

      <div style={{display:"grid",gridTemplateColumns:cols,alignItems:"center",background:"var(--ui-surface-2)",borderTop:"1px solid var(--ui-border)"}}>
        <div style={{padding:"12px 16px",fontSize:"var(--ui-fs-xs)",fontWeight:600,letterSpacing:"0.06em",textTransform:"uppercase",color:"var(--ui-text-3)"}}>Cobertura</div>
        {cobertura.map((n,i)=><div key={i} style={{padding:"12px 6px",textAlign:"center",fontSize:"var(--ui-fs-sm)",fontWeight:600,fontVariantNumeric:"tabular-nums",color:i<5&&n<3?"var(--ui-warning)":"var(--ui-text)"}}>{n}</div>)}
      </div>
    </div>}

    {tab==="padroes"&&<div style={{flex:1,minHeight:0,overflow:"auto",padding:16,display:"flex",flexDirection:"column",gap:12}}>
      {padroes.map(pad=><UICard key={pad.id} elevation={0}>
        <div className="row" style={{gap:16,flexWrap:"wrap"}}>
          <div style={{flex:1,minWidth:200}}>
            <div style={{fontWeight:600}}>{pad.name}</div>
            <div className="muted" style={{fontSize:"var(--ui-fs-sm)",marginTop:2}}>{pad.desc}</div>
          </div>
          <div className="row" style={{gap:4}}>
            {pad.dias.map((d,i)=><span key={i} title={SC_WD[i]}
              style={{width:26,height:26,borderRadius:"var(--ui-r-sm)",display:"grid",placeItems:"center",fontSize:"var(--ui-fs-xs)",fontWeight:600,
                background:d?"var(--ui-data)":"var(--ui-surface-3)",color:d?"#fff":"var(--ui-text-3)"}}>{SC_WDS[i]}</span>)}
          </div>
          <span style={{fontSize:"var(--ui-fs-sm)",fontVariantNumeric:"tabular-nums",minWidth:64,textAlign:"right"}}>{scDur(pad.total)}/sem</span>
          <UIPill>{pessoas.filter(p=>p.pad===pad.id).length} pessoas</UIPill>
          <UIButton size="sm" variant="outline" onClick={()=>setAtribuir({pad:pad.id})}>Atribuir</UIButton>
        </div>
      </UICard>)}
    </div>}

    {tab==="pessoas"&&<div style={{flex:1,minHeight:0,overflow:"auto",padding:"12px 16px 16px"}}>
      <UIDataTable rows={pessoas} rowKey="id" searchable pageSize={10} onRowClick={p=>setSel(p.id)}
        searchPlaceholder="Pesquisar pessoas…"
        columns={[
          {key:"who",label:"Pessoa",sortable:true,render:v=><span className="row" style={{gap:12}}>{AV(v,"xs")}<span style={{fontWeight:600}}>{v}</span></span>},
          {key:"dept",label:"Departamento",sortable:true},
          {key:"pad",label:"Padrão",sortable:true,render:v=><UIPill>{padrao(v).name}</UIPill>},
          {key:"horas",label:"Horas/semana",align:"right",render:(v,r)=><span style={{fontVariantNumeric:"tabular-nums"}}>{scDur(padrao(r.pad).total)}</span>},
          {key:"excecao",label:"Exceção",align:"right",render:v=>v?<UIPill tone={SC_EXC[v.tipo].tone} dot>{v.label} · {SC_WD[v.dia]}</UIPill>:<span className="muted">—</span>},
        ]}/>
    </div>}
  </UICard>

  <UIDrawer open={!!cur} width={420} onClose={()=>setSel(null)}
    header={cur&&<span className="row" style={{gap:10}}>{AV(cur.who,"sm")}<span><span style={{fontWeight:600,display:"block"}}>{cur.who}</span><span className="muted" style={{fontSize:"var(--ui-fs-sm)"}}>{cur.dept}</span></span></span>}
    footer={cur&&<React.Fragment><div className="spring"/><UIButton variant="ghost" onClick={()=>setSel(null)}>Fechar</UIButton><UIButton onClick={()=>{setSel(null);setAtribuir({pessoa:cur.id});}}>Mudar padrão</UIButton></React.Fragment>}>
    {cur&&<div style={{display:"flex",flexDirection:"column",gap:24}}>
      <div>
        <div style={{fontSize:"var(--ui-fs-h3)",fontWeight:600}}>{padrao(cur.pad).name}</div>
        <div className="muted" style={{fontSize:"var(--ui-fs-sm)",marginTop:4}}>{padrao(cur.pad).desc}</div>
      </div>
      <div style={{display:"grid",gridTemplateColumns:"116px minmax(0,1fr)",gap:"12px 16px",alignItems:"center",fontSize:"var(--ui-fs-sm)"}}>
        <span className="muted">Entrada</span><span style={{fontVariantNumeric:"tabular-nums"}}>{scHM(padrao(cur.pad).in)}</span>
        <span className="muted">Saída</span><span style={{fontVariantNumeric:"tabular-nums"}}>{scHM(padrao(cur.pad).out)}</span>
        <span className="muted">Pausa</span><span>{padrao(cur.pad).pausa?padrao(cur.pad).pausa+" min":"Sem pausa registada"}</span>
        <span className="muted">Semana</span><span style={{fontVariantNumeric:"tabular-nums"}}>{scDur(padrao(cur.pad).total)}</span>
      </div>
      <div>
        <div style={{fontWeight:600,fontSize:"var(--ui-fs-sm)",marginBottom:8}}>Dias de trabalho</div>
        <div className="row" style={{gap:6}}>
          {padrao(cur.pad).dias.map((d,i)=><span key={i}
            style={{flex:1,padding:"8px 0",textAlign:"center",borderRadius:"var(--ui-r-sm)",fontSize:"var(--ui-fs-xs)",fontWeight:600,
              background:d?"var(--ui-data)":"var(--ui-surface-3)",color:d?"#fff":"var(--ui-text-3)"}}>{SC_WDS[i]}</span>)}
        </div>
      </div>
      {cur.excecao&&<UIBanner tone={SC_EXC[cur.excecao.tipo].tone} title={"Exceção esta semana · "+SC_WD[cur.excecao.dia]}>{cur.excecao.label} em vez do horário normal.</UIBanner>}
    </div>}
  </UIDrawer>

  <UIModal open={!!atribuir} onClose={()=>setAtribuir(null)} title="Atribuir padrão de horário" width={480}
    footer={<div className="row" style={{gap:8}}><span className="muted" style={{fontSize:"var(--ui-fs-sm)"}}>Entra em vigor na próxima semana</span><div className="spring"/><UIButton variant="ghost" onClick={()=>setAtribuir(null)}>Cancelar</UIButton>
      <UIButton onClick={()=>{const a=atribuir||{};if(a.pessoa&&a.pad)mudaPadrao(a.pessoa,a.pad);else setAviso("Padrão atribuído às pessoas selecionadas.");setAtribuir(null);}}>Atribuir</UIButton></div>}>
    <div style={{display:"flex",flexDirection:"column",gap:16}}>
      <UISelect label="Padrão" value={(atribuir&&atribuir.pad)||"std"} onChange={e=>setAtribuir(a=>({...a,pad:e.target.value}))} options={padroes.map(p=>({value:p.id,label:p.name}))}/>
      <UISelect label="Aplicar a" value={(atribuir&&atribuir.pessoa)||"todos"} onChange={e=>setAtribuir(a=>({...a,pessoa:e.target.value==="todos"?null:Number(e.target.value)}))}
        options={[{value:"todos",label:"Departamento inteiro"},...pessoas.map(p=>({value:String(p.id),label:p.who}))]}/>
      <UIToggle label="Notificar as pessoas afetadas" defaultChecked/>
    </div>
  </UIModal>

  <UIModal open={novo} onClose={()=>setNovo(false)} title="Novo padrão de horário" width={520}
    footer={<div className="row" style={{gap:8}}><div className="spring"/><UIButton variant="ghost" onClick={()=>setNovo(false)}>Cancelar</UIButton><UIButton onClick={()=>{setNovo(false);setAviso("Padrão criado. Já podes atribuí-lo a pessoas.");}}>Criar padrão</UIButton></div>}>
    <div style={{display:"flex",flexDirection:"column",gap:16}}>
      <UIInput label="Nome" placeholder="Ex.: Turno de noite"/>
      <div style={{display:"grid",gridTemplateColumns:"1fr 1fr 1fr",gap:16}}>
        <UIInput label="Entrada" placeholder="09:00"/><UIInput label="Saída" placeholder="18:00"/><UIInput label="Pausa (min)" placeholder="60"/>
      </div>
      <div>
        <div style={{fontSize:"var(--ui-fs-sm)",fontWeight:500,marginBottom:8}}>Dias de trabalho</div>
        <UIToggleGroup type="multiple" spacing={0} defaultValue={["0","1","2","3","4"]} items={SC_WDS.map((d,i)=>({value:String(i),label:SC_WD[i]}))}/>
      </div>
      <UIToggle label="Permitir registo de ponto fora do horário" />
    </div>
  </UIModal>
  </React.Fragment>;
};
