import { DEMO_AUTH_ENABLED, getStoredAccessToken } from "@/lib/auth"; const SUPABASE_URL = (import.meta.env["VITE_SUPABASE_URL"] ?? "").replace(/\/+$/, ""); const SUPABASE_ANON_KEY = import.meta.env["VITE_SUPABASE_ANON_KEY"] ?? ""; function parseErrorMessage(payload: unknown, fallback: string) { if (!payload || typeof payload !== "object") return fallback; const record = payload as Record; const message = record["message"]; const error = record["error"]; const details = record["details"]; if (typeof message === "string" && message.trim()) return message; if (typeof error === "string" && error.trim()) return error; if (typeof details === "string" && details.trim()) return details; return fallback; } export function hasRealSupabaseSession() { return !DEMO_AUTH_ENABLED && Boolean(getStoredAccessToken()); } export async function callAuthenticatedRpc( functionName: string, payload: Record = {}, ): Promise { if (DEMO_AUTH_ENABLED) { throw new Error("Esta operación de Supabase no está disponible en modo demostrativo."); } if (!SUPABASE_URL || !SUPABASE_ANON_KEY) { throw new Error("Faltan las variables VITE_SUPABASE_URL o VITE_SUPABASE_ANON_KEY."); } const accessToken = getStoredAccessToken(); if (!accessToken) { throw new Error("No hay una sesión autenticada activa."); } const response = await fetch(`${SUPABASE_URL}/rest/v1/rpc/${functionName}`, { method: "POST", headers: { apikey: SUPABASE_ANON_KEY, Authorization: `Bearer ${accessToken}`, "Content-Type": "application/json", Accept: "application/json", }, body: JSON.stringify(payload), }); const text = await response.text(); let parsed: unknown = null; if (text) { try { parsed = JSON.parse(text) as unknown; } catch { parsed = text; } } if (!response.ok) { throw new Error( parseErrorMessage(parsed, `Supabase rechazó la operación ${functionName} (${response.status}).`), ); } return parsed as T; }