/**
 * Client API minimaliste pour parler à apps/api en SSR depuis Astro.
 *
 * En dev : `API_URL=http://localhost:3333` (cf. .env.development).
 * En prod : `API_URL=https://app.rubis.pro` injecté par K3s ConfigMap.
 *
 * Ces appels sont **server-side only** (pas exposés au client) — donc
 * pas de problème CORS, on tape directement le service Adonis.
 */

const API_URL =
  import.meta.env.API_URL ?? process.env.API_URL ?? "http://localhost:3333";

export type PostSummary = {
  id: string;
  slug: string;
  title: string;
  excerpt: string;
  heroImageUrl: string | null;
  heroImageAlt: string | null;
  authorName: string;
  tags: string[];
  publishedAt: string | null;
  readingTimeMinutes: number;
};

export type Post = PostSummary & {
  contentHtml: string;
  ogImageUrl: string | null;
  canonicalUrl: string | null;
  updatedAt: string | null;
  wordCount: number;
  noindex: boolean;
};

export type PostShowResponse = {
  post: Post;
  related: PostSummary[];
};

/**
 * Toutes les réponses de l'API Adonis sont enveloppées dans `{ data: ... }`
 * par le serializer global (cf. apps/api/providers/api_provider.ts). On unwrap
 * ici une fois pour toutes pour que les consommateurs travaillent directement
 * sur le payload typé.
 */
async function apiGet<T>(path: string): Promise<T | null> {
  const res = await fetch(`${API_URL}${path}`, {
    headers: { Accept: "application/json" },
  });
  if (res.status === 404) return null;
  if (!res.ok) throw new Error(`API ${path} → ${res.status}`);
  const json = (await res.json()) as { data: T };
  return json.data;
}

export async function listPosts(): Promise<PostSummary[]> {
  return (await apiGet<PostSummary[]>("/api/v1/posts")) ?? [];
}

export async function getPost(slug: string): Promise<PostShowResponse | null> {
  return await apiGet<PostShowResponse>(`/api/v1/posts/${encodeURIComponent(slug)}`);
}
