/*
|--------------------------------------------------------------------------
| Agência PSI
|--------------------------------------------------------------------------
| Criado e desenvolvido por Leonardo Nohama
|
| Tecnologia aplicada à escuta.
| Estrutura para o cuidado.
|
| Arquivo: src/services/DocumentAuditLog.service.js
| Data: 2026
| Local: São Carlos/SP — Brasil
|--------------------------------------------------------------------------
| © 2026 — Todos os direitos reservados
|--------------------------------------------------------------------------
*/
import { supabase } from '@/lib/supabase/client';

import { tenantDb } from '@/lib/supabase/tenantClient';
// ── Helpers ──────────────────────────────────────────────────

async function getOwnerId() {
    const { data, error } = await supabase.auth.getUser();
    if (error) throw error;
    const uid = data?.user?.id;
    if (!uid) throw new Error('Sessão inválida.');
    return uid;
}

async function getActiveTenantId(uid) {
    const { data, error } = await supabase
        .from('tenant_members')
        .select('tenant_id')
        .eq('user_id', uid)
        .eq('status', 'active')
        .order('created_at', { ascending: false })
        .limit(1)
        .single();
    if (error) throw error;
    if (!data?.tenant_id) throw new Error('Tenant não encontrado.');
    return data.tenant_id;
}

// ── Registrar acesso ────────────────────────────────────────

/**
 * Registra acesso a um documento (visualizacao, download, etc.).
 * Tabela imutavel — somente INSERT.
 *
 * @param {string} documentoId
 * @param {string} acao - 'visualizou' | 'baixou' | 'imprimiu' | 'compartilhou' | 'assinou'
 */
export async function logAccess(documentoId, acao) {
    if (!documentoId || !acao) return;

    const ownerId = await getOwnerId();
    const tenantId = await getActiveTenantId(ownerId);

    const { error } = await tenantDb().from('document_access_logs')
        .insert({
            documento_id: documentoId,
            acao,
            user_id: ownerId
        });

    // Nao lancar erro para nao interromper o fluxo principal
    if (error) console.error('[DocumentAuditLog] Erro ao registrar acesso:', error.message);
}

// ── Listar historico de acessos ─────────────────────────────

/**
 * Retorna historico de acessos de um documento.
 */
export async function listAccessLogs(documentoId) {
    if (!documentoId) return [];

    const { data, error } = await tenantDb().from('document_access_logs')
        .select('*, profiles:user_id(full_name)')
        .eq('documento_id', documentoId)
        .order('acessado_em', { ascending: false });

    if (error) throw error;
    return data || [];
}

/**
 * Retorna historico de acessos de todos os documentos do tenant.
 * Util para auditoria geral.
 *
 * @param {object} filters - { dataInicio, dataFim, acao, userId }
 * @param {number} limit - maximo de registros (default 100)
 */
export async function listAllAccessLogs(filters = {}, limit = 100) {
    const ownerId = await getOwnerId();
    const tenantId = await getActiveTenantId(ownerId);

    let query = tenantDb().from('document_access_logs')
        .select('*, profiles:user_id(full_name), documents:documento_id(nome_original, patient_id)')
        
        .order('acessado_em', { ascending: false })
        .limit(limit);

    if (filters.acao) {
        query = query.eq('acao', filters.acao);
    }
    if (filters.userId) {
        query = query.eq('user_id', filters.userId);
    }
    if (filters.dataInicio) {
        query = query.gte('acessado_em', filters.dataInicio);
    }
    if (filters.dataFim) {
        query = query.lte('acessado_em', filters.dataFim);
    }

    const { data, error } = await query;
    if (error) throw error;
    return data || [];
}

/**
 * Conta acessos por tipo de acao para um documento.
 * Util para exibir badges (ex: "visualizado 5x, baixado 2x").
 */
export async function countAccessByAction(documentoId) {
    if (!documentoId) return {};

    const { data, error } = await tenantDb().from('document_access_logs')
        .select('acao')
        .eq('documento_id', documentoId);

    if (error) throw error;

    const counts = {};
    for (const row of data || []) {
        counts[row.acao] = (counts[row.acao] || 0) + 1;
    }
    return counts;
}
