/* |-------------------------------------------------------------------------- | Agência PSI |-------------------------------------------------------------------------- | Arquivo: src/features/patients/composables/usePatientSessions.js | | Carrega sessoes (agenda_eventos) do paciente. Limit 100 mais recentes | ordenadas desc por inicio_em. Compativel com a logica original do | PatientProntuario.vue. |-------------------------------------------------------------------------- */ import { ref, computed } from 'vue'; import { supabase } from '@/lib/supabase/client'; export function usePatientSessions() { const sessions = ref([]); const loading = ref(false); const error = ref(''); async function load(patientId) { if (!patientId) { sessions.value = []; return; } loading.value = true; error.value = ''; sessions.value = []; try { const { data, error: err } = await supabase .from('agenda_eventos') .select('id, inicio_em, fim_em, status, modalidade, tipo, titulo, titulo_custom, observacoes') .eq('patient_id', patientId) .order('inicio_em', { ascending: false }) .limit(100); if (err) throw err; sessions.value = data || []; } catch (e) { error.value = e?.message || 'Falha ao carregar sessões.'; sessions.value = []; } finally { loading.value = false; } } // Helpers derivados — proxima sessao agendada e status corrente const proximaSessao = computed(() => { const now = Date.now(); return [...sessions.value] .filter((s) => s.inicio_em && new Date(s.inicio_em).getTime() >= now) .sort((a, b) => new Date(a.inicio_em) - new Date(b.inicio_em))[0] || null; }); const ultimaSessao = computed(() => { const now = Date.now(); return sessions.value .filter((s) => s.inicio_em && new Date(s.inicio_em).getTime() < now) .sort((a, b) => new Date(b.inicio_em) - new Date(a.inicio_em))[0] || null; }); const totalSessoes = computed(() => sessions.value.length); // Conta status com regex pra cobrir variantes pt-br // (realizada/realizado/presente; falta/faltou; cancelada/cancelado/remarcada). const totalRealizadas = computed(() => sessions.value.filter((s) => /realiz|present/i.test(String(s.status || ''))).length ); const totalFaltas = computed(() => sessions.value.filter((s) => /falt/i.test(String(s.status || ''))).length ); const totalCanceladas = computed(() => sessions.value.filter((s) => /cancel|remarca/i.test(String(s.status || ''))).length ); /** * Top 6 sessoes "atendidas" (qualquer status que indica encontro: realizado, * faltou, cancelado, remarcado) — alimenta a Timeline da Visao Geral. */ const ultimasAtendidas = computed(() => sessions.value .filter((s) => /realiz|present|falt|cancel|remarca/i.test(String(s.status || ''))) .slice(0, 6) ); return { sessions, loading, error, load, proximaSessao, ultimaSessao, totalSessoes, totalRealizadas, totalFaltas, totalCanceladas, ultimasAtendidas }; }