<!--
|--------------------------------------------------------------------------
| Agência PSI
|--------------------------------------------------------------------------
| Criado e desenvolvido por Leonardo Nohama
|
| Tecnologia aplicada à escuta.
| Estrutura para o cuidado.
|
| Arquivo: src/components/patients/PatientActionMenu.vue
| Data: 2026
| Local: São Carlos/SP — Brasil
|--------------------------------------------------------------------------
| © 2026 — Todos os direitos reservados
|--------------------------------------------------------------------------
-->
<script setup>
import { ref } from 'vue';
import { useToast } from 'primevue/usetoast';
import { usePatientLifecycle } from '@/composables/usePatientLifecycle';

const props = defineProps({
    patient: { type: Object, required: true },
    hasHistory: { type: Boolean, default: false }
});

const emit = defineEmits(['updated']);

const toast = useToast();
const { deletePatient, deactivatePatient, archivePatient, reactivatePatient } = usePatientLifecycle();

const loading = ref(false);
const menu = ref();

// ── Dialogs ────────────────────────────────────────────────
const deactivateDialogOpen = ref(false);
const archiveDialogOpen = ref(false);
const hasHistoryDialogOpen = ref(false);

// ── Helpers ───────────────────────────────────────────────
function showSuccess(detail) {
    toast.add({ severity: 'success', summary: 'Ok', detail, life: 2500 });
}
function showError(detail) {
    toast.add({ severity: 'error', summary: 'Erro', detail, life: 4000 });
}

async function runAction(fn, successMsg) {
    loading.value = true;
    try {
        const result = await fn(props.patient.id);
        if (!result.ok) {
            showError(result.message || result.error?.message || 'Falha ao executar ação.');
            return;
        }
        showSuccess(successMsg);
        emit('updated');
    } catch (e) {
        showError(e?.message || 'Falha inesperada.');
    } finally {
        loading.value = false;
    }
}

// ── Desativar — sempre mostra dialog informativo
function handleDeactivate() {
    deactivateDialogOpen.value = true;
}

async function confirmDeactivate() {
    deactivateDialogOpen.value = false;
    await runAction(deactivatePatient, 'Paciente desativado.');
}

// ── Arquivar — sempre mostra dialog informativo
function handleArchive() {
    archiveDialogOpen.value = true;
}

async function confirmArchive() {
    archiveDialogOpen.value = false;
    hasHistoryDialogOpen.value = false;
    await runAction(archivePatient, 'Paciente arquivado.');
}

// ── Excluir — se tem histórico, mostra dialog informativo
function handleDelete() {
    if (props.hasHistory) {
        hasHistoryDialogOpen.value = true;
        return;
    }
    doDelete();
}

async function doDelete() {
    loading.value = true;
    try {
        const result = await deletePatient(props.patient.id);
        if (!result.ok) {
            showError(result.message || 'Não foi possível excluir.');
            return;
        }
        showSuccess('Paciente excluído.');
        emit('updated');
    } catch (e) {
        showError(e?.message || 'Falha inesperada.');
    } finally {
        loading.value = false;
    }
}

// ── Menu de ações ─────────────────────────────────────────
function menuItems() {
    const status = props.patient.status;
    const items = [];

    if (status === 'Ativo') {
        items.push({ label: 'Desativar', icon: 'pi pi-pause', command: () => handleDeactivate() });
        items.push({ label: 'Arquivar', icon: 'pi pi-archive', command: () => handleArchive() });
    }

    if (status === 'Inativo') {
        items.push({ label: 'Reativar', icon: 'pi pi-play', command: () => runAction(reactivatePatient, 'Paciente reativado.') });
        items.push({ label: 'Arquivar', icon: 'pi pi-archive', command: () => handleArchive() });
    }

    if (status === 'Arquivado') {
        items.push({ label: 'Reativar', icon: 'pi pi-play', command: () => runAction(reactivatePatient, 'Paciente reativado.') });
    }

    if (status === 'Alta' || status === 'Encaminhado') {
        items.push({ label: 'Arquivar', icon: 'pi pi-archive', command: () => handleArchive() });
        items.push({ label: 'Reativar', icon: 'pi pi-play', command: () => runAction(reactivatePatient, 'Paciente reativado.') });
    }

    if (items.length) items.push({ separator: true });
    items.push({ label: 'Excluir paciente', icon: 'pi pi-trash', class: 'text-red-500', command: () => handleDelete() });

    return items;
}
</script>

<template>
    <div class="flex gap-1 justify-end">
        <Button icon="pi pi-ellipsis-v" severity="secondary" outlined size="small" :loading="loading" v-tooltip.top="'Ações do paciente'" @click="(e) => menu.toggle(e)" />
        <Menu ref="menu" :model="menuItems()" popup appendTo="body" />
    </div>

    <!-- Dialog: Desativar -->
    <Dialog v-model:visible="deactivateDialogOpen" modal :draggable="false" header="Desativar paciente" :style="{ width: '460px', maxWidth: '95vw' }">
        <div class="flex gap-3 items-start py-2">
            <i class="pi pi-exclamation-triangle text-amber-500 text-2xl mt-0.5 shrink-0" />
            <div class="text-sm text-[var(--text-color)] leading-relaxed space-y-2">
                <p class="m-0 font-semibold">Atenção: este paciente pode possuir sessões agendadas e/ou recorrências ativas.</p>
                <p class="m-0">Ao desativar, todas as sessões e recorrências serão mantidas na agenda — porém novos agendamentos ficarão bloqueados.</p>
                <p class="m-0 text-[var(--text-color-secondary)]">Recomendamos revisar a agenda e encerrar as recorrências manualmente antes de prosseguir.</p>
            </div>
        </div>
        <template #footer>
            <div class="flex gap-2 justify-end">
                <Button label="Cancelar" severity="secondary" outlined @click="deactivateDialogOpen = false" />
                <Button label="Entendo, desativar mesmo assim!" icon="pi pi-pause" severity="warn" @click="confirmDeactivate" />
            </div>
        </template>
    </Dialog>

    <!-- Dialog: Arquivar -->
    <Dialog v-model:visible="archiveDialogOpen" modal :draggable="false" header="Arquivar paciente" :style="{ width: '460px', maxWidth: '95vw' }">
        <div class="flex gap-3 items-start py-2">
            <i class="pi pi-archive text-slate-500 text-2xl mt-0.5 shrink-0" />
            <div class="text-sm text-[var(--text-color)] leading-relaxed space-y-2">
                <p class="m-0 font-semibold">O que acontece ao arquivar um paciente?</p>
                <ul class="m-0 pl-4 space-y-1 text-[var(--text-color)]">
                    <li>O paciente sairá da listagem ativa e ficará oculto nas buscas padrão.</li>
                    <li>Todo o histórico clínico, sessões e registros financeiros serão preservados.</li>
                    <li>Novos agendamentos para este paciente ficarão bloqueados.</li>
                    <li>O paciente pode ser <strong>reativado</strong> a qualquer momento pelo menu de ações.</li>
                </ul>
                <p class="m-0 text-[var(--text-color-secondary)]">Arquivar é indicado para pacientes que concluíram o acompanhamento ou que estão em pausa prolongada.</p>
            </div>
        </div>
        <template #footer>
            <div class="flex gap-2 justify-end">
                <Button label="Cancelar" severity="secondary" outlined @click="archiveDialogOpen = false" />
                <Button label="Compreendo, arquivar mesmo assim!" icon="pi pi-archive" @click="confirmArchive" />
            </div>
        </template>
    </Dialog>

    <!-- Dialog: Exclusão bloqueada (paciente com histórico) -->
    <Dialog v-model:visible="hasHistoryDialogOpen" modal :draggable="false" header="Exclusão não permitida" :style="{ width: '420px', maxWidth: '95vw' }">
        <div class="flex gap-3 items-start py-2">
            <i class="pi pi-info-circle text-amber-500 text-2xl mt-0.5 shrink-0" />
            <p class="text-[var(--text-color)] text-sm leading-relaxed m-0">
                Este paciente possui histórico clínico e <strong>não pode ser removido permanentemente</strong>. Apenas o arquivamento é permitido para pacientes com registros de atendimento.
            </p>
        </div>
        <template #footer>
            <div class="flex gap-2 justify-end">
                <Button label="Cancelar" severity="secondary" outlined @click="hasHistoryDialogOpen = false" />
                <Button label="Arquivar paciente" icon="pi pi-archive" @click="confirmArchive" />
            </div>
        </template>
    </Dialog>
</template>
