/*
|--------------------------------------------------------------------------
| Agência PSI
|--------------------------------------------------------------------------
| Arquivo: src/features/patients/composables/usePatientSupportContacts.js
| V#9 — composable de contatos de suporte do paciente (responsável, parente,
| amigo). Encapsula CRUD + estado reativo.
|--------------------------------------------------------------------------
*/
import { ref } from 'vue';
import { supabase } from '@/lib/supabase/client';
import { digitsOnly, fmtPhone } from '@/utils/validators';

function novoContato() {
    return {
        _k: Date.now() + Math.random(),
        nome: '',
        relacao: '',
        tipo: '',
        telefone: '',
        email: '',
        is_primario: false
    };
}

export function usePatientSupportContacts() {
    const contatos = ref([]);
    const loading = ref(false);

    function add() {
        contatos.value.push(novoContato());
    }

    function remove(idx) {
        contatos.value.splice(idx, 1);
    }

    function reset() {
        contatos.value = [];
    }

    function iniciaisFor(nome) {
        return (nome || '')
            .split(' ')
            .filter(Boolean)
            .map((w) => w[0].toUpperCase())
            .slice(0, 2)
            .join('');
    }

    async function load(patientId) {
        if (!patientId) {
            contatos.value = [];
            return;
        }
        loading.value = true;
        try {
            const { data, error } = await supabase
                .from('patient_support_contacts')
                .select('*')
                .eq('patient_id', patientId)
                .order('is_primario', { ascending: false });
            if (error) throw error;
            contatos.value = (data || []).map((c) => ({
                _k: c.id,
                nome: c.nome || '',
                relacao: c.relacao || '',
                tipo: c.tipo || '',
                telefone: fmtPhone(c.telefone || ''),
                email: c.email || '',
                is_primario: !!c.is_primario
            }));
        } catch {
            contatos.value = [];
        } finally {
            loading.value = false;
        }
    }

    /**
     * Substitui contatos do paciente: deleta tudo do owner + reinserta os com nome.
     * @param {string} patientId
     * @param {string} tenantId
     * @param {string} ownerId
     */
    async function save(patientId, tenantId, ownerId) {
        if (!patientId) throw new Error('patientId obrigatório');

        const { error: del } = await supabase
            .from('patient_support_contacts')
            .delete()
            .eq('patient_id', patientId)
            .eq('owner_id', ownerId);
        if (del) throw del;

        const rows = contatos.value
            .filter((c) => c.nome.trim())
            .map((c) => ({
                patient_id: patientId,
                owner_id: ownerId,
                tenant_id: tenantId,
                nome: c.nome.trim() || null,
                relacao: c.relacao || null,
                tipo: c.tipo || null,
                telefone: c.telefone ? digitsOnly(c.telefone) : null,
                email: c.email || null,
                is_primario: !!c.is_primario
            }));

        if (!rows.length) return;
        const { error: ins } = await supabase.from('patient_support_contacts').insert(rows);
        if (ins) throw ins;
    }

    return { contatos, loading, add, remove, reset, iniciaisFor, load, save };
}
