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

import { ref, computed } from 'vue';
import {
    listTemplates,
    listAllTemplates,
    getTemplate,
    createTemplate,
    updateTemplate,
    deleteTemplate,
    duplicateTemplate,
    extractVariablesFromHtml,
    TEMPLATE_VARIABLES
} from '@/services/DocumentTemplates.service';

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

export function useDocumentTemplates() {
    const templates = ref([]);
    const loading = ref(false);
    const error = ref(null);
    const currentTemplate = ref(null);

    // ── Tipos de template (para selects) ────────────────────

    const TIPOS_TEMPLATE = [
        { value: 'declaracao_comparecimento', label: 'Declaração de comparecimento' },
        { value: 'atestado_psicologico', label: 'Atestado psicológico' },
        { value: 'relatorio_acompanhamento', label: 'Relatório de acompanhamento' },
        { value: 'recibo_pagamento', label: 'Recibo de pagamento' },
        { value: 'termo_consentimento', label: 'Termo de consentimento (TCLE)' },
        { value: 'encaminhamento', label: 'Encaminhamento' },
        { value: 'outro', label: 'Outro' }
    ];

    // ── Computed ────────────────────────────────────────────

    const globalTemplates = computed(() =>
        templates.value.filter(t => t.is_global)
    );

    const tenantTemplates = computed(() =>
        templates.value.filter(t => !t.is_global)
    );

    const activeTemplates = computed(() =>
        templates.value.filter(t => t.ativo)
    );

    // ── Variaveis agrupadas (para dropdown no editor) ───────

    const variablesGrouped = computed(() => {
        const groups = {};
        for (const v of TEMPLATE_VARIABLES) {
            if (!groups[v.grupo]) groups[v.grupo] = [];
            groups[v.grupo].push(v);
        }
        return groups;
    });

    // ── Carregar ────────────────────────────────────────────

    async function fetchTemplates(includeInactive = false) {
        loading.value = true;
        error.value = null;
        try {
            templates.value = includeInactive
                ? await listAllTemplates()
                : await listTemplates();
        } catch (e) {
            error.value = e?.message || 'Erro ao carregar templates.';
            templates.value = [];
        } finally {
            loading.value = false;
        }
    }

    async function fetchTemplate(id) {
        loading.value = true;
        error.value = null;
        try {
            currentTemplate.value = await getTemplate(id);
        } catch (e) {
            error.value = e?.message || 'Erro ao carregar template.';
            currentTemplate.value = null;
        } finally {
            loading.value = false;
        }
    }

    // ── CRUD ────────────────────────────────────────────────

    async function create(payload) {
        const created = await createTemplate(payload);
        templates.value.unshift(created);
        return created;
    }

    async function update(id, payload) {
        const updated = await updateTemplate(id, payload);
        const idx = templates.value.findIndex(t => t.id === id);
        if (idx >= 0) templates.value[idx] = updated;
        if (currentTemplate.value?.id === id) currentTemplate.value = updated;
        return updated;
    }

    async function remove(id) {
        await deleteTemplate(id);
        templates.value = templates.value.filter(t => t.id !== id);
    }

    async function duplicate(id) {
        const copy = await duplicateTemplate(id);
        templates.value.unshift(copy);
        return copy;
    }

    // ── Extrair variaveis do HTML ───────────────────────────

    function extractVariables(html) {
        return extractVariablesFromHtml(html);
    }

    // ── Preview com dados ficticios ─────────────────────────

    const SAMPLE_DATA = {
        paciente_nome: 'Maria Silva Santos',
        paciente_nome_social: 'Maria Santos',
        paciente_cpf: '123.456.789-00',
        paciente_data_nascimento: '15/03/1990',
        paciente_telefone: '(16) 99999-0000',
        paciente_email: 'maria@exemplo.com',
        paciente_endereco: 'Rua das Flores, 123, Centro, São Carlos/SP',
        data_sessao: '28/03/2026',
        hora_inicio: '14:00',
        hora_fim: '14:50',
        modalidade: 'Presencial',
        terapeuta_nome: 'Dr. João Oliveira',
        terapeuta_crp: '06/12345',
        terapeuta_email: 'joao@clinica.com',
        terapeuta_telefone: '(16) 3333-0000',
        clinica_nome: 'Clínica Exemplo',
        clinica_endereco: 'Av. São Carlos, 500, Centro, São Carlos/SP',
        clinica_telefone: '(16) 3333-1111',
        clinica_cnpj: '12.345.678/0001-00',
        valor: 'R$ 200,00',
        valor_extenso: 'duzentos reais',
        forma_pagamento: 'PIX',
        data_atual: new Date().toLocaleDateString('pt-BR'),
        data_atual_extenso: formatDateExtenso(new Date()),
        cidade_estado: 'São Carlos/SP'
    };

    function formatDateExtenso(date) {
        const meses = [
            'janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho',
            'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'
        ];
        return `${date.getDate()} de ${meses[date.getMonth()]} de ${date.getFullYear()}`;
    }

    function previewHtml(html) {
        return String(html || '').replace(/\{\{(\w+)\}\}/g, (match, key) => {
            return SAMPLE_DATA[key] !== undefined
                ? `<span style="background:#fef3c7;padding:1px 4px;border-radius:3px;">${SAMPLE_DATA[key]}</span>`
                : `<span style="background:#fee2e2;padding:1px 4px;border-radius:3px;">${match}</span>`;
        });
    }

    return {
        // State
        templates,
        loading,
        error,
        currentTemplate,

        // Constants
        TIPOS_TEMPLATE,
        TEMPLATE_VARIABLES,
        SAMPLE_DATA,

        // Computed
        globalTemplates,
        tenantTemplates,
        activeTemplates,
        variablesGrouped,

        // Actions
        fetchTemplates,
        fetchTemplate,
        create,
        update,
        remove,
        duplicate,
        extractVariables,
        previewHtml
    };
}
