import createClient from 'openapi-fetch';
import type { paths } from './schema';
import { lireJeton } from './jeton';

/** Client typé — généré depuis docs/openapi.json (règle d'or ADR-001 :
 *  spec committée, clients régénérés dans le même commit).
 *  EXPO_PUBLIC_API_URL pointe l'API (IP LAN pour Expo Go sur téléphone). */
export const API_URL = process.env.EXPO_PUBLIC_API_URL ?? 'http://localhost:3000';

/** Origine du web (R6.4 — lien d'activation « Personnes », même page
 *  `/activation?token=…` que le web, il n'existe pas d'équivalent mobile).
 *  À définir par environnement comme EXPO_PUBLIC_API_URL. */
export const WEB_URL = process.env.EXPO_PUBLIC_WEB_URL ?? 'http://localhost:5173';

export const api = createClient<paths>({ baseUrl: API_URL });

api.use({
  async onRequest({ request }) {
    const jeton = await lireJeton();
    if (jeton) request.headers.set('Authorization', `Bearer ${jeton}`);
    return request;
  },
});

export async function unwrap<T>(res: {
  data?: T;
  error?: unknown;
  response: Response;
}): Promise<T> {
  if (res.data !== undefined) return res.data;
  const message =
    res.error && typeof res.error === 'object' && 'message' in res.error
      ? String((res.error as { message: unknown }).message)
      : `API injoignable ou refus (${res.response.status})`;
  throw new Error(message);
}
