// src/server/shared/plugins/error-handler.ts
// Centralized error handler for Fastify server
import { FastifyError, FastifyRequest, FastifyReply } from 'fastify';
import { ZodError } from 'zod';
import { AppError } from '../lib/errors';
import { loggerService } from '../lib/logger';
import { AuthorizationError } from '../lib/auth';

// Initialize logger for error handling
const errorLogger = loggerService.get('SYSTEM');

export function errorHandler(error: FastifyError, request: FastifyRequest, reply: FastifyReply) {
  // Debug logging - вывод полного стека в терминал
  errorLogger.error('\n❌ [SERVER CRITICAL ERROR]');
  errorLogger.error('URL:', request.raw.url);
  errorLogger.error('Body:', JSON.stringify(request.body, null, 2));
  errorLogger.error('Stack:', error.stack);
  errorLogger.error('-------------------------\n');

  errorLogger.error(`Error caught: ${error.name}, message: ${error.message}, statusCode: ${error.statusCode}, code: ${error.code}`);

  // 1. AppError (Наши контролируемые ошибки)
  if (error instanceof AppError) {
    const response = {
      success: false as const,
      error: {
        code: error.code || 'APP_ERROR',
        message: error.message,
      },
    };

    // Логируем как warning, это не баг сервера, это ошибка бизнес-логики
    errorLogger.warn(`AppError: ${error.message}, statusCode: ${error.statusCode}, code: ${error.code}`);
    errorLogger.warn(`Sending response: ${JSON.stringify(response)}`);

    return reply.status(error.statusCode).send(response);
  }

  // 2. ZodError (Ошибки валидации)
  if (error instanceof ZodError) {
    const response = {
      success: false as const,
      error: {
        code: 'VALIDATION_ERROR',
        message: 'Ошибка валидации данных',
        details: error.issues,
      },
    };

    errorLogger.error('\n⚠️ [ZOD VALIDATION ERROR]');
    errorLogger.error('URL:', request.raw.url);
    errorLogger.error('Body:', JSON.stringify(request.body, null, 2));
    errorLogger.error('Validation Issues:', JSON.stringify(error.issues, null, 2));
    errorLogger.error('-------------------------\n');

    errorLogger.warn(`ZodError: ${error.message}`);

    return reply.status(400).send(response);
  }

  // 3. Ошибки авторизации (AuthorizationError)
  if (error instanceof AuthorizationError) {
    const response = {
      success: false as const,
      error: {
        code: error.code || (error.statusCode === 401 ? 'UNAUTHORIZED' : 'FORBIDDEN'),
        message: error.message,
      },
    };

    errorLogger.warn(`AuthorizationError: ${error.message}, statusCode: ${error.statusCode}, code: ${error.code}`);

    return reply.status(error.statusCode).send(response);
  }

  // 4. Ошибки авторизации (Fastify JWT / Hooks)
  // Важно: перехватываем стандартные 401/403 от плагинов
  if (error.statusCode === 401 || error.code === 'FST_JWT_NO_AUTHORIZATION_IN_HEADER' || error.message === 'Unauthorized') {
    const response = {
      success: false as const,
      error: {
        code: 'UNAUTHORIZED',
        message: 'Неверные учётные данные или сессия истекла',
      },
    };

    errorLogger.warn(`401 Unauthorized: ${error.message}`);

    return reply.status(401).send(response);
  }

  if (error.statusCode === 403) {
    const response = {
      success: false as const,
      error: {
        code: 'FORBIDDEN',
        message: 'Доступ запрещён',
      },
    };

    errorLogger.warn(`403 Forbidden: ${error.message}`);

    return reply.status(403).send(response);
  }

  // 5. Все остальные ошибки (реальные баги)
  const response = {
    success: false as const,
    error: {
      code: 'INTERNAL_SERVER_ERROR',
      message: 'Произошла внутренняя ошибка сервера',
    },
  };

  errorLogger.error(error.message, { stack: error.stack });
  return reply.status(error.statusCode || 500).send(response);
}