/*
|--------------------------------------------------------------------------
| Agência PSI
|--------------------------------------------------------------------------
| Arquivo: src/features/patients/composables/usePatientRecurrences.js
|
| Regras de recorrência (recurrence_rules) do paciente. Usado pela Tab Agenda
| do MelissaPaciente pra mostrar "este paciente tem sessão toda segunda 14h"
| e ações inline (cancelar/reativar).
|
| I/O delegada ao patientsRepository.
|--------------------------------------------------------------------------
*/
import { ref, computed } from 'vue';
import {
    listRecurrencesByPatient,
    updateRecurrenceStatus
} from '@/features/patients/services/patientsRepository';

export function usePatientRecurrences() {
    const rules = ref([]);
    const loading = ref(false);
    const error = ref('');
    const busy = ref(false);
    let _lastPatientId = null;

    async function load(patientId) {
        _lastPatientId = patientId || null;
        if (!patientId) {
            rules.value = [];
            return;
        }
        loading.value = true;
        error.value = '';
        rules.value = [];
        try {
            rules.value = await listRecurrencesByPatient(patientId);
        } catch (e) {
            error.value = e?.message || 'Falha ao carregar recorrências.';
            rules.value = [];
        } finally {
            loading.value = false;
        }
    }

    async function cancel(ruleId) {
        if (!ruleId || busy.value) return { ok: false, error: 'busy' };
        busy.value = true;
        try {
            await updateRecurrenceStatus(ruleId, 'cancelado');
            if (_lastPatientId) await load(_lastPatientId);
            return { ok: true };
        } catch (e) {
            return { ok: false, error: e?.message || 'Erro ao cancelar' };
        } finally {
            busy.value = false;
        }
    }

    async function reactivate(ruleId) {
        if (!ruleId || busy.value) return { ok: false, error: 'busy' };
        busy.value = true;
        try {
            await updateRecurrenceStatus(ruleId, 'ativo');
            if (_lastPatientId) await load(_lastPatientId);
            return { ok: true };
        } catch (e) {
            return { ok: false, error: e?.message || 'Erro ao reativar' };
        } finally {
            busy.value = false;
        }
    }

    const ativas = computed(() => rules.value.filter((r) => r.status === 'ativo'));
    const canceladas = computed(() => rules.value.filter((r) => r.status === 'cancelado'));
    const totalAtivas = computed(() => ativas.value.length);
    const totalCanceladas = computed(() => canceladas.value.length);

    return {
        rules,
        loading,
        error,
        busy,
        load,
        cancel,
        reactivate,
        ativas,
        canceladas,
        totalAtivas,
        totalCanceladas
    };
}
