/*
|--------------------------------------------------------------------------
| Agência PSI
|--------------------------------------------------------------------------
| Criado e desenvolvido por Leonardo Nohama
|
| Tecnologia aplicada à escuta.
| Estrutura para o cuidado.
|
| Arquivo: src/support/supportDebugStore.js
| Data: 2026
| Local: São Carlos/SP — Brasil
|--------------------------------------------------------------------------
| © 2026 — Todos os direitos reservados
|--------------------------------------------------------------------------
*/
/**
 * supportDebugStore.js
 * src/support/supportDebugStore.js
 *
 * Store Pinia para o estado global do modo de suporte técnico.
 *
 * Estado mantido aqui:
 *   - isActive: bool — se o modo debug está ativo
 *   - tenantId: uuid — tenant sendo depurado
 *   - token: string — token de suporte validado
 *   - logs: array — entradas do painel de debug
 *
 * Ativação: somente via validateAndActivate(), que chama o RPC de validação.
 * Nunca ativa via flag local sem validação no banco.
 */

import { defineStore } from 'pinia';
import { ref, computed } from 'vue';
import { supabase } from '@/lib/supabase/client';

const MAX_LOGS = 500; // máximo de entradas no painel

export const useSupportDebugStore = defineStore('supportDebug', () => {
    // ── Estado ────────────────────────────────────────────────────────────────

    const isActive = ref(false);
    const tenantId = ref(null);
    const token = ref(null);
    const logs = ref([]);
    const validating = ref(false);
    const error = ref(null);

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

    const logsByLevel = computed(() => {
        const out = {};
        for (const log of logs.value) {
            if (!out[log.level]) out[log.level] = [];
            out[log.level].push(log);
        }
        return out;
    });

    const errorLogs = computed(() => logs.value.filter((l) => l.level === 'error'));

    const recentLogs = computed(() => [...logs.value].reverse().slice(0, 100));

    // ── Ações ─────────────────────────────────────────────────────────────────

    /**
     * Valida o token no banco e ativa o debug se válido.
     * Único ponto de ativação — sem bypass possível pelo frontend.
     *
     * @param {string} supportToken - valor do query param ?support=TOKEN
     * @returns {boolean} true se ativado
     */
    async function validateAndActivate(supportToken) {
        if (!supportToken || typeof supportToken !== 'string') return false;
        if (supportToken.length < 32) return false;

        validating.value = true;
        error.value = null;

        try {
            const { data, error: rpcError } = await supabase.rpc('validate_support_session', { p_token: supportToken });

            if (rpcError) throw rpcError;

            if (data?.valid === true && data?.tenant_id) {
                isActive.value = true;
                tenantId.value = data.tenant_id;
                token.value = supportToken;
                logs.value = [];
                return true;
            }

            // Token inválido ou expirado — não ativa, não loga erro visível
            deactivate();
            return false;
        } catch (e) {
            error.value = e?.message || 'Erro ao validar sessão de suporte';
            deactivate();
            return false;
        } finally {
            validating.value = false;
        }
    }

    /**
     * Adiciona uma entrada de log ao painel.
     * Chamado pelo supportLogger — não chamar diretamente.
     */
    function addLog(entry) {
        if (!isActive.value) return;
        logs.value.push(entry);
        // Limita o tamanho do painel
        if (logs.value.length > MAX_LOGS) {
            logs.value = logs.value.slice(-MAX_LOGS);
        }
    }

    /**
     * Limpa todos os logs do painel
     */
    function clearLogs() {
        logs.value = [];
    }

    /**
     * Desativa o modo debug e limpa estado
     */
    function deactivate() {
        isActive.value = false;
        tenantId.value = null;
        token.value = null;
        logs.value = [];
        error.value = null;
    }

    return {
        // state
        isActive,
        tenantId,
        token,
        logs,
        validating,
        error,
        // computed
        logsByLevel,
        errorLogs,
        recentLogs,
        // actions
        validateAndActivate,
        addLog,
        clearLogs,
        deactivate
    };
});
