/*
|--------------------------------------------------------------------------
| Agência PSI
|--------------------------------------------------------------------------
| Criado e desenvolvido por Leonardo Nohama
|
| Tecnologia aplicada à escuta.
| Estrutura para o cuidado.
|
| Arquivo: src/features/documents/composables/useDocuments.js
| Data: 2026
| Local: São Carlos/SP — Brasil
|--------------------------------------------------------------------------
| © 2026 — Todos os direitos reservados
|--------------------------------------------------------------------------
*/

import { ref, computed, watch } from 'vue';
import {
    listDocuments,
    listAllDocuments,
    uploadDocument,
    updateDocument,
    softDeleteDocument,
    restoreDocument,
    getDownloadUrl,
    getUsedTags
} from '@/services/Documents.service';
import { logAccess } from '@/services/DocumentAuditLog.service';

// ── Composable ──────────────────────────────────────────────

export function useDocuments(patientId = null) {
    const documents = ref([]);
    const loading = ref(false);
    const error = ref(null);
    const usedTags = ref([]);

    // Filtros reativos
    const filters = ref({
        tipo_documento: null,
        categoria: null,
        tag: null,
        search: ''
    });

    // ── Computed: stats rapidos ─────────────────────────────

    const stats = computed(() => {
        const docs = documents.value;
        const total = docs.length;
        const porTipo = {};
        const pendentesRevisao = docs.filter(d => d.status_revisao === 'pendente').length;

        for (const d of docs) {
            const tipo = d.tipo_documento || 'outro';
            porTipo[tipo] = (porTipo[tipo] || 0) + 1;
        }

        const tamanhoTotal = docs.reduce((sum, d) => sum + (d.tamanho_bytes || 0), 0);

        return { total, porTipo, pendentesRevisao, tamanhoTotal };
    });

    // ── Tipos de documento (para filtros) ───────────────────

    const TIPOS_DOCUMENTO = [
        { value: 'laudo', label: 'Laudo' },
        { value: 'receita', label: 'Receita' },
        { value: 'exame', label: 'Exame' },
        { value: 'termo_assinado', label: 'Termo assinado' },
        { value: 'relatorio_externo', label: 'Relatório externo' },
        { value: 'identidade', label: 'Identidade' },
        { value: 'convenio', label: 'Convênio' },
        { value: 'declaracao', label: 'Declaração' },
        { value: 'atestado', label: 'Atestado' },
        { value: 'recibo', label: 'Recibo' },
        { value: 'outro', label: 'Outro' }
    ];

    // ── Carregar documentos ─────────────────────────────────

    async function fetchDocuments() {
        loading.value = true;
        error.value = null;
        try {
            const activeFilters = {};
            if (filters.value.tipo_documento) activeFilters.tipo_documento = filters.value.tipo_documento;
            if (filters.value.categoria) activeFilters.categoria = filters.value.categoria;
            if (filters.value.tag) activeFilters.tag = filters.value.tag;
            if (filters.value.search) activeFilters.search = filters.value.search;

            const pid = typeof patientId === 'function' ? patientId() : patientId;
            if (pid) {
                documents.value = await listDocuments(pid, activeFilters);
            } else {
                documents.value = await listAllDocuments(activeFilters);
            }
        } catch (e) {
            error.value = e?.message || 'Erro ao carregar documentos.';
            documents.value = [];
        } finally {
            loading.value = false;
        }
    }

    // ── Upload ──────────────────────────────────────────────

    async function upload(file, targetPatientId, meta = {}) {
        const pid = targetPatientId || (typeof patientId === 'function' ? patientId() : patientId);
        if (!pid) throw new Error('Paciente não informado.');

        const doc = await uploadDocument(file, pid, meta);
        documents.value.unshift(doc);
        return doc;
    }

    // ── Update ──────────────────────────────────────────────

    async function update(id, payload) {
        const updated = await updateDocument(id, payload);
        const idx = documents.value.findIndex(d => d.id === id);
        if (idx >= 0) documents.value[idx] = updated;
        return updated;
    }

    // ── Soft delete ─────────────────────────────────────────

    async function remove(id) {
        await softDeleteDocument(id);
        documents.value = documents.value.filter(d => d.id !== id);
    }

    // ── Restore ─────────────────────────────────────────────

    async function restore(id) {
        await restoreDocument(id);
        await fetchDocuments();
    }

    // ── Download com auditoria ──────────────────────────────

    async function download(doc) {
        const bucket = doc.storage_bucket || undefined;
        const url = await getDownloadUrl(doc.bucket_path, 60, bucket);
        logAccess(doc.id, 'baixou');

        // Abrir download
        const a = document.createElement('a');
        a.href = url;
        a.download = doc.nome_original || 'arquivo';
        a.target = '_blank';
        document.body.appendChild(a);
        a.click();
        document.body.removeChild(a);
    }

    // ── Preview com auditoria ───────────────────────────────

    async function getPreviewUrl(doc) {
        const bucket = doc.storage_bucket || undefined;
        const url = await getDownloadUrl(doc.bucket_path, 300, bucket);
        logAccess(doc.id, 'visualizou');
        return url;
    }

    // ── Tags ────────────────────────────────────────────────

    async function fetchUsedTags() {
        try {
            usedTags.value = await getUsedTags();
        } catch {
            usedTags.value = [];
        }
    }

    // ── Limpar filtros ──────────────────────────────────────

    function clearFilters() {
        filters.value = { tipo_documento: null, categoria: null, tag: null, search: '' };
    }

    // ── Helper: formatar tamanho ────────────────────────────

    function formatSize(bytes) {
        if (!bytes) return '—';
        if (bytes < 1024) return bytes + ' B';
        if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';
        return (bytes / (1024 * 1024)).toFixed(1) + ' MB';
    }

    // ── Helper: icone por mime type ─────────────────────────

    function mimeIcon(mimeType) {
        const m = String(mimeType || '');
        if (m.startsWith('image/')) return 'pi pi-image';
        if (m === 'application/pdf') return 'pi pi-file-pdf';
        if (m.includes('word') || m.includes('document')) return 'pi pi-file-word';
        if (m.includes('excel') || m.includes('sheet')) return 'pi pi-file-excel';
        if (m.startsWith('text/')) return 'pi pi-file';
        return 'pi pi-file';
    }

    return {
        // State
        documents,
        loading,
        error,
        filters,
        usedTags,

        // Computed
        stats,
        TIPOS_DOCUMENTO,

        // Actions
        fetchDocuments,
        upload,
        update,
        remove,
        restore,
        download,
        getPreviewUrl,
        fetchUsedTags,
        clearFilters,

        // Helpers
        formatSize,
        mimeIcon
    };
}
