/** Errors that are safe to surface to a client, with an HTTP status attached. */
export class AppError extends Error {
  constructor(
    public readonly status: number,
    message: string,
    public readonly code: string = 'error',
    public readonly details?: unknown,
  ) {
    super(message);
    this.name = 'AppError';
  }
}

export const badRequest = (m = 'Bad request', details?: unknown) => new AppError(400, m, 'bad_request', details);
export const unauthorized = (m = 'Unauthorized') => new AppError(401, m, 'unauthorized');
export const forbidden = (m = 'Forbidden') => new AppError(403, m, 'forbidden');
export const notFound = (m = 'Not found') => new AppError(404, m, 'not_found');
export const conflict = (m = 'Conflict') => new AppError(409, m, 'conflict');
export const tooLarge = (m = 'Payload too large') => new AppError(413, m, 'too_large');
