// Copyright 2020 Fastly, Inc.

/**
 * An HTTP Status object.
 */
export class Status {
  /**
   * Status code for the HTTP request or response.
   */
  code: u16;

  /**
   * Construct a new status instance.
   *
   * @param code an unsigned 16 bit integer representing the HTTP Status code.
   */
  constructor(code: u16) {
    this.code = code;
  }

  /**
   * Get the text associated with the status code.
   *
   * Status text(s) come from:
   * https://developer.mozilla.org/en-US/docs/Web/HTTP/Status
   *
   * @returns a string containing the text for the Response status code.
   */
  toString(): string {
    switch (this.code) {
      /* 1XX */
      case 100: {
        return "Continue";
      }
      case 101: {
        return "Switching Protocol";
      }
      case 102: {
        return "Processing";
      }
      case 103: {
        return "Early Hints";
      }

      /* 2XX */
      case 200: {
        return "OK";
      }
      case 201: {
        return "Created";
      }
      case 203: {
        return "Non-Authoritative Information";
      }
      case 204: {
        return "No Content";
      }
      case 205: {
        return "Reset Content";
      }
      case 206: {
        return "Partial Content";
      }
      case 207: {
        return "Multi-Status";
      }
      case 208: {
        return "Already Reported";
      }
      case 226: {
        return "IM Used";
      }

      /* 3XX */
      case 300: {
        return "Multiple Choice";
      }
      case 301: {
        return "Moved Permenantly";
      }
      case 302: {
        return "Found";
      }
      case 303: {
        return "See Other";
      }
      case 304: {
        return "Not Modified";
      }
      case 305: {
        return "Use Proxy";
      }
      case 306: {
        return "Unused";
      }
      case 307: {
        return "Temporary Redirect";
      }
      case 308: {
        return "Permanent Redirect";
      }

      /* 4XX */
      case 400: {
        return "Bad Request";
      }
      case 401: {
        return "Unauthorized";
      }
      case 402: {
        return "Payment Required";
      }
      case 403: {
        return "Forbidden";
      }
      case 404: {
        return "Not Found";
      }
      case 405: {
        return "Method Not Allowed";
      }
      case 406: {
        return "Not Acceptable";
      }
      case 408: {
        return "Request Timeout";
      }
      case 409: {
        return "Conflict";
      }
      case 410: {
        return "Gone";
      }
      case 411: {
        return "Length Required";
      }
      case 412: {
        return "Precondition Failed";
      }
      case 413: {
        return "Payload Too Large";
      }
      case 414: {
        return "URI Too Long";
      }
      case 415: {
        return "Unsupported Media Type";
      }
      case 416: {
        return "Range Not Satisfiable";
      }
      case 417: {
        return "Expectation Failed";
      }
      case 418: {
        return "Im a Teapot";
      }
      case 421: {
        return "Misdirected Request";
      }
      case 422: {
        return "Unprocessable Entity";
      }
      case 423: {
        return "Locked";
      }
      case 424: {
        return "Failed Dependency";
      }
      case 425: {
        return "Too Early";
      }
      case 426: {
        return "Upgrade Required";
      }
      case 428: {
        return "Precondition Required";
      }
      case 429: {
        return "Too Many Requests";
      }
      case 431: {
        return "Request Header Fields Too Large";
      }
      case 451: {
        return "Unavailable For Legal Reasons";
      }

      /* 5XX */
      case 500: {
        return "Internal Server Error";
      }
      case 501: {
        return "Not Implemented";
      }
      case 502: {
        return "Bad Gateway";
      }
      case 503: {
        return "Service Unavailable";
      }
      case 504: {
        return "Gateway Timeout";
      }
      case 505: {
        return "HTTP Version Not Supported";
      }
      case 506: {
        return "Variant Also Negotiates";
      }
      case 507: {
        return "Insufficient Storage";
      }
      case 508: {
        return "Loop Detected";
      }
      case 510: {
        return "Not Extended";
      }
      case 511: {
        return "Network Authentication Required";
      }

      default: {
        return "";
      }
    }
  }
}
