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

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 = await listSupportContactsByPatient(patientId);
            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 {
            // Fallback silencioso pra não quebrar prontuário se tabela estiver vazia/RLS
            contatos.value = [];
        } finally {
            loading.value = false;
        }
    }

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

        const rows = contatos.value
            .filter((c) => c.nome.trim())
            .map((c) => ({
                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
            }));

        // Repository injeta patient_id, owner_id, tenant_id em cada row
        await replacePatientSupportContacts(patientId, rows, { tenantId, ownerId });
    }

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