/*
|--------------------------------------------------------------------------
| Agência PSI
|--------------------------------------------------------------------------
| Criado e desenvolvido por Leonardo Nohama
|
| Tecnologia aplicada à escuta.
| Estrutura para o cuidado.
|
| Arquivo: src/composables/useMenuBadges.js
| Data: 2026
| Local: São Carlos/SP — Brasil
|--------------------------------------------------------------------------
| © 2026 — Todos os direitos reservados
|--------------------------------------------------------------------------
*/

import { ref } from 'vue';
import { supabase } from '@/lib/supabase/client';
import { tenantDb } from '@/lib/supabase/tenantClient';
import { useTenantStore } from '@/stores/tenantStore';

// ─── estado compartilhado ──────────────────────────────────
const agendaHoje = ref(0);
const cadastrosRecebidos = ref(0);
const agendamentosRecebidos = ref(0);
const conversasUnread = ref(0);

let _timer = null;
let _started = false;
let _realtimeChannel = null;

async function _refresh() {
    try {
        const tenantStore = useTenantStore();
        const role = tenantStore.role;
        const tenantId = tenantStore.activeTenantId || tenantStore.tenantId || tenantStore.tenant?.id || null;

        const { data: authData } = await supabase.auth.getUser();
        const ownerId = authData?.user?.id;
        if (!ownerId) return;

        const isClinic = role === 'clinic_admin' || role === 'tenant_admin' || role === 'clinic';

        const now = new Date();
        const y = now.getFullYear(),
            mo = now.getMonth(),
            d = now.getDate();
        const startDay = new Date(y, mo, d).toISOString();
        const endDay = new Date(y, mo, d + 1).toISOString();

        // 1. Agenda hoje
        {
            let q = tenantDb().from('agenda_eventos').select('id', { count: 'exact', head: true }).gte('inicio_em', startDay).lt('inicio_em', endDay);
            if (!(isClinic && tenantId)) q = q.eq('owner_id', ownerId);
            const { count } = await q;
            agendaHoje.value = count || 0;
        }

        // 2. Cadastros recebidos (status = 'new') — RLS filtra pelo owner
        {
            const { count } = await supabase.from('patient_intake_requests').select('id', { count: 'exact', head: true }).eq('status', 'new');
            cadastrosRecebidos.value = count || 0;
        }

        // 3. Agendamentos recebidos (status = 'pendente')
        {
            let q = supabase.from('agendador_solicitacoes').select('id', { count: 'exact', head: true }).eq('status', 'pendente');
            if (isClinic && tenantId) q = q.eq('tenant_id', tenantId);
            else q = q.eq('owner_id', ownerId);
            const { count } = await q;
            agendamentosRecebidos.value = count || 0;
        }

        // 4. Conversas não lidas (mensagens inbound sem read_at)
        if (tenantId) {
            const { count } = await tenantDb().from('conversation_messages')
                .select('id', { count: 'exact', head: true })
                .eq('direction', 'inbound')
                .is('read_at', null);
            conversasUnread.value = count || 0;
        }
    } catch {
        // badge falhar não deve quebrar a navegação
    }
}

// Subscribe Realtime pra atualizar badge ao vivo
function _subscribeRealtime() {
    try {
        const tenantStore = useTenantStore();
        const tenantId = tenantStore.activeTenantId || tenantStore.tenantId || null;
        const tenantSchema = tenantStore.activeTenantSchema;
        if (!tenantId || !tenantSchema) return;
        if (_realtimeChannel) {
            supabase.removeChannel(_realtimeChannel);
        }
        _realtimeChannel = supabase
            .channel(`menu_badges_conv_${tenantId}`)
            .on(
                'postgres_changes',
                { event: 'INSERT', schema: tenantSchema, table: 'conversation_messages' },
                () => _refresh()
            )
            .on(
                'postgres_changes',
                { event: 'UPDATE', schema: tenantSchema, table: 'conversation_messages' },
                () => _refresh()
            )
            .subscribe();
    } catch {
        // Realtime falhar não deve quebrar
    }
}

// ─── API pública ───────────────────────────────────────────
export function useMenuBadges() {
    if (!_started) {
        _started = true;
        _refresh();
        _subscribeRealtime();
        _timer = setInterval(_refresh, 5 * 60 * 1000); // atualiza a cada 5 min (fallback)
    }

    return {
        agendaHoje,
        cadastrosRecebidos,
        agendamentosRecebidos,
        conversasUnread,
        refresh: _refresh
    };
}
