// Config del Cerebrito en la NUBE: la configuracion de impresion (mapeo
// impresora->puesto, despacho, sinPuesto, pin de sala) se guarda por negocio y
// baja sola en cualquier laptop que inicie sesion. NO guarda credenciales.
import type { ImpresoraCfg } from './tipos.js';

export interface PrefsNube {
  impresoras?: ImpresoraCfg[];
  despacho?: { puesto: string; tipos?: string[] };
  sinPuesto?: 'defecto' | 'ignorar';
  pinSala?: string;
}

/** Baja la config guardada en la nube para el restaurante (o null si no hay). */
export async function cargarConfigNube(
  url: string,
  anon: string,
  token: string,
  restauranteId: string,
): Promise<PrefsNube | null> {
  try {
    const r = await fetch(
      `${url}/rest/v1/cerebrito_config_nube?restaurante_id=eq.${restauranteId}&select=config`,
      { headers: { apikey: anon, Authorization: `Bearer ${token}` } },
    );
    if (!r.ok) return null;
    const rows = (await r.json()) as { config?: PrefsNube }[];
    return rows?.[0]?.config ?? null;
  } catch {
    return null;
  }
}

/** Sube (upsert) la config a la nube. Best-effort: si falla no bloquea el guardado local. */
export async function guardarConfigNube(
  url: string,
  anon: string,
  token: string,
  restauranteId: string,
  prefs: PrefsNube,
): Promise<boolean> {
  try {
    const r = await fetch(`${url}/rest/v1/cerebrito_config_nube?on_conflict=restaurante_id`, {
      method: 'POST',
      headers: {
        apikey: anon,
        Authorization: `Bearer ${token}`,
        'Content-Type': 'application/json',
        Prefer: 'resolution=merge-duplicates,return=minimal',
      },
      body: JSON.stringify({
        restaurante_id: restauranteId,
        config: prefs,
        actualizado_en: new Date().toISOString(),
      }),
    });
    return r.ok;
  } catch {
    return false;
  }
}
