import { Request, Response, NextFunction } from 'express';
import { Prisma } from '@prisma/client';

export function errorHandler(
  err: Error & { status?: number; code?: string },
  _req: Request,
  res: Response,
  _next: NextFunction
): void {
  // Prisma "record not found" (findUniqueOrThrow / update / delete on missing row)
  if (
    (err instanceof Prisma.PrismaClientKnownRequestError && err.code === 'P2025') ||
    err.name === 'NotFoundError'
  ) {
    res.status(404).json({ error: 'Not found' });
    return;
  }
  if (err instanceof Prisma.PrismaClientKnownRequestError && err.code === 'P2002') {
    res.status(409).json({ error: 'A record with that unique value already exists' });
    return;
  }
  if (err instanceof Prisma.PrismaClientKnownRequestError && err.code === 'P2003') {
    res.status(400).json({ error: 'Referenced record does not exist' });
    return;
  }

  const status = err.status || 500;
  const message = status < 500 ? err.message : 'Internal server error';
  if (status >= 500) {
    console.error(err);
  }
  res.status(status).json({ error: message, code: err.code });
}

export class AppError extends Error {
  constructor(message: string, public status: number = 400, public code?: string) {
    super(message);
    this.name = 'AppError';
  }
}
