export class AppError extends Error {
  public readonly statusCode: number;
  public readonly code: string;
  public readonly metadata?: Record<string, any>;

  constructor(message: string, statusCode = 500, code = "INTERNAL_SERVER_ERROR", metadata?: Record<string, any>) {
    super(message);
    this.name = this.constructor.name;
    this.statusCode = statusCode;
    this.code = code;
    this.metadata = metadata;
    Error.captureStackTrace(this, this.constructor);
  }
}

export class TenantAccessDeniedError extends AppError {
  constructor(message = "Access denied for this tenant shop context", metadata?: Record<string, any>) {
    super(message, 403, "TENANT_ACCESS_DENIED", metadata);
  }
}

export class UnauthorizedError extends AppError {
  constructor(message = "Authentication required", metadata?: Record<string, any>) {
    super(message, 401, "UNAUTHORIZED", metadata);
  }
}

export class ValidationError extends AppError {
  constructor(message = "Invalid input payload", metadata?: Record<string, any>) {
    super(message, 400, "VALIDATION_ERROR", metadata);
  }
}

export class ShopifyAPIError extends AppError {
  constructor(message = "Shopify API operation failed", statusCode = 502, metadata?: Record<string, any>) {
    super(message, statusCode, "SHOPIFY_API_ERROR", metadata);
  }
}

export class RateLimitError extends AppError {
  constructor(message = "Rate limit exceeded. Please try again later.", metadata?: Record<string, any>) {
    super(message, 429, "RATE_LIMIT_EXCEEDED", metadata);
  }
}
