/**
 * A tip for fixing an error.
 */
export interface ApiTip {
  action: 'add-members' | 'upgrade' |'ask-for-help';
  message: string;
}

/**
 * Documentation of a limit relevant to an API error.
 */
export interface ApiLimit {
  quantity: 'collaborators' | 'docs' | 'workspaces';  // what are we counting
  subquantity?: string;    // a nuance to what we are counting
  maximum: number;         // maximum allowed
  value: number;           // current value of quantity for user
  projectedValue: number;  // value of quantity expected if request had been allowed
}

/**
 * Structured details about an API error.
 */
export interface ApiErrorDetails {
  limit?: ApiLimit;

  // If set, this is the more user-friendly message to show to the user than error.message.
  userError?: string;

  // If set, contains suggestions for fixing a problem.
  tips?: ApiTip[];

  memos?: string[];
}

/**
 * An error with an http status code.
 */
export class ApiError extends Error {
  constructor(message: string, public status: number, public details?: ApiErrorDetails) {
    super(message);
  }
}
