/*
|--------------------------------------------------------------------------
| Agência PSI
|--------------------------------------------------------------------------
| Criado e desenvolvido por Leonardo Nohama
|
| Tecnologia aplicada à escuta.
| Estrutura para o cuidado.
|
| Arquivo: src/support/supportSessionService.js
| Data: 2026
| Local: São Carlos/SP — Brasil
|--------------------------------------------------------------------------
| © 2026 — Todos os direitos reservados
|--------------------------------------------------------------------------
*/
/**
 * supportSessionService.js
 * src/support/supportSessionService.js
 *
 * Serviço para o painel SaaS gerenciar sessões de suporte.
 * Usado apenas pelo painel do admin — nunca pelo terapeuta/paciente.
 *
 * Fluxo:
 *   1. Admin seleciona tenant + TTL + nota opcional
 *   2. createSupportSession(tenantId, ttlMinutes, note) → { token, expires_at }
 *   3. Admin recebe URL pronta para copiar
 *   4. Admin pode listar sessões ativas, histórico e revogar
 */

import { supabase } from '@/lib/supabase/client';

const TAG = '[supportSessionService]';

/**
 * Cria uma sessão de suporte para um tenant.
 * Requer: usuário autenticado com role saas_admin (validado no RPC).
 *
 * @param {string} tenantId    - UUID do tenant a ser depurado
 * @param {number} ttlMinutes  - TTL em minutos (1–120, default 60)
 * @param {string} [note]      - Nota opcional sobre o motivo do suporte
 * @returns {{ token: string, expires_at: string, session_id: string }}
 */
export async function createSupportSession(tenantId, ttlMinutes = 60, note = '') {
    if (!tenantId) throw new Error('tenant_id é obrigatório.');

    console.log(`${TAG} createSupportSession`, { tenantId, ttlMinutes, note: note || '(sem nota)' });

    const { data, error } = await supabase.rpc('create_support_session', {
        p_tenant_id: tenantId,
        p_ttl_minutes: ttlMinutes
    });

    if (error) {
        console.error(`${TAG} createSupportSession ERRO`, error);
        throw error;
    }
    if (!data?.token) throw new Error('Resposta inválida do servidor.');

    // Salva nota localmente associada ao session_id (banco não tem coluna note)
    if (note?.trim()) {
        try {
            const notes = JSON.parse(sessionStorage.getItem('support_notes') || '{}');
            notes[data.session_id || data.token] = note.trim();
            sessionStorage.setItem('support_notes', JSON.stringify(notes));
        } catch {}
    }

    console.log(`${TAG} sessão criada`, { token: `${data.token.slice(0, 8)}…`, expires_at: data.expires_at });
    return data;
}

/**
 * Lista sessões de suporte ATIVAS (não expiradas).
 *
 * @returns {Array}
 */
export async function listActiveSupportSessions() {
    console.log(`${TAG} listActiveSupportSessions`);

    const { data, error } = await supabase.from('support_sessions').select('id, tenant_id, token, expires_at, created_at').gt('expires_at', new Date().toISOString()).order('created_at', { ascending: false });

    if (error) {
        console.error(`${TAG} listActiveSupportSessions ERRO`, error);
        throw error;
    }

    const sessions = data || [];
    console.log(`${TAG} ${sessions.length} sessão(ões) ativa(s)`);

    // Enriquece com notas salvas localmente
    const notes = _loadNotes();
    return sessions.map((s) => ({ ...s, _note: notes[s.id] || notes[s.token] || '' }));
}

/**
 * Lista histórico de sessões (ativas + expiradas), limitado às últimas N.
 *
 * @param {number} limit - quantidade máxima (default 50)
 * @returns {Array}
 */
export async function listSessionHistory(limit = 50) {
    console.log(`${TAG} listSessionHistory limit=${limit}`);

    const { data, error } = await supabase.from('support_sessions').select('id, tenant_id, token, expires_at, created_at').order('created_at', { ascending: false }).limit(limit);

    if (error) {
        console.error(`${TAG} listSessionHistory ERRO`, error);
        throw error;
    }

    const sessions = data || [];
    console.log(`${TAG} histórico: ${sessions.length} sessão(ões)`);

    const notes = _loadNotes();
    const now = new Date();
    return sessions.map((s) => ({
        ...s,
        _note: notes[s.id] || notes[s.token] || '',
        _expired: new Date(s.expires_at) < now
    }));
}

/**
 * Revoga um token de suporte imediatamente.
 *
 * @param {string} token
 * @returns {boolean}
 */
export async function revokeSupportSession(token) {
    if (!token) throw new Error('Token é obrigatório.');

    console.log(`${TAG} revokeSupportSession token=${token.slice(0, 8)}…`);

    const { data, error } = await supabase.rpc('revoke_support_session', { p_token: token });

    if (error) {
        console.error(`${TAG} revokeSupportSession ERRO`, error);
        throw error;
    }

    console.log(`${TAG} sessão revogada:`, !!data);
    return !!data;
}

/**
 * Monta a URL de suporte completa para copiar.
 *
 * @param {string} token
 * @param {string} basePath - rota onde debug será ativado (default: /therapist/agenda)
 * @returns {string}
 */
export function buildSupportUrl(token, basePath = '/therapist/agenda') {
    const origin = window.location.origin;
    return `${origin}${basePath}?support=${token}`;
}

// ─── Helpers internos ─────────────────────────────────────────────────────────

function _loadNotes() {
    try {
        return JSON.parse(sessionStorage.getItem('support_notes') || '{}');
    } catch {
        return {};
    }
}
