import {
  ExceptionFilter,
  Catch,
  ArgumentsHost,
  HttpException,
  HttpStatus,
} from '@nestjs/common';
import { Response } from 'express';
import { errorResponse } from '../responses/api-response';

/**
 * Global exception filter.
 * Per nest.md: errors return { success: false, message, data: null, extra_data: [] }
 * Never exposes stack traces or internal errors.
 */
@Catch()
export class GlobalExceptionFilter implements ExceptionFilter {
  catch(exception: unknown, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse<Response>();

    let status = HttpStatus.INTERNAL_SERVER_ERROR;
    let message = 'Internal server error';

    // Log non-HTTP errors for debugging
    if (!(exception instanceof HttpException)) {
      console.error('[GlobalExceptionFilter] Unhandled error:', exception);
    }

    if (exception instanceof HttpException) {
      status = exception.getStatus();
      const exResponse = exception.getResponse();

      if (typeof exResponse === 'string') {
        message = exResponse;
      } else if (typeof exResponse === 'object' && exResponse !== null) {
        const resp = exResponse as Record<string, unknown>;
        // Handle class-validator errors (array of messages)
        if (Array.isArray(resp.message)) {
          message = resp.message.join(', ');
        } else if (typeof resp.message === 'string') {
          message = resp.message;
        }
      }
    }

    response.status(status).json(errorResponse(message));
  }
}
