/*
|--------------------------------------------------------------------------
| Agência PSI
|--------------------------------------------------------------------------
| Criado e desenvolvido por Leonardo Nohama
|
| Tecnologia aplicada à escuta.
| Estrutura para o cuidado.
|
| Arquivo: src/services/agendaConfigService.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';
export 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;
}

export async function fetchSlotsRegras(ownerId) {
    const { data, error } = await tenantDb().from('agenda_slots_regras').select('*').eq('owner_id', ownerId).order('dia_semana', { ascending: true });
    if (error) throw error;
    return data || [];
}

export async function upsertSlotRegra(ownerId, payload) {
    const row = {
        owner_id: ownerId,
        dia_semana: Number(payload.dia_semana),
        passo_minutos: Number(payload.passo_minutos),
        offset_minutos: Number(payload.offset_minutos),
        buffer_antes_min: Number(payload.buffer_antes_min || 0),
        buffer_depois_min: Number(payload.buffer_depois_min || 0),
        min_antecedencia_horas: Number(payload.min_antecedencia_horas || 0),
        ativo: !!payload.ativo
    };

    const { data, error } = await tenantDb().from('agenda_slots_regras').upsert(row, { onConflict: 'owner_id,dia_semana' }).select('*').single();

    if (error) throw error;
    return data;
}

export function normalizeHHMM(v) {
    if (v == null) return null;
    const s = String(v).trim();
    if (/^\d{2}:\d{2}$/.test(s)) return s;
    if (/^\d{2}:\d{2}:\d{2}$/.test(s)) return s.slice(0, 5);
    return s;
}

export function ruleKey(r) {
    return [r.dia_semana, normalizeHHMM(r.hora_inicio), normalizeHHMM(r.hora_fim), r.modalidade || 'ambos', !!r.ativo].join('|');
}

/**
 * Remove duplicados exatos antes de mandar pro banco.
 * (DB já tem UNIQUE, mas isso evita erro e deixa UX melhor)
 */
export function dedupeRegrasSemanais(regras) {
    const seen = new Set();
    const out = [];
    for (const r of regras || []) {
        const k = ruleKey(r);
        if (seen.has(k)) continue;
        seen.add(k);
        out.push(r);
    }
    return out;
}
