import type { ErrorHandler } from 'hono'

import { AppError } from './errors.js'

function serialize(value: unknown): string {
  return JSON.stringify(value, (_key, currentValue) =>
    typeof currentValue === 'bigint' ? currentValue.toString(10) : currentValue,
  )
}

function json(body: unknown, status: number): Response {
  return new Response(serialize(body), {
    status,
    headers: { 'content-type': 'application/json; charset=utf-8' },
  })
}

export function ok(data: unknown, status = 200): Response {
  return json({ data }, status)
}

export function fail(code: string, message: string, status: number): Response {
  return json({ error: { code, message } }, status)
}

export const onError: ErrorHandler = (error) => {
  if (error instanceof AppError) {
    return fail(error.code, error.message, error.status)
  }

  return fail('INTERNAL_SERVER_ERROR', 'Internal server error', 500)
}
