/* |-------------------------------------------------------------------------- | 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'; 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 supabase.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 supabase.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; }