// src/errors/MongoErrorHandler.ts

export class MongoHandledError extends Error {
    public statusCode: number;
    public originalError: any;
  
    constructor(error: any) {
      let message = "An unexpected MongoDB error occurred";
      let statusCode = 500;
  
      switch (error.name) {
        case "ValidationError":
          message = "Validation failed";
          statusCode = 400;
          break;
  
        case "CastError":
          message = `Invalid value for '${error.path}': ${error.value}`;
          statusCode = 400;
          break;
  
        case "MongoServerError":
          if (error.code === 11000) {
            const field = Object.keys(error.keyPattern || {})[0];
            message = `Duplicate key error on field '${field}'`;
            statusCode = 409;
          }
          break;
  
        case "MongoError":
          switch (error.code) {
            case 50:
              message = "Exceeded time limit — try again later";
              statusCode = 503;
              break;
            case 11600:
              message = "Operation interrupted — possible replica set issue";
              statusCode = 503;
              break;
            case 121:
              message = "Document validation failed";
              statusCode = 422;
              break;
            case 26:
              message = "Collection not found";
              statusCode = 404;
              break;
            default:
              message = error.message || message;
          }
          break;
      }
  
      super(message);
      this.statusCode = statusCode;
      this.originalError = error;
  
      if (process.env.NODE_ENV === "development") {
        console.error("🧩 Mongo Error Debug Info:");
        console.error("🧬 Name:", error.name);
        console.error("🔢 Code:", error.code);
        console.error("📍 Path:", error.path);
        console.error("🧠 Reason:", error.reason);
        console.error("📜 Stack:", error.stack);
      }
    }
  }
  