const rows=document.querySelector('#rows'),responsaveisRows=document.querySelector('#responsaveis-rows'),modal=document.querySelector('#responsavel-modal'),modalTitle=document.querySelector('#responsavel-modal-title'),modalBody=document.querySelector('#responsavel-modal-body'); let assembleias=[],responsaveis=[]; const diasNomes=['Domingo','Segunda','Terça','Quarta','Quinta','Sexta','Sábado']; let calMonth=new Date(); function esc(v){return String(v??'').replace(/[&<>'"]/g,c=>({'&':'&','<':'<','>':'>',"'":''','"':'"'}[c]))} function termo(){return document.querySelector('#assembleia-search-input')?.value.trim().toLowerCase()||''} function contem(q,...vals){return !q||vals.some(v=>String(v??'').toLowerCase().includes(q))} function destinatariosLabel(a){return (a.destinatarios||[]).map(x=>x.nome+' ('+x.tipo+')').join(', ')||'-'} function diasLabel(v){return String(v||'').split(',').filter(x=>x!=='').map(x=>diasNomes[Number(x)]||x).join(', ')||'-'} function dateKey(v){const d=new Date(v);if(Number.isNaN(d.getTime()))return'';const pad=n=>String(n).padStart(2,'0');return d.getFullYear()+'-'+pad(d.getMonth()+1)+'-'+pad(d.getDate())} function monthLabel(d){return d.toLocaleDateString('pt-BR',{month:'long',year:'numeric'})} function formHtml(r={}){ const dias=new Set(String(r.dias_semana||'').split(',')); return ``; } function renderAssembleias(){ const q=termo(); const lista=assembleias.filter(a=>contem(q,a.condominio_nome,a.tipo,a.data_hora,a.local,a.status,destinatariosLabel(a))); rows.innerHTML=lista.map(a=>`${esc(a.condominio_nome||'-')}${esc(a.tipo)}${Util.date(a.data_hora)}${esc(a.local||'')}${Util.badge(a.status)}${esc(destinatariosLabel(a))}
`).join('')||'Nenhuma assembleia encontrada.'; } function ensureCalendarModal(){let m=document.querySelector('#assembleia-calendar-modal');if(m)return m;document.body.insertAdjacentHTML('beforeend','');return document.querySelector('#assembleia-calendar-modal')} function renderCalendarioAssembleias(selected){ensureCalendarModal();const title=document.querySelector('#calendar-title'),grid=document.querySelector('#calendar-grid');title.textContent=monthLabel(calMonth);const y=calMonth.getFullYear(),m=calMonth.getMonth(),start=new Date(y,m,1-new Date(y,m,1).getDay()),todayKey=dateKey(new Date());let html=['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'].map(x=>'
'+x+'
').join('');for(let i=0;i<42;i++){const d=new Date(start);d.setDate(start.getDate()+i);const key=dateKey(d),items=assembleias.filter(a=>dateKey(a.data_hora)===key),classes=['calendar-day'];if(d.getMonth()!==m)classes.push('other');if(items.length)classes.push('busy');if(key===todayKey)classes.push('today');html+=''}grid.innerHTML=html;grid.querySelectorAll('.calendar-day').forEach(btn=>btn.onclick=()=>selecionarDiaCalendario(btn.dataset.date));if(selected)selecionarDiaCalendario(selected,false)} async function load(){ try{ const d=await Api.get('/api/assembleias-calendario'); assembleias=d.assembleias||[]; renderAssembleias(); }catch(e){Util.toast(e.message,true)} } async function loadResponsaveis(){ try{ const d=await Api.get('/api/assembleia-responsaveis'); responsaveis=d.responsaveis||[]; renderResponsaveis(); }catch(e){Util.toast(e.message,true)} } function renderResponsaveis(){ const admin=Auth.isAdminEmpresa(); responsaveisRows.innerHTML=responsaveis.map(r=>`${esc(r.nome)}${esc(r.telefone||'')}${esc(r.email||'')}${esc(diasLabel(r.dias_semana))}${Util.badge(r.status)}${admin?` `:'-'}`).join('')||'Nenhum responsável cadastrado.'; } function abrirResponsavel(r){ modalTitle.textContent=r?.id?'Editar responsável':'Novo responsável'; modalBody.innerHTML=formHtml(r||{}); modal.classList.remove('hidden'); document.querySelector('#responsavel-form').onsubmit=async e=>{ e.preventDefault(); const f=e.target,b=Util.formData(f); b.dias_semana=[...f.querySelectorAll('input[name=dias]:checked')].map(x=>x.value); if(!b.dias_semana.length){Util.toast('Selecione ao menos um dia da semana.',true);return;} try{ if(b.id)await Api.put('/api/assembleia-responsaveis/'+b.id,b);else await Api.post('/api/assembleia-responsaveis',b); Util.toast(b.id?'Responsável atualizado':'Responsável cadastrado'); fecharResponsavelModal(); await loadResponsaveis(); await load(); }catch(err){Util.toast(err.message,true)} }; } window.alternarBuscaAssembleias=()=>{ const strip=document.querySelector('#assembleia-search'),input=document.querySelector('#assembleia-search-input'); strip.classList.toggle('hidden'); if(!strip.classList.contains('hidden'))input.focus(); }; window.abrirCalendarioAssembleias=async()=>{try{if(!assembleias.length)await load();calMonth=new Date();ensureCalendarModal().classList.remove('hidden');renderCalendarioAssembleias()}catch(e){Util.toast(e.message,true)}}; window.fecharCalendarioAssembleias=()=>document.querySelector('#assembleia-calendar-modal')?.classList.add('hidden'); window.mudarMesCalendario=delta=>{calMonth=new Date(calMonth.getFullYear(),calMonth.getMonth()+delta,1);renderCalendarioAssembleias()}; window.selecionarDiaCalendario=(key,mark=true)=>{if(mark)document.querySelectorAll('.calendar-day').forEach(x=>x.classList.toggle('selected',x.dataset.date===key));const list=document.querySelector('#calendar-day-list'),title=document.querySelector('#calendar-day-title'),items=assembleias.filter(a=>dateKey(a.data_hora)===key);const [yy,mm,dd]=key.split('-');title.textContent=dd+'/'+mm+'/'+yy;if(!items.length){list.innerHTML='

Nenhuma assembleia agendada neste dia.

';return;}list.innerHTML=items.map(a=>'
'+esc(a.condominio_nome||'-')+''+Util.date(a.data_hora)+''+esc(a.tipo)+' - '+esc(a.local||'-')+'

'+esc(destinatariosLabel(a))+'

').join('')}; window.enviarNotificacaoAssembleia=async(btn,condominioId,assembleiaId)=>{if(!await Util.confirm('Deseja enviar a notificação para os contatos e responsáveis desta assembleia?','Enviar notificação'))return;const original=btn?btn.textContent:'';if(btn){btn.disabled=true;btn.textContent='...';}try{const res=await Api.post(`/api/condominios/${condominioId}/assembleias/${assembleiaId}/notificar`,{});if(res&&res.ok===false){Util.toast(res.mensagem||'Falha ao enviar notificação.',true);}else{Util.toast(res?.mensagem||'Notificação enviada com sucesso!');}await load();}catch(err){Util.toast(err.message,true);}finally{if(btn){btn.disabled=false;btn.textContent=original;}}}; window.excluirAssembleia=async(condominioId,assembleiaId)=>{if(!await Util.confirm('Tem certeza que deseja excluir esta assembleia? Esta ação não pode ser desfeita.','Excluir assembleia'))return;try{const res=await Api.request(`/api/condominios/${condominioId}/assembleias/${assembleiaId}`,{method:'DELETE'});Util.toast(res?.mensagem||'Assembleia excluída com sucesso.');await load();if(document.querySelector('#assembleia-calendar-modal')&&!document.querySelector('#assembleia-calendar-modal').classList.contains('hidden')){renderCalendarioAssembleias();}}catch(err){Util.toast(err.message,true);}}; window.abrirNovoResponsavel=()=>abrirResponsavel({}); window.editarResponsavel=id=>{const r=responsaveis.find(x=>Number(x.id)===Number(id));if(r)abrirResponsavel(r)}; window.fecharResponsavelModal=()=>{modal.classList.add('hidden');modalBody.innerHTML=''}; window.excluirResponsavel=async id=>{if(!await Util.confirm('Excluir este responsável de assembleia?','Excluir responsável'))return;try{await Api.request('/api/assembleia-responsaveis/'+id,{method:'DELETE'});Util.toast('Responsável excluído');await loadResponsaveis();await load()}catch(e){Util.toast(e.message,true)}}; document.querySelector('#assembleia-search-input')?.addEventListener('input',renderAssembleias); if(!Auth.isAdminEmpresa())document.querySelector('[onclick="abrirNovoResponsavel()"]')?.classList.add('hidden'); (async()=>{await loadResponsaveis();await load()})();