/*
|--------------------------------------------------------------------------
| Agência PSI
|--------------------------------------------------------------------------
| Arquivo: src/features/conversations/services/conversationsRepository.js
|
| Repository de conversas (threads + messages). Foundation pra Módulo 6.
|
| ⚠️ src/composables/useConversations.js (existente) AINDA tem supabase direto.
| Migração pra usar este repository fica pra sessão dedicada (composable é fat
| e mistura listing + threading + realtime — audit baseline pediu split em
| useConversationsList + useConversationThreadDetail).
|
| Channel send (WhatsApp Evolution/Twilio, SMS Twilio) NÃO está aqui — é
| operação cross-canal que precisa de factory dedicada (ver audit alta:
| conversationDrawerStore lógica de envio sem abstração).
|--------------------------------------------------------------------------
*/
import { supabase } from '@/lib/supabase/client';
import { tenantDb } from '@/lib/supabase/tenantClient';
import { useTenantStore } from '@/stores/tenantStore';
import { assertTenantId } from './_tenantGuards';
import {
    CONVERSATION_THREAD_SELECT,
    CONVERSATION_MESSAGE_SELECT,
    CONVERSATION_MESSAGE_SELECT_BRIEF
} from './conversationsSelects';

function resolveTenantId(tenantIdArg) {
    const tenantStore = useTenantStore();
    const tenantId = tenantIdArg || tenantStore.activeTenantId || tenantStore.tenantId;
    assertTenantId(tenantId);
    return tenantId;
}

// ─── Threads ─────────────────────────────────────────────────────────────

/**
 * Lista threads do tenant. Limit 500 (default UI usage), ordem desc por
 * last_message_at.
 */
export async function listThreads({ tenantId, limit = 500 } = {}) {
    const tid = resolveTenantId(tenantId);

    const { data, error } = await tenantDb().from('conversation_threads').select(CONVERSATION_THREAD_SELECT).order('last_message_at', { ascending: false }).limit(limit);

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

/**
 * Lê thread por id.
 */
export async function getThreadById(threadId, { tenantId } = {}) {
    if (!threadId) throw new Error('threadId obrigatório.');
    const tid = resolveTenantId(tenantId);

    const { data, error } = await tenantDb().from('conversation_threads').select(CONVERSATION_THREAD_SELECT).eq('id', threadId).maybeSingle();

    if (error) throw error;
    return data || null;
}

/**
 * Atualiza thread (assigned_to, kanban_status, etc).
 */
export async function updateThread(threadId, patch, { tenantId } = {}) {
    if (!threadId) throw new Error('threadId obrigatório.');
    const tid = resolveTenantId(tenantId);

    const { data, error } = await tenantDb().from('conversation_threads').update({ ...patch, updated_at: new Date().toISOString() }).eq('id', threadId).select(CONVERSATION_THREAD_SELECT).single();

    if (error) throw error;
    return data;
}

// ─── Messages ────────────────────────────────────────────────────────────

/**
 * Lista mensagens de uma thread. Limit 500 desc por created_at.
 */
export async function listMessagesByThread(threadId, { tenantId, limit = 500 } = {}) {
    if (!threadId) return [];
    const tid = resolveTenantId(tenantId);

    const { data, error } = await tenantDb().from('conversation_messages').select(CONVERSATION_MESSAGE_SELECT).eq('thread_id', threadId).order('created_at', { ascending: true }).limit(limit);

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

/**
 * Lista mensagens por paciente (brief — sem attachments pesados).
 * Usado em prontuário (PatientConversationsTab).
 */
export async function listMessagesByPatient(patientId, { tenantId, limit = 200 } = {}) {
    if (!patientId) return [];
    const tid = resolveTenantId(tenantId);

    const { data, error } = await tenantDb().from('conversation_messages').select(CONVERSATION_MESSAGE_SELECT_BRIEF).eq('patient_id', patientId).order('created_at', { ascending: false }).limit(limit);

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

/**
 * Atualiza kanban_status de uma mensagem (in-app workflow).
 */
export async function updateMessageKanban(messageId, kanbanStatus, { tenantId } = {}) {
    if (!messageId) throw new Error('messageId obrigatório.');
    const tid = resolveTenantId(tenantId);

    const { error } = await tenantDb().from('conversation_messages').update({ kanban_status: kanbanStatus, updated_at: new Date().toISOString() }).eq('id', messageId);

    if (error) throw error;
}
