/*
|--------------------------------------------------------------------------
| Agência PSI
|--------------------------------------------------------------------------
| Criado e desenvolvido por Leonardo Nohama
|
| Tecnologia aplicada à escuta.
| Estrutura para o cuidado.
|
| Arquivo: src/support/supportLogger.js
| Data: 2026
| Local: São Carlos/SP — Brasil
|--------------------------------------------------------------------------
| © 2026 — Todos os direitos reservados
|--------------------------------------------------------------------------
*/
/**
 * supportLogger.js
 * src/support/supportLogger.js
 *
 * Logger centralizado para o sistema de suporte técnico SaaS.
 *
 * - Quando debug ATIVO: registra no painel de suporte + console agrupado
 * - Quando debug INATIVO: silencia completamente (zero custo em produção)
 *
 * IMPORTANTE: nunca chamar console.log diretamente nos composables.
 * Usar sempre este módulo para logs de diagnóstico.
 *
 * Uso:
 *   import { logEvent, logAPI, logError, logTenant } from '@/support/supportLogger'
 *   logTenant('loadSessionAndTenant', { tenantId, role })
 */

import { useSupportDebugStore } from './supportDebugStore';

// ─── Níveis ──────────────────────────────────────────────────────────────────

export const LOG_LEVEL = {
    EVENT: 'event',
    API: 'api',
    ERROR: 'error',
    RECURRENCE: 'recurrence',
    GUARD: 'guard',
    PERF: 'perf',
    TENANT: 'tenant',
    MENU: 'menu',
    PROFILE: 'profile',
    AUTH: 'auth',
    AGENDA: 'agenda'
};

// ─── Função base ─────────────────────────────────────────────────────────────

function _log(level, source, message, data = null) {
    let store;
    try {
        store = useSupportDebugStore();
    } catch {
        return;
    }

    if (!store.isActive) return;

    const entry = {
        id: crypto.randomUUID(),
        level,
        source,
        message,
        data: data ? JSON.parse(JSON.stringify(data)) : null,
        timestamp: new Date().toISOString()
    };

    store.addLog(entry);

    const prefix = `[${level.toUpperCase()}][${source}]`;
    if (level === LOG_LEVEL.ERROR) {
        console.error(prefix, message, data ?? '');
    } else {
        console.log(prefix, message, data ?? '');
    }
}

// ─── API pública ─────────────────────────────────────────────────────────────

/** Log de evento geral (lifecycle, state changes) */
export function logEvent(source, message, data = null) {
    _log(LOG_LEVEL.EVENT, source, message, data);
}

/** Log de chamada de API (Supabase queries) */
export function logAPI(source, message, data = null) {
    _log(LOG_LEVEL.API, source, message, data);
}

/** Log de erro capturado */
export function logError(source, message, error = null) {
    const data = error ? { message: error?.message, code: error?.code, details: error?.details } : null;
    _log(LOG_LEVEL.ERROR, source, message, data);
}

/** Log específico do sistema de recorrência */
export function logRecurrence(message, data = null) {
    _log(LOG_LEVEL.RECURRENCE, 'useRecurrence', message, data);
}

/** Log de navegação/guard do router */
export function logGuard(message, data = null) {
    _log(LOG_LEVEL.GUARD, 'router.guard', message, data);
}

/** Log de tenant: carregamento de sessão, troca de role, tenant ativo */
export function logTenant(source, message, data = null) {
    _log(LOG_LEVEL.TENANT, source, message, data);
}

/** Log do sistema de menu: build, reset, model changes */
export function logMenu(message, data = null) {
    _log(LOG_LEVEL.MENU, 'menuStore', message, data);
}

/** Log da página de perfil: carregamento, salvamento de settings */
export function logProfile(message, data = null) {
    _log(LOG_LEVEL.PROFILE, 'ProfilePage', message, data);
}

/** Log de autenticação: login, logout, refresh, MFA */
export function logAuth(message, data = null) {
    _log(LOG_LEVEL.AUTH, 'auth', message, data);
}

/** Log da agenda: eventos, slots, appointments, recurrence */
export function logAgenda(source, message, data = null) {
    _log(LOG_LEVEL.AGENDA, source, message, data);
}

/**
 * Log de performance — retorna função que finaliza a medição.
 *
 * Uso:
 *   const end = logPerf('useAgenda', 'loadEvents')
 *   ...await work...
 *   end({ count: events.length })
 */
export function logPerf(source, label) {
    let store;
    try {
        store = useSupportDebugStore();
    } catch {
        return () => {};
    }
    if (!store.isActive) return () => {};

    const start = performance.now();
    return function end(extraData = null) {
        const ms = (performance.now() - start).toFixed(2);
        _log(LOG_LEVEL.PERF, source, `${label} — ${ms}ms`, extraData);
    };
}
