import { STATUS_CODES } from "node:http";

export class ApiError extends Error {
  constructor(
    public readonly status: number,
    public readonly title: string,
    public readonly detail?: string,
  ) {
    super(detail ?? title);
  }
}

export async function parseProblem(res: Response): Promise<ApiError> {
  // `statusText` est vide quand le serveur n'envoie pas de reason phrase (HTTP/2, Response()
  // construite à la main) : retomber sur la phrase standard du code.
  const fallbackTitle = res.statusText || STATUS_CODES[res.status] || `HTTP ${res.status}`;
  try {
    const body = (await res.json()) as { status?: number; title?: string; detail?: string };
    return new ApiError(body.status ?? res.status, body.title ?? fallbackTitle, body.detail);
  } catch {
    return new ApiError(res.status, fallbackTitle);
  }
}
