/* global React, sb, Card, Badge, Button, Icon, ICONS */
const { useState, useEffect } = React;

// ─── Constants ───────────────────────────────────────────────────────────────
const PT_CATS = [
  { id:'todos',     label:'Todos'        },
  { id:'design',    label:'Design'       },
  { id:'social',    label:'Social Media' },
  { id:'marketing', label:'Marketing'    },
  { id:'gestao',    label:'Gestão'       },
  { id:'dev',       label:'Dev'          },
  { id:'geral',     label:'Geral'        },
];
const CAT_TONE = { design:'brand', social:'cyan', marketing:'volcano', gestao:'success', dev:'warning', geral:'neutral' };

const PRIORITY_COLOR = { alta:'#FF6A6A', media:'#FA8C16', baixa:'#52C41A' };

function uid() { return Math.random().toString(36).slice(2,10); }

// ─── Built-in templates ──────────────────────────────────────────────────────
const BUILTIN = [
  {
    id:'bi_identidade', builtin:true, name:'Identidade Visual', category:'design',
    description:'Do briefing ao manual de marca — processo completo de criação de identidade.',
    stages:[
      { id:'s1', name:'Briefing', tasks:[
        { id:'t1', name:'Reunião inicial com cliente', priority:'alta', days:0 },
        { id:'t2', name:'Pesquisa de referências e concorrentes', priority:'media', days:1 },
      ]},
      { id:'s2', name:'Conceito', tasks:[
        { id:'t3', name:'Moodboard e direção criativa', priority:'alta', days:3 },
        { id:'t4', name:'Apresentação do conceito ao cliente', priority:'alta', days:5 },
      ]},
      { id:'s3', name:'Criação', tasks:[
        { id:'t5', name:'Desenvolvimento do logotipo', priority:'alta', days:7 },
        { id:'t6', name:'Paleta de cores e tipografia', priority:'media', days:9 },
        { id:'t7', name:'Variações e adaptações', priority:'baixa', days:11 },
      ]},
      { id:'s4', name:'Aprovação', tasks:[
        { id:'t8', name:'Apresentação ao cliente', priority:'alta', days:12 },
        { id:'t9', name:'Rodada de ajustes', priority:'media', days:14 },
      ]},
      { id:'s5', name:'Entrega', tasks:[
        { id:'t10', name:'Manual de marca completo', priority:'alta', days:16 },
        { id:'t11', name:'Pacote de arquivos finais (AI, PNG, PDF)', priority:'alta', days:17 },
      ]},
    ],
  },
  {
    id:'bi_social', builtin:true, name:'Gestão de Social Media', category:'social',
    description:'Processo mensal de produção de conteúdo para redes sociais.',
    stages:[
      { id:'s1', name:'Planejamento', tasks:[
        { id:'t1', name:'Reunião de briefing mensal', priority:'alta', days:0 },
        { id:'t2', name:'Calendário editorial', priority:'alta', days:1 },
        { id:'t3', name:'Definição de pautas e formatos', priority:'media', days:2 },
      ]},
      { id:'s2', name:'Produção', tasks:[
        { id:'t4', name:'Criação de posts (feed)', priority:'alta', days:5 },
        { id:'t5', name:'Criação de stories', priority:'media', days:7 },
        { id:'t6', name:'Roteiros de reels/vídeos', priority:'media', days:8 },
      ]},
      { id:'s3', name:'Aprovação', tasks:[
        { id:'t7', name:'Envio para aprovação do cliente', priority:'alta', days:10 },
        { id:'t8', name:'Ajustes pós-feedback', priority:'media', days:12 },
      ]},
      { id:'s4', name:'Publicação', tasks:[
        { id:'t9', name:'Agendamento das publicações', priority:'alta', days:13 },
        { id:'t10', name:'Relatório de desempenho mensal', priority:'media', days:30 },
      ]},
    ],
  },
  {
    id:'bi_campanha', builtin:true, name:'Campanha de Marketing', category:'marketing',
    description:'Execução completa de campanha — do planejamento à análise de resultados.',
    stages:[
      { id:'s1', name:'Estratégia', tasks:[
        { id:'t1', name:'Definição de objetivos e KPIs', priority:'alta', days:0 },
        { id:'t2', name:'Pesquisa de público-alvo', priority:'alta', days:1 },
        { id:'t3', name:'Mapeamento de canais', priority:'media', days:2 },
      ]},
      { id:'s2', name:'Criação', tasks:[
        { id:'t4', name:'Criação de criativos (ads)', priority:'alta', days:4 },
        { id:'t5', name:'Copy das peças', priority:'alta', days:5 },
        { id:'t6', name:'Landing page', priority:'media', days:6 },
      ]},
      { id:'s3', name:'Lançamento', tasks:[
        { id:'t7', name:'Configuração das campanhas', priority:'alta', days:7 },
        { id:'t8', name:'Testes A/B iniciais', priority:'media', days:8 },
        { id:'t9', name:'Go live!', priority:'alta', days:9 },
      ]},
      { id:'s4', name:'Otimização', tasks:[
        { id:'t10', name:'Monitoramento diário dos anúncios', priority:'alta', days:10 },
        { id:'t11', name:'Ajuste de lances e segmentação', priority:'media', days:14 },
        { id:'t12', name:'Relatório de resultados', priority:'alta', days:30 },
      ]},
    ],
  },
  {
    id:'bi_site', builtin:true, name:'Criação de Site', category:'dev',
    description:'Processo de desenvolvimento de site institucional ou landing page.',
    stages:[
      { id:'s1', name:'Descoberta', tasks:[
        { id:'t1', name:'Reunião de alinhamento', priority:'alta', days:0 },
        { id:'t2', name:'Mapeamento de páginas e funcionalidades', priority:'alta', days:1 },
        { id:'t3', name:'Proposta e contrato assinado', priority:'alta', days:2 },
      ]},
      { id:'s2', name:'Design', tasks:[
        { id:'t4', name:'Wireframes e arquitetura', priority:'alta', days:4 },
        { id:'t5', name:'Design das telas (Figma)', priority:'alta', days:7 },
        { id:'t6', name:'Aprovação do design', priority:'alta', days:10 },
      ]},
      { id:'s3', name:'Desenvolvimento', tasks:[
        { id:'t7', name:'Setup do ambiente', priority:'alta', days:11 },
        { id:'t8', name:'Desenvolvimento frontend', priority:'alta', days:14 },
        { id:'t9', name:'Integração de formulários e analytics', priority:'media', days:18 },
      ]},
      { id:'s4', name:'Entrega', tasks:[
        { id:'t10', name:'QA e testes cross-browser', priority:'alta', days:19 },
        { id:'t11', name:'Aprovação final do cliente', priority:'alta', days:20 },
        { id:'t12', name:'Deploy e publicação', priority:'alta', days:21 },
        { id:'t13', name:'Treinamento e handoff', priority:'media', days:22 },
      ]},
    ],
  },
  {
    id:'bi_conteudo', builtin:true, name:'Produção de Conteúdo', category:'marketing',
    description:'Fluxo de produção de conteúdo: pauta, roteiro, gravação, edição e publicação.',
    stages:[
      { id:'s1', name:'Pauta', tasks:[
        { id:'t1', name:'Pesquisa de tendências e palavras-chave', priority:'alta', days:0 },
        { id:'t2', name:'Definição do tema e formato', priority:'alta', days:1 },
      ]},
      { id:'s2', name:'Produção', tasks:[
        { id:'t3', name:'Roteiro completo', priority:'alta', days:2 },
        { id:'t4', name:'Gravação / criação do conteúdo', priority:'alta', days:4 },
        { id:'t5', name:'Edição e finalização', priority:'alta', days:6 },
      ]},
      { id:'s3', name:'Revisão', tasks:[
        { id:'t6', name:'Revisão interna', priority:'media', days:7 },
        { id:'t7', name:'Aprovação do cliente', priority:'media', days:8 },
      ]},
      { id:'s4', name:'Publicação', tasks:[
        { id:'t8', name:'Upload e SEO (título, descrição, tags)', priority:'alta', days:9 },
        { id:'t9', name:'Divulgação nas redes sociais', priority:'media', days:10 },
        { id:'t10', name:'Análise de primeiros resultados (7 dias)', priority:'baixa', days:17 },
      ]},
    ],
  },
  {
    id:'bi_onboarding', builtin:true, name:'Onboarding de Cliente', category:'gestao',
    description:'Processo de boas-vindas e integração de um novo cliente na sua operação.',
    stages:[
      { id:'s1', name:'Boas-vindas', tasks:[
        { id:'t1', name:'E-mail de boas-vindas + acesso aos materiais', priority:'alta', days:0 },
        { id:'t2', name:'Reunião de kickoff', priority:'alta', days:1 },
      ]},
      { id:'s2', name:'Configuração', tasks:[
        { id:'t3', name:'Preenchimento de briefing completo', priority:'alta', days:2 },
        { id:'t4', name:'Configurar acessos e ferramentas', priority:'media', days:3 },
        { id:'t5', name:'Criar projeto no inBrivvo', priority:'media', days:3 },
      ]},
      { id:'s3', name:'Alinhamento', tasks:[
        { id:'t6', name:'Apresentar cronograma e entregáveis', priority:'alta', days:5 },
        { id:'t7', name:'Definir canais de comunicação e frequência', priority:'media', days:5 },
      ]},
      { id:'s4', name:'Início', tasks:[
        { id:'t8', name:'Primeira entrega / checkpoint', priority:'alta', days:14 },
        { id:'t9', name:'NPS após 30 dias', priority:'baixa', days:30 },
      ]},
    ],
  },
];

// ─── Template Card ────────────────────────────────────────────────────────────
function TemplateCard({ tpl, onEdit, onApply }) {
  const totalTasks = (tpl.stages||[]).reduce((a,s)=>a+(s.tasks||[]).length, 0);
  const catLabel = PT_CATS.find(c=>c.id===tpl.category)?.label || tpl.category;
  return (
    <div className="ds-card hov" style={{ borderRadius:14, overflow:'hidden', cursor:'pointer', display:'flex', flexDirection:'column' }}
      onClick={()=>onEdit(tpl)}>
      <div style={{ padding:'20px 20px 14px', flex:1 }}>
        <div style={{ display:'flex', alignItems:'flex-start', justifyContent:'space-between', gap:10, marginBottom:10 }}>
          <div>
            {tpl.builtin && (
              <div style={{ fontSize:10, fontWeight:700, letterSpacing:'0.06em', textTransform:'uppercase', color:'var(--fg-muted)', marginBottom:6 }}>
                Template inBrivvo
              </div>
            )}
            <h3 style={{ margin:0, fontSize:15, fontWeight:700, lineHeight:1.3 }}>{tpl.name}</h3>
          </div>
          <Badge tone={CAT_TONE[tpl.category]||'neutral'} dot={false}>{catLabel}</Badge>
        </div>
        {tpl.description && (
          <p style={{ margin:'0 0 14px', fontSize:12, color:'var(--fg-secondary)', lineHeight:1.6 }}>{tpl.description}</p>
        )}
        <div style={{ display:'flex', gap:16, fontSize:11, color:'var(--fg-muted)' }}>
          <span>📋 {tpl.stages?.length||0} etapas</span>
          <span>✓ {totalTasks} tarefas</span>
        </div>
        {/* Stage pills */}
        <div style={{ display:'flex', flexWrap:'wrap', gap:4, marginTop:10 }}>
          {(tpl.stages||[]).slice(0,5).map((s,i)=>(
            <span key={i} style={{ fontSize:10, fontWeight:600, padding:'2px 8px', borderRadius:999, background:'var(--bg-elevated)', border:'1px solid var(--border-subtle)', color:'var(--fg-muted)' }}>
              {s.name}
            </span>
          ))}
          {(tpl.stages||[]).length > 5 && <span style={{ fontSize:10, color:'var(--fg-muted)' }}>+{tpl.stages.length-5}</span>}
        </div>
      </div>
      <div style={{ borderTop:'1px solid var(--border-subtle)', padding:'10px 20px', display:'flex', gap:8, background:'var(--bg-elevated)' }}>
        <button onClick={e=>{e.stopPropagation();onApply(tpl);}} style={{
          flex:1, padding:'8px 0', borderRadius:8, border:'none',
          background:'var(--primary)', color:'#fff', fontSize:12, fontWeight:700,
          cursor:'pointer', fontFamily:'inherit',
        }}>▶ Aplicar ao projeto</button>
        {!tpl.builtin && (
          <button onClick={e=>{e.stopPropagation();onEdit(tpl);}} style={{
            padding:'8px 14px', borderRadius:8, border:'1px solid var(--border-subtle)',
            background:'transparent', color:'var(--fg-secondary)', fontSize:12, cursor:'pointer', fontFamily:'inherit',
          }}>Editar</button>
        )}
      </div>
    </div>
  );
}

// ─── Template Editor Modal ────────────────────────────────────────────────────
function TemplateEditor({ tpl, onSave, onClose, onDelete }) {
  const isNew = !tpl?.id || tpl.id.startsWith('new_');
  const [name,   setName]   = useState(tpl?.name||'');
  const [desc,   setDesc]   = useState(tpl?.description||'');
  const [cat,    setCat]    = useState(tpl?.category||'geral');
  const [stages, setStages] = useState(() => JSON.parse(JSON.stringify(tpl?.stages||[{ id:uid(), name:'Etapa 1', tasks:[] }])));
  const [saving, setSaving] = useState(false);
  const [active, setActive] = useState(0);

  const addStage = () => {
    const ns = [...stages, { id:uid(), name:`Etapa ${stages.length+1}`, tasks:[] }];
    setStages(ns); setActive(ns.length-1);
  };
  const updStage = (i,k,v) => setStages(stages.map((s,j)=>j===i?{...s,[k]:v}:s));
  const delStage = i => { const ns=stages.filter((_,j)=>j!==i); setStages(ns); setActive(Math.max(0,active>i?active-1:Math.min(active,ns.length-1))); };
  const moveStage = (i,dir) => {
    const j=i+dir; if(j<0||j>=stages.length) return;
    const ns=[...stages]; [ns[i],ns[j]]=[ns[j],ns[i]]; setStages(ns); setActive(j);
  };
  const addTask = si => setStages(stages.map((s,j)=>j!==si?s:{...s,tasks:[...(s.tasks||[]),{id:uid(),name:'',priority:'media',days:0}]}));
  const updTask = (si,ti,k,v) => setStages(stages.map((s,j)=>j!==si?s:{...s,tasks:s.tasks.map((t,k2)=>k2!==ti?t:{...t,[k]:v})}));
  const delTask = (si,ti) => setStages(stages.map((s,j)=>j!==si?s:{...s,tasks:s.tasks.filter((_,k2)=>k2!==ti)}));

  const save = async () => {
    if (!name.trim()) { window.__toast?.('Nome obrigatório',{tone:'danger'}); return; }
    setSaving(true);
    try {
      const { data:{ user } } = await sb.auth.getUser();
      const payload = { name:name.trim(), description:desc.trim(), category:cat, stages, user_id:user.id, updated_at:new Date().toISOString() };
      let saved;
      if (isNew) {
        const { data, error } = await sb.from('process_templates').insert([payload]).select().single();
        if (error) throw error;
        saved = data;
      } else {
        const { data, error } = await sb.from('process_templates').update(payload).eq('id',tpl.id).select().single();
        if (error) throw error;
        saved = data;
      }
      window.__toast?.(`Modelo "${saved.name}" salvo!`,{tone:'success'});
      onSave(saved); onClose();
    } catch(err) { window.__toast?.('Erro: '+err.message,{tone:'danger'}); }
    finally { setSaving(false); }
  };

  const cur = stages[active];
  const INP = { width:'100%', padding:'9px 12px', borderRadius:8, border:'1px solid var(--border-subtle)', background:'var(--bg-elevated)', color:'var(--fg-primary)', fontFamily:'inherit', fontSize:13, outline:'none', boxSizing:'border-box' };
  const LBL = { fontSize:10, fontWeight:700, textTransform:'uppercase', letterSpacing:'0.06em', color:'var(--fg-muted)', display:'block', marginBottom:5 };

  return (
    <div onClick={onClose} style={{ position:'fixed',inset:0,background:'rgba(7,11,28,0.75)',backdropFilter:'blur(6px)',display:'grid',placeItems:'center',zIndex:9999,padding:20 }}>
      <div onClick={e=>e.stopPropagation()} style={{ width:'min(960px,100%)',maxHeight:'94vh',display:'flex',flexDirection:'column',background:'var(--bg-surface)',border:'1px solid var(--border-strong)',borderRadius:18,boxShadow:'0 32px 80px rgba(0,0,0,0.6)',overflow:'hidden' }}>

        {/* Header */}
        <div style={{ padding:'18px 24px',borderBottom:'1px solid var(--border-subtle)',display:'flex',alignItems:'center',gap:14 }}>
          <div style={{ flex:1 }}>
            <div style={{ fontSize:11,fontWeight:700,textTransform:'uppercase',letterSpacing:'0.06em',color:'var(--geek-blue-300)',marginBottom:3 }}>
              {isNew?'Novo modelo de processo':'Editar modelo'}
            </div>
            <h2 style={{ margin:0,fontSize:17,fontWeight:700 }}>{name||'Sem nome'}</h2>
          </div>
          {!isNew && !tpl.builtin && (
            <button onClick={()=>onDelete(tpl)} style={{ padding:'7px 14px',borderRadius:8,border:'1px solid rgba(255,100,100,0.3)',background:'rgba(255,100,100,0.08)',color:'#FF6A6A',fontSize:12,fontWeight:600,cursor:'pointer',fontFamily:'inherit' }}>Excluir</button>
          )}
          <button onClick={onClose} style={{ background:'transparent',border:'1px solid var(--border-subtle)',color:'var(--fg-secondary)',width:34,height:34,borderRadius:8,cursor:'pointer',fontSize:18,display:'grid',placeItems:'center' }}>×</button>
        </div>

        <div style={{ display:'grid',gridTemplateColumns:'260px 1fr',flex:1,overflow:'hidden',minHeight:0 }}>
          {/* Left panel */}
          <div style={{ borderRight:'1px solid var(--border-subtle)',padding:20,overflow:'auto',display:'flex',flexDirection:'column',gap:14 }}>
            <div>
              <label style={LBL}>Nome do modelo</label>
              <input value={name} onChange={e=>setName(e.target.value)} placeholder="Ex: Identidade Visual" style={INP}/>
            </div>
            <div>
              <label style={LBL}>Descrição</label>
              <textarea value={desc} onChange={e=>setDesc(e.target.value)} placeholder="Descreva o processo…" rows={3} style={{ ...INP, resize:'vertical', lineHeight:1.55 }}/>
            </div>
            <div>
              <label style={LBL}>Categoria</label>
              <select value={cat} onChange={e=>setCat(e.target.value)} style={INP}>
                {PT_CATS.filter(c=>c.id!=='todos').map(c=>(
                  <option key={c.id} value={c.id}>{c.label}</option>
                ))}
              </select>
            </div>
            <div>
              <div style={{ display:'flex',alignItems:'center',justifyContent:'space-between',marginBottom:8 }}>
                <label style={{ ...LBL, margin:0 }}>Etapas ({stages.length})</label>
                <button onClick={addStage} style={{ padding:'4px 10px',borderRadius:6,border:'1px solid var(--geek-blue-a40)',background:'var(--primary-soft)',color:'var(--geek-blue-200)',fontSize:11,fontWeight:700,cursor:'pointer',fontFamily:'inherit' }}>+ Etapa</button>
              </div>
              <div style={{ display:'flex',flexDirection:'column',gap:3 }}>
                {stages.map((s,i)=>(
                  <div key={s.id} onClick={()=>setActive(i)} style={{
                    display:'flex',alignItems:'center',gap:8,padding:'9px 11px',borderRadius:8,cursor:'pointer',
                    background:i===active?'var(--primary-soft)':'var(--bg-elevated)',
                    border:'1px solid',borderColor:i===active?'var(--geek-blue-a40)':'var(--border-subtle)',
                    color:i===active?'var(--geek-blue-200)':'var(--fg-secondary)',
                  }}>
                    <div style={{ width:20,height:20,borderRadius:5,background:i===active?'var(--primary)':'var(--bg-surface)',color:'#fff',fontSize:10,fontWeight:800,display:'grid',placeItems:'center',flexShrink:0 }}>{i+1}</div>
                    <span style={{ flex:1,fontSize:12,fontWeight:600,overflow:'hidden',textOverflow:'ellipsis',whiteSpace:'nowrap' }}>{s.name||'Sem nome'}</span>
                    <span style={{ fontSize:10,color:'var(--fg-muted)',flexShrink:0 }}>{s.tasks?.length||0}t</span>
                    <div style={{ display:'flex',gap:2 }}>
                      {i>0 && <button onClick={e=>{e.stopPropagation();moveStage(i,-1);}} style={{ background:'transparent',border:'none',color:'var(--fg-muted)',cursor:'pointer',fontSize:12,padding:'0 2px' }}>↑</button>}
                      {i<stages.length-1 && <button onClick={e=>{e.stopPropagation();moveStage(i,1);}} style={{ background:'transparent',border:'none',color:'var(--fg-muted)',cursor:'pointer',fontSize:12,padding:'0 2px' }}>↓</button>}
                      {stages.length>1 && <button onClick={e=>{e.stopPropagation();delStage(i);}} style={{ background:'transparent',border:'none',color:'var(--fg-muted)',cursor:'pointer',fontSize:14,padding:'0 2px' }}>×</button>}
                    </div>
                  </div>
                ))}
              </div>
            </div>
          </div>

          {/* Right panel — stage editor */}
          <div style={{ padding:24,overflow:'auto',display:'flex',flexDirection:'column',gap:16 }}>
            {cur ? (
              <>
                <div>
                  <label style={LBL}>Nome da etapa</label>
                  <input value={cur.name} onChange={e=>updStage(active,'name',e.target.value)} style={{ ...INP, fontSize:15,fontWeight:700 }}/>
                </div>
                <div>
                  <div style={{ display:'flex',alignItems:'center',justifyContent:'space-between',marginBottom:10 }}>
                    <label style={{ ...LBL, margin:0 }}>Tarefas ({cur.tasks?.length||0})</label>
                    <button onClick={()=>addTask(active)} style={{ padding:'6px 14px',borderRadius:7,border:'1px solid var(--geek-blue-a40)',background:'var(--primary-soft)',color:'var(--geek-blue-200)',fontSize:11,fontWeight:700,cursor:'pointer',fontFamily:'inherit' }}>+ Tarefa</button>
                  </div>
                  {(!cur.tasks||cur.tasks.length===0) ? (
                    <div style={{ padding:'36px',textAlign:'center',borderRadius:12,border:'2px dashed var(--border-subtle)',color:'var(--fg-muted)',fontSize:13 }}>
                      Nenhuma tarefa ainda.<br/>Clique em <strong>+ Tarefa</strong> para adicionar.
                    </div>
                  ) : (
                    <div style={{ display:'flex',flexDirection:'column',gap:8 }}>
                      {cur.tasks.map((task,ti)=>(
                        <div key={task.id} style={{ padding:'14px 16px',borderRadius:10,border:'1px solid var(--border-subtle)',background:'var(--bg-elevated)' }}>
                          <div style={{ display:'flex',gap:8,alignItems:'center',marginBottom:10 }}>
                            <div style={{ width:6,height:6,borderRadius:'50%',background:PRIORITY_COLOR[task.priority]||'#aaa',flexShrink:0 }}/>
                            <input value={task.name} onChange={e=>updTask(active,ti,'name',e.target.value)}
                              placeholder={`Nome da tarefa ${ti+1}…`}
                              style={{ ...INP,flex:1,fontWeight:600,padding:'7px 10px' }}/>
                            <button onClick={()=>delTask(active,ti)} style={{ background:'transparent',border:'none',color:'var(--fg-muted)',cursor:'pointer',fontSize:16,padding:'0 4px',flexShrink:0 }}>×</button>
                          </div>
                          <div style={{ display:'grid',gridTemplateColumns:'1fr 1fr',gap:8 }}>
                            <div>
                              <label style={{ ...LBL, fontSize:9 }}>Prioridade</label>
                              <select value={task.priority} onChange={e=>updTask(active,ti,'priority',e.target.value)} style={{ ...INP,padding:'6px 10px',fontSize:12 }}>
                                <option value="alta">🔴 Alta</option>
                                <option value="media">🟡 Média</option>
                                <option value="baixa">🟢 Baixa</option>
                              </select>
                            </div>
                            <div>
                              <label style={{ ...LBL, fontSize:9 }}>Prazo (dias após início)</label>
                              <input type="number" min={0} value={task.days}
                                onChange={e=>updTask(active,ti,'days',parseInt(e.target.value)||0)}
                                style={{ ...INP,padding:'6px 10px',fontSize:12 }}/>
                            </div>
                          </div>
                        </div>
                      ))}
                    </div>
                  )}
                </div>
              </>
            ) : (
              <div style={{ flex:1,display:'grid',placeItems:'center',color:'var(--fg-muted)',fontSize:13 }}>Selecione uma etapa à esquerda</div>
            )}
          </div>
        </div>

        {/* Footer */}
        <div style={{ padding:'14px 24px',borderTop:'1px solid var(--border-subtle)',display:'flex',gap:10,background:'var(--bg-elevated)' }}>
          <button onClick={onClose} style={{ padding:'9px 18px',borderRadius:8,border:'1px solid var(--border-subtle)',background:'transparent',color:'var(--fg-secondary)',fontSize:13,cursor:'pointer',fontFamily:'inherit' }}>Cancelar</button>
          <div style={{ flex:1 }}/>
          <button onClick={save} disabled={saving} style={{ padding:'9px 22px',borderRadius:8,border:'none',background:'var(--primary)',color:'#fff',fontSize:13,fontWeight:700,cursor:saving?'not-allowed':'pointer',fontFamily:'inherit',opacity:saving?0.7:1 }}>
            {saving?'Salvando…':'✓ Salvar modelo'}
          </button>
        </div>
      </div>
    </div>
  );
}

// ─── Apply Template Modal ─────────────────────────────────────────────────────
function ApplyModal({ tpl, onClose }) {
  const [projects,  setProjects]  = useState([]);
  const [selProj,   setSelProj]   = useState('');   // project name (string)
  const [creating,  setCreating]  = useState(false);
  const [newName,   setNewName]   = useState('');
  const [applying,  setApplying]  = useState(false);

  useEffect(()=>{
    (async()=>{
      try {
        const { data } = await sb.from('projects').select('id,name').order('created_at',{ascending:false});
        setProjects(data||[]);
      } catch {}
    })();
  },[]);

  const apply = async () => {
    setApplying(true);
    try {
      const { data:{ user } } = await sb.auth.getUser();
      let projectName = '';

      if (creating) {
        if (!newName.trim()) { window.__toast?.('Nome obrigatório',{tone:'danger'}); setApplying(false); return; }
        // Create project record
        const { data, error } = await sb.from('projects').insert([{
          name: newName.trim(), status:'em_andamento', user_id: user.id,
        }]).select().single();
        if (error) throw error;
        projectName = newName.trim();
      } else {
        if (!selProj) { window.__toast?.('Selecione um projeto',{tone:'danger'}); setApplying(false); return; }
        projectName = selProj; // selProj stores the project name
      }

      const today = new Date();
      const tasks = (tpl.stages||[]).flatMap(stage =>
        (stage.tasks||[]).map(task => ({
          user_id:      user.id,
          title:        task.name || 'Tarefa',
          project_name: projectName,
          priority:     task.priority === 'alta' ? 'alta' : task.priority === 'baixa' ? 'baixa' : 'média',
          due_date:     task.days > 0 ? new Date(today.getTime()+task.days*86400000).toISOString().split('T')[0] : null,
          kanban_col:   'todo',
          tag_label:    stage.name.toUpperCase().slice(0,8),
          tag_color:    '#36CFC9',
          done:         false,
        }))
      );

      if (tasks.length > 0) {
        const { error } = await sb.from('tasks').insert(tasks);
        if (error) throw error;
      }

      window.__pushNotif?.({
        who:    'Sistema',
        what:   `Modelo "${tpl.name}" aplicado —`,
        target: `${tasks.length} tarefas criadas em ${projectName}`,
        tone:   'success',
        kind:   'template',
      });
      window.__toast?.(`✓ ${tasks.length} tarefas criadas com o modelo "${tpl.name}"!`,{tone:'success'});
      onClose();
    } catch(err) {
      window.__toast?.('Erro ao aplicar: '+err.message,{tone:'danger'});
    } finally { setApplying(false); }
  };

  const totalTasks = (tpl.stages||[]).reduce((a,s)=>a+(s.tasks||[]).length,0);
  const INP = { width:'100%', padding:'9px 12px', borderRadius:8, border:'1px solid var(--border-subtle)', background:'var(--bg-elevated)', color:'var(--fg-primary)', fontFamily:'inherit', fontSize:13, outline:'none', boxSizing:'border-box' };

  return (
    <div onClick={onClose} style={{ position:'fixed',inset:0,background:'rgba(7,11,28,0.75)',backdropFilter:'blur(6px)',display:'grid',placeItems:'center',zIndex:10000,padding:20 }}>
      <div onClick={e=>e.stopPropagation()} style={{ width:'min(520px,100%)',background:'var(--bg-surface)',border:'1px solid var(--border-strong)',borderRadius:16,boxShadow:'0 30px 80px rgba(0,0,0,0.55)',overflow:'hidden' }}>
        <div style={{ padding:'20px 24px',borderBottom:'1px solid var(--border-subtle)' }}>
          <div style={{ fontSize:11,fontWeight:700,textTransform:'uppercase',letterSpacing:'0.06em',color:'var(--geek-blue-300)',marginBottom:5 }}>Aplicar modelo ao projeto</div>
          <h2 style={{ margin:'0 0 4px',fontSize:18,fontWeight:700 }}>{tpl.name}</h2>
          <div style={{ fontSize:12,color:'var(--fg-muted)' }}>{tpl.stages?.length} etapas · {totalTasks} tarefas serão criadas automaticamente</div>
        </div>

        <div style={{ padding:'20px 24px',display:'flex',flexDirection:'column',gap:16 }}>
          {/* Stage preview */}
          <div style={{ padding:14,borderRadius:10,background:'var(--bg-elevated)',border:'1px solid var(--border-subtle)' }}>
            <div style={{ fontSize:10,fontWeight:700,textTransform:'uppercase',letterSpacing:'0.06em',color:'var(--fg-muted)',marginBottom:10 }}>Etapas que serão criadas</div>
            <div style={{ display:'flex',flexDirection:'column',gap:6 }}>
              {(tpl.stages||[]).map((s,i)=>(
                <div key={i} style={{ display:'flex',alignItems:'center',gap:8 }}>
                  <div style={{ width:20,height:20,borderRadius:5,background:'var(--primary-soft)',color:'var(--geek-blue-200)',fontSize:10,fontWeight:800,display:'grid',placeItems:'center',flexShrink:0 }}>{i+1}</div>
                  <span style={{ flex:1,fontSize:13,fontWeight:600 }}>{s.name}</span>
                  <span style={{ fontSize:11,color:'var(--fg-muted)' }}>{s.tasks?.length||0} tarefas</span>
                </div>
              ))}
            </div>
          </div>

          {/* Project selection */}
          <div>
            <div style={{ display:'flex',gap:8,marginBottom:12 }}>
              {[false,true].map(c=>(
                <button key={c} onClick={()=>setCreating(c)} style={{
                  flex:1,padding:'9px',borderRadius:8,cursor:'pointer',fontFamily:'inherit',fontSize:12,fontWeight:600,
                  border:'1px solid',borderColor:creating===c?'var(--primary)':'var(--border-subtle)',
                  background:creating===c?'var(--primary-soft)':'transparent',
                  color:creating===c?'var(--geek-blue-200)':'var(--fg-secondary)',
                }}>{c?'Criar novo projeto':'Projeto existente'}</button>
              ))}
            </div>
            {creating ? (
              <input value={newName} onChange={e=>setNewName(e.target.value)} placeholder="Nome do novo projeto…" style={INP}/>
            ) : (
              <select value={selProj} onChange={e=>setSelProj(e.target.value)} style={INP}>
                <option value="">Selecione um projeto…</option>
                {projects.map(p=><option key={p.id} value={p.name}>{p.name}</option>)}
              </select>
            )}
          </div>
        </div>

        <div style={{ padding:'14px 24px',borderTop:'1px solid var(--border-subtle)',display:'flex',gap:10,background:'var(--bg-elevated)' }}>
          <button onClick={onClose} style={{ padding:'9px 18px',borderRadius:8,border:'1px solid var(--border-subtle)',background:'transparent',color:'var(--fg-secondary)',fontSize:13,cursor:'pointer',fontFamily:'inherit' }}>Cancelar</button>
          <div style={{ flex:1 }}/>
          <button onClick={apply} disabled={applying} style={{ padding:'9px 22px',borderRadius:8,border:'none',background:'var(--primary)',color:'#fff',fontSize:13,fontWeight:700,cursor:applying?'not-allowed':'pointer',fontFamily:'inherit',opacity:applying?0.7:1 }}>
            {applying?'Aplicando…':'▶ Aplicar modelo'}
          </button>
        </div>
      </div>
    </div>
  );
}

// ─── Main Page ────────────────────────────────────────────────────────────────
function ProcessTemplates() {
  const [templates, setTemplates] = useState([]);
  const [loading,   setLoading]   = useState(true);
  const [cat,       setCat]       = useState('todos');
  const [search,    setSearch]    = useState('');
  const [editTpl,   setEditTpl]   = useState(null);
  const [applyTpl,  setApplyTpl]  = useState(null);

  useEffect(()=>{ load(); },[]);

  const load = async () => {
    setLoading(true);
    try {
      const { data } = await sb.from('process_templates').select('*').order('created_at',{ascending:false});
      setTemplates(data||[]);
    } catch {}
    setLoading(false);
  };

  const handleSave = saved => setTemplates(prev=>{
    const ex = prev.find(t=>t.id===saved.id);
    return ex ? prev.map(t=>t.id===saved.id?saved:t) : [saved,...prev];
  });

  const handleDelete = async tpl => {
    if (!window.confirm(`Excluir "${tpl.name}"?`)) return;
    try {
      await sb.from('process_templates').delete().eq('id',tpl.id);
      setTemplates(prev=>prev.filter(t=>t.id!==tpl.id));
      setEditTpl(null);
      window.__toast?.('Modelo excluído',{tone:'success'});
    } catch(err) { window.__toast?.('Erro: '+err.message,{tone:'danger'}); }
  };

  const openNew  = () => setEditTpl({ id:'new_'+uid(), name:'', description:'', category:'geral', stages:[{id:uid(),name:'Etapa 1',tasks:[]}] });
  const openEdit = tpl => tpl.builtin ? setApplyTpl(tpl) : setEditTpl(tpl);

  const all      = [...BUILTIN, ...templates];
  const filtered = all.filter(t =>
    (cat==='todos'||t.category===cat) &&
    (!search || t.name.toLowerCase().includes(search.toLowerCase()) || (t.description||'').toLowerCase().includes(search.toLowerCase()))
  );

  const totalTasks = all.reduce((a,t)=>a+(t.stages||[]).reduce((b,s)=>b+(s.tasks||[]).length,0),0);

  return (
    <div style={{ padding:'32px 32px 72px', maxWidth:1100, margin:'0 auto' }}>

      {/* Page header */}
      <div style={{ display:'flex',alignItems:'flex-start',justifyContent:'space-between',marginBottom:28,gap:16 }}>
        <div>
          <div style={{ fontFamily:'var(--font-display)',fontSize:11,fontWeight:700,letterSpacing:'0.06em',textTransform:'uppercase',color:'var(--geek-blue-300)',marginBottom:6 }}>Ferramentas</div>
          <h1 style={{ margin:'0 0 6px',fontSize:26,fontWeight:800,letterSpacing:'-0.02em' }}>Modelos de processos</h1>
          <p style={{ margin:0,fontSize:14,color:'var(--fg-secondary)' }}>Crie fluxos reutilizáveis e aplique com 1 clique em qualquer projeto.</p>
        </div>
        <button onClick={openNew} style={{
          padding:'10px 20px', borderRadius:10, background:'var(--primary)', border:'none',
          color:'#fff', fontSize:13, fontWeight:700, cursor:'pointer', fontFamily:'inherit',
          display:'flex', alignItems:'center', gap:8, flexShrink:0,
          boxShadow:'0 4px 14px rgba(29,57,196,0.35)',
        }}>
          <Icon d={ICONS.plus} size={16}/> Novo modelo
        </button>
      </div>

      {/* Stats */}
      <div style={{ display:'grid',gridTemplateColumns:'repeat(3,1fr)',gap:12,marginBottom:24 }}>
        {[
          ['📋', all.length,      'Total de modelos'],
          ['🔧', templates.length, 'Modelos criados por mim'],
          ['✓',  totalTasks,      'Tarefas mapeadas'],
        ].map(([ic,v,l],i)=>(
          <Card key={i} padding={16}>
            <div style={{ display:'flex',alignItems:'center',gap:12 }}>
              <span style={{ fontSize:22 }}>{ic}</span>
              <div>
                <div style={{ fontSize:24,fontWeight:800,letterSpacing:'-0.02em' }}>{v}</div>
                <div style={{ fontSize:11,color:'var(--fg-muted)',marginTop:1 }}>{l}</div>
              </div>
            </div>
          </Card>
        ))}
      </div>

      {/* Filters */}
      <div style={{ display:'flex',gap:10,marginBottom:20,flexWrap:'wrap',alignItems:'center' }}>
        <div style={{ display:'flex',gap:3,flexWrap:'wrap' }}>
          {PT_CATS.map(c=>(
            <button key={c.id} onClick={()=>setCat(c.id)} style={{
              padding:'7px 14px',borderRadius:8,fontSize:12,fontWeight:600,cursor:'pointer',fontFamily:'inherit',
              background:cat===c.id?'var(--primary-soft)':'transparent',
              color:cat===c.id?'var(--geek-blue-200)':'var(--fg-secondary)',
              border:'1px solid',borderColor:cat===c.id?'var(--geek-blue-a40)':'transparent',
            }}>{c.label}</button>
          ))}
        </div>
        <div style={{ flex:1 }}/>
        <input value={search} onChange={e=>setSearch(e.target.value)} placeholder="🔍  Buscar modelo…" style={{
          padding:'8px 14px',borderRadius:8,border:'1px solid var(--border-subtle)',background:'var(--bg-elevated)',
          color:'var(--fg-primary)',fontFamily:'inherit',fontSize:13,outline:'none',minWidth:200,
        }}/>
      </div>

      {/* Grid */}
      {loading ? (
        <div style={{ textAlign:'center',color:'var(--fg-muted)',padding:48 }}>Carregando…</div>
      ) : filtered.length===0 ? (
        <div style={{ textAlign:'center',padding:'64px 24px',color:'var(--fg-muted)' }}>
          <div style={{ fontSize:40,marginBottom:12 }}>📋</div>
          <div style={{ fontSize:15,fontWeight:600,marginBottom:6,color:'var(--fg-primary)' }}>Nenhum modelo encontrado</div>
          <div style={{ fontSize:13 }}>Crie seu primeiro modelo ou ajuste o filtro</div>
          <button onClick={openNew} style={{ marginTop:16,padding:'10px 22px',borderRadius:9,background:'var(--primary)',border:'none',color:'#fff',fontSize:13,fontWeight:700,cursor:'pointer',fontFamily:'inherit' }}>
            + Criar modelo
          </button>
        </div>
      ) : (
        <div style={{ display:'grid',gridTemplateColumns:'repeat(auto-fill,minmax(290px,1fr))',gap:16 }}>
          {filtered.map(tpl=>(
            <TemplateCard key={tpl.id} tpl={tpl} onEdit={openEdit} onApply={setApplyTpl}/>
          ))}
        </div>
      )}

      {/* Info banner */}
      <div style={{ marginTop:32,padding:'16px 20px',borderRadius:12,background:'var(--primary-soft)',border:'1px solid var(--geek-blue-a40)',display:'flex',alignItems:'center',gap:14 }}>
        <Icon d={ICONS.info} size={20} style={{ color:'var(--geek-blue-200)',flexShrink:0 }}/>
        <div style={{ fontSize:13,color:'var(--geek-blue-200)',lineHeight:1.55 }}>
          <strong>Como usar:</strong> clique em qualquer template para ver detalhes ou editá-lo. Use <strong>▶ Aplicar ao projeto</strong> para criar todas as tarefas automaticamente em um projeto existente ou novo.
        </div>
      </div>

      {editTpl && !editTpl.builtin && (
        <TemplateEditor tpl={editTpl} onSave={handleSave} onClose={()=>setEditTpl(null)} onDelete={handleDelete}/>
      )}
      {applyTpl && <ApplyModal tpl={applyTpl} onClose={()=>setApplyTpl(null)}/>}
    </div>
  );
}
window.ProcessTemplates = ProcessTemplates;
