/* Devonew — Painel da Igreja · Ensino & Eventos (cursos, biblioteca, seminários) */
const { useState: useStateAC } = React;

const uid = () => 'l' + Math.random().toString(36).slice(2, 8);
const fileUid = () => 'fl' + Math.random().toString(36).slice(2, 8);
const countLessons = (c) => c.modules.reduce((s, m) => s + m.lessons.length, 0);
const FILE_CAP = 2 * 1024 * 1024; // 2 MB

/* lê arquivo como data URL, respeitando o limite. cb(dataUrl|null, err) */
function readFileAsDataURL(file, cap, cb) {
  if (file.size > cap) { cb(null, 'big'); return; }
  const r = new FileReader();
  r.onload = () => cb(r.result);
  r.onerror = () => cb(null, 'read');
  r.readAsDataURL(file);
}
/* reduz imagem (capa) e devolve data URL JPEG */
function downscaleImg(file, max, cb) {
  const r = new FileReader();
  r.onload = () => {
    const img = new Image();
    img.onload = () => {
      const sc = Math.min(1, max / Math.max(img.width, img.height));
      const w = Math.max(1, Math.round(img.width * sc)), h = Math.max(1, Math.round(img.height * sc));
      const cv = document.createElement('canvas'); cv.width = w; cv.height = h;
      cv.getContext('2d').drawImage(img, 0, 0, w, h);
      try { cb(cv.toDataURL('image/jpeg', 0.82)); } catch (e) { cb(null); }
    };
    img.onerror = () => cb(null);
    img.src = r.result;
  };
  r.onerror = () => cb(null);
  r.readAsDataURL(file);
}
/* o data URL cabe no localStorage? (evita estourar a cota) */
function fitsStorage(str) {
  try { localStorage.setItem('devonew_quota_probe', str); localStorage.removeItem('devonew_quota_probe'); return true; }
  catch (e) { return false; }
}
const fmtSize = (b) => !b ? '' : b >= 1048576 ? (b / 1048576).toFixed(1) + ' MB' : b >= 1024 ? Math.round(b / 1024) + ' KB' : b + ' B';
const isVideoUrl = (u) => /youtube|youtu\.be|vimeo/i.test(u || '');
const fileGlyph = (f) => f.kind === 'link' ? (isVideoUrl(f.url) ? 'video' : 'link') : /image/.test(f.mime || '') ? 'image' : /video|audio/.test(f.mime || '') ? 'video' : 'file';

/* ---------- Course library grid ---------- */
function CourseLibrary({ courses, onOpen, onNew }) {
  return (
    <div className="clib-grid">
      <button className="clib-new" onClick={onNew}>
        <Icon name="plus" size={24}/>
        Novo curso
      </button>
      {courses.map((c) => (
        <button className="clib-card" key={c.id} onClick={() => onOpen(c.id)}>
          <div className="ph clib-cover" style={c.coverImg ? { backgroundImage: `url(${c.coverImg})`, backgroundSize: 'cover', backgroundPosition: 'center', color: 'transparent' } : null}>
            <span className={`st ${c.status === 'publicado' ? 'st-pub' : 'st-draft'}`}>{c.status === 'publicado' ? 'Publicado' : 'Rascunho'}</span>
            {c.coverImg ? '' : c.cover}
          </div>
          <div className="clib-body">
            <span className="clib-cat">{c.category}</span>
            <span className="clib-title">{c.title}</span>
            <span className="clib-instr">{c.instructor}</span>
            <div className="clib-stats">
              <div className="clib-stat"><div className="n">{countLessons(c)}</div><div className="l">lições</div></div>
              <div className="clib-stat"><div className="n">{c.enrolled}</div><div className="l">inscritos</div></div>
              <div className="clib-stat"><div className="n">{c.completion}%</div><div className="l">conclusão</div></div>
            </div>
          </div>
        </button>
      ))}
    </div>
  );
}

/* ---------- Course editor ---------- */
function CourseEditor({ course, setCourses, files, back, toast, onDelete }) {
  const id = course.id;
  const [openLesson, setOpenLesson] = useStateAC(null);
  const mutate = (fn) => setCourses((cs) => cs.map((c) => c.id === id ? fn({ ...c }) : c));

  const setField = (k, v) => mutate((c) => ({ ...c, [k]: v }));
  const setModuleName = (mi, v) => mutate((c) => ({ ...c, modules: c.modules.map((m, i) => i === mi ? { ...m, name: v } : m) }));
  const addModule = () => mutate((c) => ({ ...c, modules: [...c.modules, { name: `Módulo ${c.modules.length + 1}`, lessons: [] }] }));
  const delModule = (mi) => mutate((c) => ({ ...c, modules: c.modules.filter((_, i) => i !== mi) }));
  const setLesson = (mi, li, k, v) => mutate((c) => ({ ...c, modules: c.modules.map((m, i) => i !== mi ? m : { ...m, lessons: m.lessons.map((l, j) => j === li ? { ...l, [k]: v } : l) }) }));
  const addLesson = (mi) => mutate((c) => ({ ...c, modules: c.modules.map((m, i) => i !== mi ? m : { ...m, lessons: [...m.lessons, { id: uid(), t: 'Nova lição', dur: '8 min', type: 'video' }] }) }));
  const delLesson = (mi, li) => mutate((c) => ({ ...c, modules: c.modules.map((m, i) => i !== mi ? m : { ...m, lessons: m.lessons.filter((_, j) => j !== li) }) }));
  const toggleStatus = () => {
    const next = course.status === 'publicado' ? 'rascunho' : 'publicado';
    setField('status', next);
    toast(next === 'publicado' ? 'Curso publicado — já aparece no app dos membros ✓' : 'Curso despublicado (rascunho)');
  };
  const pickCover = (e) => {
    const f = e.target.files && e.target.files[0]; e.target.value = '';
    if (!f) return;
    if (!/^image\//.test(f.type)) { toast('Envie uma imagem (PNG/JPG)'); return; }
    downscaleImg(f, 1280, (url) => {
      if (!url) { toast('Não consegui ler a imagem'); return; }
      if (!fitsStorage(url)) { toast('Imagem muito pesada para salvar — tente outra'); return; }
      setField('coverImg', url);
    });
  };

  return (
    <div className="awrap">
      <button className="btn btn-quiet btn-sm" style={{ marginLeft: -8, marginBottom: 12 }} onClick={back}><Icon name="chevronL" size={17}/>Voltar aos cursos</button>

      <div className="cedit-top">
        <label className="ph cedit-cover cover-up" style={course.coverImg ? { backgroundImage: `url(${course.coverImg})`, backgroundSize: 'cover', backgroundPosition: 'center', color: 'transparent' } : null}>
          <span className="cover-up-hint"><Icon name="image" size={16}/>{course.coverImg ? 'Trocar capa' : 'Enviar capa'}</span>
          {course.coverImg ? '' : course.cover}
          <input type="file" accept="image/*" hidden onChange={pickCover}/>
        </label>
        <div className="cedit-fields">
          <div>
            <span className="field-lab">Título do curso</span>
            <input className="inp big" value={course.title} onChange={(e) => setField('title', e.target.value)}/>
          </div>
          <div className="inp-row">
            <div className="flex1"><span className="field-lab">Instrutor</span><input className="inp" value={course.instructor} onChange={(e) => setField('instructor', e.target.value)}/></div>
            <div className="flex1"><span className="field-lab">Categoria</span><input className="inp" value={course.category} onChange={(e) => setField('category', e.target.value)}/></div>
          </div>
          <div>
            <span className="field-lab">Descrição</span>
            <textarea className="inp" rows={2} placeholder="Sobre o que é este curso…" value={course.desc || ''} onChange={(e) => setField('desc', e.target.value)}/>
          </div>
        </div>
      </div>

      {/* stats + publish */}
      <div className="cols c-2b" style={{ marginTop: 0, marginBottom: 22 }}>
        <Panel pad={false}>
          <div className="panel-pad" style={{ display: 'flex', gap: 24 }}>
            <div className="clib-stat"><div className="n" style={{ fontSize: 22 }}>{countLessons(course)}</div><div className="l">lições</div></div>
            <div className="clib-stat"><div className="n" style={{ fontSize: 22 }}>{course.enrolled}</div><div className="l">membros inscritos</div></div>
            <div className="clib-stat"><div className="n" style={{ fontSize: 22 }}>{course.completion}%</div><div className="l">taxa de conclusão</div></div>
          </div>
        </Panel>
        <div className="panel">
          <div className="panel-pad" style={{ display: 'flex', alignItems: 'center', gap: 14 }}>
            <span className={`st ${course.status === 'publicado' ? 'st-pub' : 'st-draft'}`}>{course.status === 'publicado' ? 'Publicado' : 'Rascunho'}</span>
            <span className="muted" style={{ fontSize: 12.5, flex: 1 }}>{course.status === 'publicado' ? 'Visível no app dos membros.' : 'Oculto até publicar.'}</span>
            <button className={`btn btn-sm ${course.status === 'publicado' ? 'btn-ghost' : 'btn-primary'}`} onClick={toggleStatus}>
              {course.status === 'publicado' ? <><Icon name="eye" size={15}/>Despublicar</> : <><Icon name="megaphone" size={15}/>Publicar</>}
            </button>
          </div>
        </div>
      </div>

      <div className="sec-h" style={{ marginTop: 8 }}>Conteúdo do curso</div>

      {course.modules.map((m, mi) => (
        <div className="module-block" key={mi}>
          <div className="module-bar">
            <Icon name="layers" size={16} style={{ color: 'var(--accent-strong)', flex: 'none' }}/>
            <input className="inp flex1" value={m.name} onChange={(e) => setModuleName(mi, e.target.value)}/>
            <span className="muted" style={{ fontSize: 12, fontFamily: 'var(--font-mono)' }}>{m.lessons.length} lições</span>
            <button className="del-btn" onClick={() => delModule(mi)} aria-label="remover módulo"><Icon name="trash" size={15}/></button>
          </div>
          <div className="ledit">
            {m.lessons.map((l, li) => {
              const hasMat = (l.type === 'texto' && l.body) || (l.type !== 'texto' && (l.link || l.fileId));
              return (
                <div key={l.id}>
                  <div className="ledit-row">
                    <Icon name="grip" size={16} className="ico-grip"/>
                    <span className="l-ico"><Icon name={l.type === 'texto' ? 'file' : 'play'} size={13}/></span>
                    <input className="inp lname" value={l.t} onChange={(e) => setLesson(mi, li, 't', e.target.value)}/>
                    <input className="inp ldur" value={l.dur} onChange={(e) => setLesson(mi, li, 'dur', e.target.value)}/>
                    <button className={`del-btn ${openLesson === l.id ? 'on' : ''} ${hasMat ? 'has-mat' : ''}`} onClick={() => setOpenLesson(openLesson === l.id ? null : l.id)} aria-label="material da lição" title="Material da lição"><Icon name="link" size={15}/></button>
                    <button className="del-btn" onClick={() => delLesson(mi, li)} aria-label="remover lição"><Icon name="trash" size={15}/></button>
                  </div>
                  {openLesson === l.id && (
                    <div className="ledit-extra">
                      <div className="inp-row">
                        <div><span className="field-lab">Tipo</span>
                          <select className="inp" value={l.type || 'video'} onChange={(e) => setLesson(mi, li, 'type', e.target.value)}>
                            <option value="video">Vídeo / aula</option>
                            <option value="texto">Texto</option>
                            <option value="arquivo">Arquivo / material</option>
                          </select>
                        </div>
                        {l.type !== 'texto' && (
                          <div className="flex1"><span className="field-lab">Link (YouTube, PDF, Drive…)</span>
                            <input className="inp" placeholder="https://…" value={l.link || ''} onChange={(e) => setLesson(mi, li, 'link', e.target.value)}/>
                          </div>
                        )}
                      </div>
                      {l.type === 'texto' ? (
                        <div><span className="field-lab">Conteúdo</span>
                          <textarea className="inp" rows={4} placeholder="Escreva o conteúdo da lição…" value={l.body || ''} onChange={(e) => setLesson(mi, li, 'body', e.target.value)}/>
                        </div>
                      ) : (
                        <div><span className="field-lab">Ou anexe da Biblioteca</span>
                          <select className="inp" value={l.fileId || ''} onChange={(e) => setLesson(mi, li, 'fileId', e.target.value)}>
                            <option value="">— nenhum —</option>
                            {(files || []).map((f) => <option key={f.id} value={f.id}>{f.title}</option>)}
                          </select>
                        </div>
                      )}
                    </div>
                  )}
                </div>
              );
            })}
            <button className="add-line" onClick={() => addLesson(mi)}><Icon name="plus" size={15}/>Adicionar lição</button>
          </div>
        </div>
      ))}

      <button className="btn btn-ghost" onClick={addModule} style={{ marginTop: 4 }}><Icon name="plus" size={16}/>Adicionar módulo</button>

      <div className="cedit-actions">
        <button className="btn btn-quiet btn-sm" style={{ color: 'oklch(0.55 0.14 35)' }} onClick={onDelete}><Icon name="trash" size={15}/>Excluir curso</button>
        <div className="flex1"></div>
        <span className="muted" style={{ fontSize: 12.5 }}><Icon name="check" size={14} style={{ verticalAlign: -2, color: 'var(--accent)' }}/> Salvo automaticamente</span>
        <button className="btn btn-primary btn-sm" onClick={back}>Concluir</button>
      </div>
    </div>
  );
}

/* ---------- File library (biblioteca de arquivos) ---------- */
function FileLibrary({ files, setFiles, newFile, deleteFile, toast }) {
  const mutateFile = (id, fn) => setFiles((fs) => fs.map((f) => f.id === id ? fn({ ...f }) : f));
  const setF = (id, k, v) => mutateFile(id, (f) => ({ ...f, [k]: v }));
  const togglePub = (f) => {
    const next = f.status === 'publicado' ? 'rascunho' : 'publicado';
    setF(f.id, 'status', next);
    toast(next === 'publicado' ? 'Arquivo publicado — disponível na Biblioteca do app ✓' : 'Arquivo despublicado');
  };
  const pickFile = (id, e) => {
    const f = e.target.files && e.target.files[0]; e.target.value = '';
    if (!f) return;
    const done = (dataUrl, err) => {
      if (err === 'big') { toast('Arquivo acima de 2 MB — use um link externo'); return; }
      if (!dataUrl) { toast('Não consegui ler o arquivo'); return; }
      if (!fitsStorage(dataUrl)) { toast('Armazenamento cheio — use um link externo para este arquivo'); return; }
      mutateFile(id, (x) => ({ ...x, kind: 'upload', dataUrl, mime: f.type, size: f.size, url: '', _name: f.name }));
      toast('Arquivo carregado ✓');
    };
    if (/^image\//.test(f.type)) downscaleImg(f, 1600, (u) => done(u || null, u ? null : 'read'));
    else readFileAsDataURL(f, FILE_CAP, done);
  };

  return (
    <div>
      <p className="muted" style={{ fontSize: 13.5, margin: '0 0 16px' }}>
        <Icon name="file" size={15} style={{ verticalAlign: -2 }}/> Arquivos publicados aparecem na aba <b>Biblioteca</b> do app dos membros. Upload até 2 MB; acima disso, use um link externo.
      </p>
      <button className="btn btn-primary btn-sm" onClick={newFile} style={{ marginBottom: 16 }}><Icon name="plus" size={15}/>Novo arquivo</button>

      {files.length === 0 && <div className="panel"><div className="panel-pad muted">Nenhum arquivo ainda. Clique em “Novo arquivo”.</div></div>}

      <div className="file-list">
        {files.map((f) => (
          <div className="file-card" key={f.id}>
            <div className="file-glyph"><Icon name={fileGlyph(f)} size={20}/></div>
            <div className="file-main">
              <input className="inp" placeholder="Título do arquivo" value={f.title} onChange={(e) => setF(f.id, 'title', e.target.value)}/>
              <div className="inp-row" style={{ marginTop: 8 }}>
                <div className="flex1"><input className="inp" placeholder="Categoria" value={f.category} onChange={(e) => setF(f.id, 'category', e.target.value)}/></div>
                <div className="kind-toggle">
                  <button className={f.kind === 'link' ? 'on' : ''} onClick={() => setF(f.id, 'kind', 'link')}><Icon name="link" size={14}/>Link</button>
                  <button className={f.kind === 'upload' ? 'on' : ''} onClick={() => setF(f.id, 'kind', 'upload')}><Icon name="download" size={14}/>Upload</button>
                </div>
              </div>
              {f.kind === 'link' ? (
                <input className="inp" style={{ marginTop: 8 }} placeholder="https://… (Drive, YouTube, PDF)" value={f.url || ''} onChange={(e) => setF(f.id, 'url', e.target.value)}/>
              ) : (
                <div className="upload-line" style={{ marginTop: 8 }}>
                  <label className="btn btn-ghost btn-sm">
                    <Icon name="download" size={15}/>{f.dataUrl ? 'Trocar arquivo' : 'Enviar arquivo'}
                    <input type="file" hidden onChange={(e) => pickFile(f.id, e)}/>
                  </label>
                  <span className="muted" style={{ fontSize: 12 }}>{f.dataUrl ? `${f._name || 'arquivo'} · ${fmtSize(f.size)}` : 'até 2 MB'}</span>
                </div>
              )}
              <input className="inp" style={{ marginTop: 8 }} placeholder="Descrição (opcional)" value={f.desc || ''} onChange={(e) => setF(f.id, 'desc', e.target.value)}/>
              <div className="file-foot">
                <span className={`st ${f.status === 'publicado' ? 'st-pub' : 'st-draft'}`}>{f.status === 'publicado' ? 'Publicado' : 'Rascunho'}</span>
                <div className="flex1"></div>
                <button className="btn btn-quiet btn-sm" style={{ color: 'oklch(0.55 0.14 35)' }} onClick={() => { if (confirm('Excluir este arquivo?')) { deleteFile(f.id); toast('Arquivo excluído'); } }}><Icon name="trash" size={14}/>Excluir</button>
                <button className={`btn btn-sm ${f.status === 'publicado' ? 'btn-ghost' : 'btn-primary'}`} onClick={() => togglePub(f)}>
                  {f.status === 'publicado' ? <><Icon name="eye" size={14}/>Despublicar</> : <><Icon name="megaphone" size={14}/>Publicar</>}
                </button>
              </div>
            </div>
          </div>
        ))}
      </div>
    </div>
  );
}

/* ---------- Event / seminar editor ---------- */
const EVENT_KINDS = ['Seminário', 'Culto', 'Conferência', 'Curso', 'Retiro', 'Encontro'];
function EventEditor({ events, setEvents, newEvent, deleteEvent, toast }) {
  const mutate = (id, fn) => setEvents((es) => es.map((e) => e.id === id ? fn({ ...e }) : e));
  const setE = (id, k, v) => mutate(id, (e) => ({ ...e, [k]: v }));
  const togglePub = (ev) => {
    const next = ev.status === 'publicado' ? 'rascunho' : 'publicado';
    setE(ev.id, 'status', next);
    toast(next === 'publicado' ? 'Publicado — visível para os membros ✓' : 'Despublicado');
  };

  return (
    <div>
      <p className="muted" style={{ fontSize: 13.5, margin: '0 0 16px' }}>
        <Icon name="calendar" size={15} style={{ verticalAlign: -2 }}/> Eventos e seminários publicados aparecem no app. Marque <b>Online</b> e cole o link para os membros entrarem ao vivo.
      </p>
      <button className="btn btn-primary btn-sm" onClick={newEvent} style={{ marginBottom: 16 }}><Icon name="plus" size={15}/>Novo seminário / evento</button>

      <div className="event-list">
        {events.map((ev) => (
          <div className="event-card" key={ev.id}>
            <div className="inp-row">
              <div className="flex1"><span className="field-lab">Nome</span><input className="inp" value={ev.name} onChange={(e) => setE(ev.id, 'name', e.target.value)}/></div>
              <div><span className="field-lab">Tipo</span>
                <select className="inp" value={ev.kind} onChange={(e) => setE(ev.id, 'kind', e.target.value)}>
                  {EVENT_KINDS.map((k) => <option key={k} value={k}>{k}</option>)}
                </select>
              </div>
            </div>
            <div className="inp-row" style={{ marginTop: 8 }}>
              <div className="flex1"><span className="field-lab">Palestrante (opcional)</span><input className="inp" value={ev.speaker || ''} onChange={(e) => setE(ev.id, 'speaker', e.target.value)}/></div>
              <div><span className="field-lab">Data</span><input className="inp" placeholder="18 jun" value={ev.date || ''} onChange={(e) => setE(ev.id, 'date', e.target.value)}/></div>
              <div><span className="field-lab">Horário</span><input className="inp" placeholder="Qua · 20h" value={ev.time || ''} onChange={(e) => setE(ev.id, 'time', e.target.value)}/></div>
            </div>
            <div className="inp-row" style={{ marginTop: 8, alignItems: 'flex-end' }}>
              <div className="kind-toggle">
                <button className={!ev.online ? 'on' : ''} onClick={() => setE(ev.id, 'online', false)}><Icon name="church" size={14}/>Presencial</button>
                <button className={ev.online ? 'on' : ''} onClick={() => setE(ev.id, 'online', true)}><Icon name="video" size={14}/>Online</button>
              </div>
              {ev.online && (
                <div className="flex1"><span className="field-lab">Link de acesso</span><input className="inp" placeholder="https://youtube.com/… ou meet.google.com/…" value={ev.link || ''} onChange={(e) => setE(ev.id, 'link', e.target.value)}/></div>
              )}
              <div><span className="field-lab">Vagas (opcional)</span><input className="inp ldur" type="number" min="0" value={ev.cap == null ? '' : ev.cap} onChange={(e) => setE(ev.id, 'cap', e.target.value === '' ? null : Math.max(0, parseInt(e.target.value) || 0))}/></div>
            </div>
            <div style={{ marginTop: 8 }}><span className="field-lab">Descrição</span><textarea className="inp" rows={2} value={ev.desc || ''} onChange={(e) => setE(ev.id, 'desc', e.target.value)}/></div>
            {ev.cap ? (
              <div style={{ marginTop: 10 }}>
                <div className="bar-track"><i style={{ width: Math.min(100, Math.round((ev.signups || 0) / ev.cap * 100)) + '%' }}/></div>
                <span className="muted" style={{ fontSize: 11.5, fontFamily: 'var(--font-mono)' }}>{ev.signups || 0}/{ev.cap} inscritos</span>
              </div>
            ) : null}
            <div className="file-foot">
              <span className={`st ${ev.status === 'publicado' ? 'st-pub' : 'st-draft'}`}>{ev.status === 'publicado' ? 'Publicado' : 'Rascunho'}</span>
              {ev.online && <span className="st" style={{ background: 'var(--accent-tint)', color: 'var(--accent-strong)' }}><Icon name="video" size={12} style={{ verticalAlign: -2 }}/> Online</span>}
              <div className="flex1"></div>
              <button className="btn btn-quiet btn-sm" style={{ color: 'oklch(0.55 0.14 35)' }} onClick={() => { if (confirm('Excluir este item?')) { deleteEvent(ev.id); toast('Excluído'); } }}><Icon name="trash" size={14}/>Excluir</button>
              <button className={`btn btn-sm ${ev.status === 'publicado' ? 'btn-ghost' : 'btn-primary'}`} onClick={() => togglePub(ev)}>
                {ev.status === 'publicado' ? <><Icon name="eye" size={14}/>Despublicar</> : <><Icon name="megaphone" size={14}/>Publicar</>}
              </button>
            </div>
          </div>
        ))}
      </div>
    </div>
  );
}

/* ---------- Combined screen ---------- */
function EventosCursosScreen({ courses, setCourses, files, setFiles, events, setEvents, toast, newCourse, deleteCourse, newFile, deleteFile, newEvent, deleteEvent }) {
  const [tab, setTab] = useStateAC('cursos');
  const [openId, setOpen] = useStateAC(null);
  const open = courses.find((c) => c.id === openId);

  if (open) return (
    <CourseEditor course={open} setCourses={setCourses} files={files} toast={toast} back={() => setOpen(null)}
      onDelete={() => { if (confirm('Excluir este curso? Esta ação não pode ser desfeita.')) { deleteCourse(open.id); setOpen(null); toast('Curso excluído'); } }}/>
  );

  return (
    <div className="awrap">
      <div className="lead-tabs" style={{ marginBottom: 18 }}>
        <button className={`lead-tab ${tab === 'cursos' ? 'active' : ''}`} onClick={() => setTab('cursos')}>Cursos · {courses.length}</button>
        <button className={`lead-tab ${tab === 'biblioteca' ? 'active' : ''}`} onClick={() => setTab('biblioteca')}>Biblioteca · {files.length}</button>
        <button className={`lead-tab ${tab === 'agenda' ? 'active' : ''}`} onClick={() => setTab('agenda')}>Seminários & Eventos · {events.length}</button>
      </div>

      {tab === 'cursos' && (
        <>
          <p className="muted" style={{ fontSize: 13.5, margin: '0 0 16px' }}>
            <Icon name="grad" size={15} style={{ verticalAlign: -2 }}/> Cursos publicados alimentam diretamente a aba <b>Cursos</b> do app dos membros.
          </p>
          <CourseLibrary courses={courses} onOpen={setOpen} onNew={() => { const nid = newCourse(); setOpen(nid); }}/>
        </>
      )}
      {tab === 'biblioteca' && <FileLibrary files={files} setFiles={setFiles} newFile={newFile} deleteFile={deleteFile} toast={toast}/>}
      {tab === 'agenda' && <EventEditor events={events} setEvents={setEvents} newEvent={newEvent} deleteEvent={deleteEvent} toast={toast}/>}
    </div>
  );
}

Object.assign(window, { EventosCursosScreen, CourseLibrary, CourseEditor, FileLibrary, EventEditor });
