/*
|--------------------------------------------------------------------------
| Agência PSI
|--------------------------------------------------------------------------
| Criado e desenvolvido por Leonardo Nohama
|
| Tecnologia aplicada à escuta.
| Estrutura para o cuidado.
|
| Arquivo: src/features/agenda/services/agendaRepository.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';
import { useTenantStore } from '@/stores/tenantStore';
import { assertTenantId as assertValidTenantId, assertIsoRange, getUid } from './_tenantGuards';
import { AGENDA_EVENT_SELECT, flattenAgendaRow } from './agendaSelects';

// ─── Configurações & jornada ────────────────────────────────────────────────

export async function getMyAgendaSettings() {
    const uid = await getUid();
    const { data, error } = await tenantDb().from('agenda_configuracoes')
        .select('*')
        .eq('owner_id', uid)
        .order('created_at', { ascending: false })
        .limit(1)
        .maybeSingle();
    if (error) throw error;
    return data;
}

export async function getMyWorkSchedule() {
    const uid = await getUid();
    const { data, error } = await tenantDb().from('agenda_regras_semanais')
        .select('dia_semana, hora_inicio, hora_fim, ativo')
        .eq('owner_id', uid)
        .eq('ativo', true)
        .order('dia_semana');
    if (error) throw error;
    return data || [];
}

export async function listTenantStaff(tenantId) {
    assertValidTenantId(tenantId);
    const { data, error } = await supabase.from('v_tenant_staff').select('*').eq('tenant_id', tenantId);
    if (error) throw error;
    return data || [];
}

// ─── Agenda do terapeuta ────────────────────────────────────────────────────

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

/**
 * Lista eventos do terapeuta logado (owner_id = uid) dentro do tenant ativo.
 * Retorna rows flattened (paciente_nome/paciente_avatar/paciente_status no topo).
 *
 * Parâmetros:
 *   - startISO/endISO: half-open range (lt no final — consistente com clinic)
 *   - ownerId: opcional — default é o uid do usuário logado
 *   - tenantId: opcional — default é tenantStore.activeTenantId
 *   - excludeMirror: se true, filtra mirror_of_event_id IS NULL (agenda do terapeuta
 *     não deve mostrar eventos espelho de outra clínica)
 */
export async function listMyAgendaEvents({ startISO, endISO, ownerId, tenantId, excludeMirror = true } = {}) {
    assertIsoRange(startISO, endISO);
    const uid = ownerId || (await getUid());
    const tid = resolveTenantId(tenantId);

    let q = tenantDb().from('agenda_eventos')
        .select(AGENDA_EVENT_SELECT)
        
        .eq('owner_id', uid)
        .gte('inicio_em', startISO)
        .lt('inicio_em', endISO)
        .order('inicio_em', { ascending: true });

    if (excludeMirror) q = q.is('mirror_of_event_id', null);

    const { data, error } = await q;
    if (error) throw error;
    return (data || []).map(flattenAgendaRow);
}

/**
 * Criação segura:
 * - injeta owner_id do usuário logado (ignora owner_id vindo de fora)
 * - dropa paciente_id (campo legado) e tenant_id (schema-per-tenant não tem a coluna) se vierem no payload
 */
export async function createAgendaEvento(payload) {
    if (!payload) throw new Error('Payload vazio.');
    const uid = await getUid();
    const tid = resolveTenantId();

    // eslint-disable-next-line no-unused-vars
    const { paciente_id: _dropped, tenant_id: _dropTenantId, ...rest } = payload;
    const insertPayload = { ...rest, owner_id: uid };

    const { data, error } = await tenantDb().from('agenda_eventos')
        .insert([insertPayload])
        .select(AGENDA_EVENT_SELECT)
        .single();

    if (error) throw error;
    return flattenAgendaRow(data);
}

/**
 * Atualização segura: filtra por id (isolamento via schema do tenant; RLS reforça no banco).
 */
export async function updateAgendaEvento(id, patch, { tenantId } = {}) {
    if (!id) throw new Error('ID inválido.');
    if (!patch) throw new Error('Patch vazio.');
    const tid = resolveTenantId(tenantId);

    // eslint-disable-next-line no-unused-vars
    const { paciente_id: _dropped, tenant_id: _dropTenantId, ...safePatch } = patch;

    const { data, error } = await tenantDb().from('agenda_eventos')
        .update(safePatch)
        .eq('id', id)
        
        .select(AGENDA_EVENT_SELECT)
        .single();

    if (error) throw error;
    return flattenAgendaRow(data);
}

/**
 * Delete seguro: filtra por id (isolamento via schema do tenant).
 */
export async function deleteAgendaEvento(id, { tenantId } = {}) {
    if (!id) throw new Error('ID inválido.');
    const tid = resolveTenantId(tenantId);

    const { error } = await tenantDb().from('agenda_eventos').delete().eq('id', id);
    if (error) throw error;
    return true;
}
