/*
|--------------------------------------------------------------------------
| Agência PSI
|--------------------------------------------------------------------------
| Arquivo: src/composables/useSessionReminders.js
| Data: 2026-04-21
|
| Lembretes automáticos de sessão (CRM Grupo 2.4).
|--------------------------------------------------------------------------
*/

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

const DEFAULTS = {
    enabled: false,
    send_24h: true,
    send_2h: true,
    template_24h: 'Oi {{nome_paciente}}! 👋 Lembrando da sua sessão amanhã, {{data_sessao}} às {{hora_sessao}}. Até lá!',
    template_2h: 'Oi {{nome_paciente}}! Sua sessão começa em 2 horas, às {{hora_sessao}}. Te espero! 😊',
    quiet_hours_enabled: true,
    quiet_hours_start: '22:00',
    quiet_hours_end: '08:00',
    respect_opt_out: true
};

export function useSessionReminders() {
    const tenantStore = useTenantStore();
    const settings = ref({ ...DEFAULTS });
    const recentLogs = ref([]);
    const loading = ref(false);
    const saving = ref(false);

    async function load() {
        const tenantId = tenantStore.activeTenantId;
        if (!tenantId) return;
        loading.value = true;
        try {
            const [settingsRes, logsRes] = await Promise.all([
                tenantDb().from('session_reminder_settings')
                    .select('*')
                    .maybeSingle(),
                tenantDb().from('session_reminder_logs')
                    .select('id, event_id, reminder_type, sent_at, provider, skip_reason, to_phone')
                    .order('sent_at', { ascending: false })
                    .limit(30)
            ]);

            if (settingsRes.data) {
                settings.value = {
                    enabled: !!settingsRes.data.enabled,
                    send_24h: !!settingsRes.data.send_24h,
                    send_2h: !!settingsRes.data.send_2h,
                    template_24h: settingsRes.data.template_24h || DEFAULTS.template_24h,
                    template_2h: settingsRes.data.template_2h || DEFAULTS.template_2h,
                    quiet_hours_enabled: !!settingsRes.data.quiet_hours_enabled,
                    quiet_hours_start: String(settingsRes.data.quiet_hours_start || DEFAULTS.quiet_hours_start).slice(0, 5),
                    quiet_hours_end: String(settingsRes.data.quiet_hours_end || DEFAULTS.quiet_hours_end).slice(0, 5),
                    respect_opt_out: !!settingsRes.data.respect_opt_out
                };
            } else {
                settings.value = { ...DEFAULTS };
            }

            recentLogs.value = logsRes.data || [];
        } catch (e) {
            console.error('[useSessionReminders] load:', e?.message);
        } finally {
            loading.value = false;
        }
    }

    async function save() {
        const tenantId = tenantStore.activeTenantId;
        if (!tenantId) return { ok: false, error: 'no_tenant' };

        const payload = { ...settings.value };
        payload.template_24h = String(payload.template_24h || '').trim().slice(0, 2000);
        payload.template_2h = String(payload.template_2h || '').trim().slice(0, 2000);
        if (!payload.template_24h || !payload.template_2h) {
            return { ok: false, error: 'Templates não podem ficar vazios' };
        }

        saving.value = true;
        try {
            const { error } = await tenantDb().from('session_reminder_settings')
                .upsert({ ...payload }, { onConflict: 'singleton' });
            if (error) throw error;
            return { ok: true };
        } catch (e) {
            return { ok: false, error: e?.message || 'Falha ao salvar' };
        } finally {
            saving.value = false;
        }
    }

    // Dispara manualmente (pra teste ou pra catch-up de eventos perdidos)
    async function runNow() {
        try {
            const { data, error } = await supabase.functions.invoke('send-session-reminders', { body: {} });
            if (error) throw error;
            return { ok: true, stats: data?.stats || null };
        } catch (e) {
            return { ok: false, error: e?.message || 'Falha ao executar' };
        }
    }

    return {
        settings,
        recentLogs,
        loading,
        saving,
        load,
        save,
        runNow
    };
}
