// File generated from our OpenAPI spec by Stainless.

import * as Core from 'cloudflare/core';
import { APIResource } from 'cloudflare/resource';
import * as WaitingRoomsAPI from 'cloudflare/resources/waiting-rooms/waiting-rooms';
import * as PageAPI from 'cloudflare/resources/waiting-rooms/page';
import * as RulesAPI from 'cloudflare/resources/waiting-rooms/rules';
import * as SettingsAPI from 'cloudflare/resources/waiting-rooms/settings';
import * as StatusesAPI from 'cloudflare/resources/waiting-rooms/statuses';
import * as EventsAPI from 'cloudflare/resources/waiting-rooms/events/events';

export class WaitingRooms extends APIResource {
  page: PageAPI.Page = new PageAPI.Page(this._client);
  events: EventsAPI.Events = new EventsAPI.Events(this._client);
  rules: RulesAPI.Rules = new RulesAPI.Rules(this._client);
  statuses: StatusesAPI.Statuses = new StatusesAPI.Statuses(this._client);
  settings: SettingsAPI.Settings = new SettingsAPI.Settings(this._client);

  /**
   * Creates a new waiting room.
   */
  create(
    zoneIdentifier: string,
    body: WaitingRoomCreateParams,
    options?: Core.RequestOptions,
  ): Core.APIPromise<WaitingroomWaitingroom> {
    return (
      this._client.post(`/zones/${zoneIdentifier}/waiting_rooms`, { body, ...options }) as Core.APIPromise<{
        result: WaitingroomWaitingroom;
      }>
    )._thenUnwrap((obj) => obj.result);
  }

  /**
   * Updates a configured waiting room.
   */
  update(
    zoneIdentifier: string,
    waitingRoomId: unknown,
    body: WaitingRoomUpdateParams,
    options?: Core.RequestOptions,
  ): Core.APIPromise<WaitingroomWaitingroom> {
    return (
      this._client.put(`/zones/${zoneIdentifier}/waiting_rooms/${waitingRoomId}`, {
        body,
        ...options,
      }) as Core.APIPromise<{ result: WaitingroomWaitingroom }>
    )._thenUnwrap((obj) => obj.result);
  }

  /**
   * Lists waiting rooms.
   */
  list(
    zoneIdentifier: string,
    options?: Core.RequestOptions,
  ): Core.APIPromise<WaitingRoomListResponse | null> {
    return (
      this._client.get(`/zones/${zoneIdentifier}/waiting_rooms`, options) as Core.APIPromise<{
        result: WaitingRoomListResponse | null;
      }>
    )._thenUnwrap((obj) => obj.result);
  }

  /**
   * Deletes a waiting room.
   */
  delete(
    zoneIdentifier: string,
    waitingRoomId: unknown,
    options?: Core.RequestOptions,
  ): Core.APIPromise<WaitingRoomDeleteResponse> {
    return (
      this._client.delete(
        `/zones/${zoneIdentifier}/waiting_rooms/${waitingRoomId}`,
        options,
      ) as Core.APIPromise<{ result: WaitingRoomDeleteResponse }>
    )._thenUnwrap((obj) => obj.result);
  }

  /**
   * Patches a configured waiting room.
   */
  edit(
    zoneIdentifier: string,
    waitingRoomId: unknown,
    body: WaitingRoomEditParams,
    options?: Core.RequestOptions,
  ): Core.APIPromise<WaitingroomWaitingroom> {
    return (
      this._client.patch(`/zones/${zoneIdentifier}/waiting_rooms/${waitingRoomId}`, {
        body,
        ...options,
      }) as Core.APIPromise<{ result: WaitingroomWaitingroom }>
    )._thenUnwrap((obj) => obj.result);
  }

  /**
   * Fetches a single configured waiting room.
   */
  get(
    zoneIdentifier: string,
    waitingRoomId: unknown,
    options?: Core.RequestOptions,
  ): Core.APIPromise<WaitingroomWaitingroom> {
    return (
      this._client.get(
        `/zones/${zoneIdentifier}/waiting_rooms/${waitingRoomId}`,
        options,
      ) as Core.APIPromise<{ result: WaitingroomWaitingroom }>
    )._thenUnwrap((obj) => obj.result);
  }
}

export interface WaitingroomWaitingroom {
  id?: unknown;

  /**
   * Only available for the Waiting Room Advanced subscription. Additional hostname
   * and path combinations to which this waiting room will be applied. There is an
   * implied wildcard at the end of the path. The hostname and path combination must
   * be unique to this and all other waiting rooms.
   */
  additional_routes?: Array<WaitingroomWaitingroom.AdditionalRoute>;

  /**
   * Configures cookie attributes for the waiting room cookie. This encrypted cookie
   * stores a user's status in the waiting room, such as queue position.
   */
  cookie_attributes?: WaitingroomWaitingroom.CookieAttributes;

  /**
   * Appends a '\_' + a custom suffix to the end of Cloudflare Waiting Room's cookie
   * name(**cf_waitingroom). If `cookie_suffix` is "abcd", the cookie name will be
   * `**cf_waitingroom_abcd`. This field is required if using `additional_routes`.
   */
  cookie_suffix?: string;

  created_on?: string;

  /**
   * Only available for the Waiting Room Advanced subscription. This is a template
   * html file that will be rendered at the edge. If no custom_page_html is provided,
   * the default waiting room will be used. The template is based on mustache (
   * https://mustache.github.io/ ). There are several variables that are evaluated by
   * the Cloudflare edge:
   *
   * 1. {{`waitTimeKnown`}} Acts like a boolean value that indicates the behavior to
   *    take when wait time is not available, for instance when queue_all is
   *    **true**.
   * 2. {{`waitTimeFormatted`}} Estimated wait time for the user. For example, five
   *    minutes. Alternatively, you can use:
   * 3. {{`waitTime`}} Number of minutes of estimated wait for a user.
   * 4. {{`waitTimeHours`}} Number of hours of estimated wait for a user
   *    (`Math.floor(waitTime/60)`).
   * 5. {{`waitTimeHourMinutes`}} Number of minutes above the `waitTimeHours` value
   *    (`waitTime%60`).
   * 6. {{`queueIsFull`}} Changes to **true** when no more people can be added to the
   *    queue.
   *
   * To view the full list of variables, look at the `cfWaitingRoom` object described
   * under the `json_response_enabled` property in other Waiting Room API calls.
   */
  custom_page_html?: string;

  /**
   * The language of the default page template. If no default_template_language is
   * provided, then `en-US` (English) will be used.
   */
  default_template_language?:
    | 'en-US'
    | 'es-ES'
    | 'de-DE'
    | 'fr-FR'
    | 'it-IT'
    | 'ja-JP'
    | 'ko-KR'
    | 'pt-BR'
    | 'zh-CN'
    | 'zh-TW'
    | 'nl-NL'
    | 'pl-PL'
    | 'id-ID'
    | 'tr-TR'
    | 'ar-EG'
    | 'ru-RU'
    | 'fa-IR';

  /**
   * A note that you can use to add more details about the waiting room.
   */
  description?: string;

  /**
   * Only available for the Waiting Room Advanced subscription. Disables automatic
   * renewal of session cookies. If `true`, an accepted user will have
   * session_duration minutes to browse the site. After that, they will have to go
   * through the waiting room again. If `false`, a user's session cookie will be
   * automatically renewed on every request.
   */
  disable_session_renewal?: boolean;

  /**
   * The host name to which the waiting room will be applied (no wildcards). Please
   * do not include the scheme (http:// or https://). The host and path combination
   * must be unique.
   */
  host?: string;

  /**
   * Only available for the Waiting Room Advanced subscription. If `true`, requests
   * to the waiting room with the header `Accept: application/json` will receive a
   * JSON response object with information on the user's status in the waiting room
   * as opposed to the configured static HTML page. This JSON response object has one
   * property `cfWaitingRoom` which is an object containing the following fields:
   *
   * 1. `inWaitingRoom`: Boolean indicating if the user is in the waiting room
   *    (always **true**).
   * 2. `waitTimeKnown`: Boolean indicating if the current estimated wait times are
   *    accurate. If **false**, they are not available.
   * 3. `waitTime`: Valid only when `waitTimeKnown` is **true**. Integer indicating
   *    the current estimated time in minutes the user will wait in the waiting room.
   *    When `queueingMethod` is **random**, this is set to `waitTime50Percentile`.
   * 4. `waitTime25Percentile`: Valid only when `queueingMethod` is **random** and
   *    `waitTimeKnown` is **true**. Integer indicating the current estimated maximum
   *    wait time for the 25% of users that gain entry the fastest (25th percentile).
   * 5. `waitTime50Percentile`: Valid only when `queueingMethod` is **random** and
   *    `waitTimeKnown` is **true**. Integer indicating the current estimated maximum
   *    wait time for the 50% of users that gain entry the fastest (50th percentile).
   *    In other words, half of the queued users are expected to let into the origin
   *    website before `waitTime50Percentile` and half are expected to be let in
   *    after it.
   * 6. `waitTime75Percentile`: Valid only when `queueingMethod` is **random** and
   *    `waitTimeKnown` is **true**. Integer indicating the current estimated maximum
   *    wait time for the 75% of users that gain entry the fastest (75th percentile).
   * 7. `waitTimeFormatted`: String displaying the `waitTime` formatted in English
   *    for users. If `waitTimeKnown` is **false**, `waitTimeFormatted` will display
   *    **unavailable**.
   * 8. `queueIsFull`: Boolean indicating if the waiting room's queue is currently
   *    full and not accepting new users at the moment.
   * 9. `queueAll`: Boolean indicating if all users will be queued in the waiting
   *    room and no one will be let into the origin website.
   * 10. `lastUpdated`: String displaying the timestamp as an ISO 8601 string of the
   *     user's last attempt to leave the waiting room and be let into the origin
   *     website. The user is able to make another attempt after
   *     `refreshIntervalSeconds` past this time. If the user makes a request too
   *     soon, it will be ignored and `lastUpdated` will not change.
   * 11. `refreshIntervalSeconds`: Integer indicating the number of seconds after
   *     `lastUpdated` until the user is able to make another attempt to leave the
   *     waiting room and be let into the origin website. When the `queueingMethod`
   *     is `reject`, there is no specified refresh time — it will always be
   *     **zero**.
   * 12. `queueingMethod`: The queueing method currently used by the waiting room. It
   *     is either **fifo**, **random**, **passthrough**, or **reject**.
   * 13. `isFIFOQueue`: Boolean indicating if the waiting room uses a FIFO
   *     (First-In-First-Out) queue.
   * 14. `isRandomQueue`: Boolean indicating if the waiting room uses a Random queue
   *     where users gain access randomly.
   * 15. `isPassthroughQueue`: Boolean indicating if the waiting room uses a
   *     passthrough queue. Keep in mind that when passthrough is enabled, this JSON
   *     response will only exist when `queueAll` is **true** or `isEventPrequeueing`
   *     is **true** because in all other cases requests will go directly to the
   *     origin.
   * 16. `isRejectQueue`: Boolean indicating if the waiting room uses a reject queue.
   * 17. `isEventActive`: Boolean indicating if an event is currently occurring.
   *     Events are able to change a waiting room's behavior during a specified
   *     period of time. For additional information, look at the event properties
   *     `prequeue_start_time`, `event_start_time`, and `event_end_time` in the
   *     documentation for creating waiting room events. Events are considered active
   *     between these start and end times, as well as during the prequeueing period
   *     if it exists.
   * 18. `isEventPrequeueing`: Valid only when `isEventActive` is **true**. Boolean
   *     indicating if an event is currently prequeueing users before it starts.
   * 19. `timeUntilEventStart`: Valid only when `isEventPrequeueing` is **true**.
   *     Integer indicating the number of minutes until the event starts.
   * 20. `timeUntilEventStartFormatted`: String displaying the `timeUntilEventStart`
   *     formatted in English for users. If `isEventPrequeueing` is **false**,
   *     `timeUntilEventStartFormatted` will display **unavailable**.
   * 21. `timeUntilEventEnd`: Valid only when `isEventActive` is **true**. Integer
   *     indicating the number of minutes until the event ends.
   * 22. `timeUntilEventEndFormatted`: String displaying the `timeUntilEventEnd`
   *     formatted in English for users. If `isEventActive` is **false**,
   *     `timeUntilEventEndFormatted` will display **unavailable**.
   * 23. `shuffleAtEventStart`: Valid only when `isEventActive` is **true**. Boolean
   *     indicating if the users in the prequeue are shuffled randomly when the event
   *     starts.
   *
   * An example cURL to a waiting room could be:
   *
   *     curl -X GET "https://example.com/waitingroom" \
   *     	-H "Accept: application/json"
   *
   * If `json_response_enabled` is **true** and the request hits the waiting room, an
   * example JSON response when `queueingMethod` is **fifo** and no event is active
   * could be:
   *
   *     {
   *     	"cfWaitingRoom": {
   *     		"inWaitingRoom": true,
   *     		"waitTimeKnown": true,
   *     		"waitTime": 10,
   *     		"waitTime25Percentile": 0,
   *     		"waitTime50Percentile": 0,
   *     		"waitTime75Percentile": 0,
   *     		"waitTimeFormatted": "10 minutes",
   *     		"queueIsFull": false,
   *     		"queueAll": false,
   *     		"lastUpdated": "2020-08-03T23:46:00.000Z",
   *     		"refreshIntervalSeconds": 20,
   *     		"queueingMethod": "fifo",
   *     		"isFIFOQueue": true,
   *     		"isRandomQueue": false,
   *     		"isPassthroughQueue": false,
   *     		"isRejectQueue": false,
   *     		"isEventActive": false,
   *     		"isEventPrequeueing": false,
   *     		"timeUntilEventStart": 0,
   *     		"timeUntilEventStartFormatted": "unavailable",
   *     		"timeUntilEventEnd": 0,
   *     		"timeUntilEventEndFormatted": "unavailable",
   *     		"shuffleAtEventStart": false
   *     	}
   *     }
   *
   * If `json_response_enabled` is **true** and the request hits the waiting room, an
   * example JSON response when `queueingMethod` is **random** and an event is active
   * could be:
   *
   *     {
   *     	"cfWaitingRoom": {
   *     		"inWaitingRoom": true,
   *     		"waitTimeKnown": true,
   *     		"waitTime": 10,
   *     		"waitTime25Percentile": 5,
   *     		"waitTime50Percentile": 10,
   *     		"waitTime75Percentile": 15,
   *     		"waitTimeFormatted": "5 minutes to 15 minutes",
   *     		"queueIsFull": false,
   *     		"queueAll": false,
   *     		"lastUpdated": "2020-08-03T23:46:00.000Z",
   *     		"refreshIntervalSeconds": 20,
   *     		"queueingMethod": "random",
   *     		"isFIFOQueue": false,
   *     		"isRandomQueue": true,
   *     		"isPassthroughQueue": false,
   *     		"isRejectQueue": false,
   *     		"isEventActive": true,
   *     		"isEventPrequeueing": false,
   *     		"timeUntilEventStart": 0,
   *     		"timeUntilEventStartFormatted": "unavailable",
   *     		"timeUntilEventEnd": 15,
   *     		"timeUntilEventEndFormatted": "15 minutes",
   *     		"shuffleAtEventStart": true
   *     	}
   *     }.
   */
  json_response_enabled?: boolean;

  modified_on?: string;

  /**
   * A unique name to identify the waiting room. Only alphanumeric characters,
   * hyphens and underscores are allowed.
   */
  name?: string;

  /**
   * Sets the number of new users that will be let into the route every minute. This
   * value is used as baseline for the number of users that are let in per minute. So
   * it is possible that there is a little more or little less traffic coming to the
   * route based on the traffic patterns at that time around the world.
   */
  new_users_per_minute?: number;

  /**
   * An ISO 8601 timestamp that marks when the next event will begin queueing.
   */
  next_event_prequeue_start_time?: string | null;

  /**
   * An ISO 8601 timestamp that marks when the next event will start.
   */
  next_event_start_time?: string | null;

  /**
   * Sets the path within the host to enable the waiting room on. The waiting room
   * will be enabled for all subpaths as well. If there are two waiting rooms on the
   * same subpath, the waiting room for the most specific path will be chosen.
   * Wildcards and query parameters are not supported.
   */
  path?: string;

  /**
   * If queue_all is `true`, all the traffic that is coming to a route will be sent
   * to the waiting room. No new traffic can get to the route once this field is set
   * and estimated time will become unavailable.
   */
  queue_all?: boolean;

  /**
   * Sets the queueing method used by the waiting room. Changing this parameter from
   * the **default** queueing method is only available for the Waiting Room Advanced
   * subscription. Regardless of the queueing method, if `queue_all` is enabled or an
   * event is prequeueing, users in the waiting room will not be accepted to the
   * origin. These users will always see a waiting room page that refreshes
   * automatically. The valid queueing methods are:
   *
   * 1. `fifo` **(default)**: First-In-First-Out queue where customers gain access in
   *    the order they arrived.
   * 2. `random`: Random queue where customers gain access randomly, regardless of
   *    arrival time.
   * 3. `passthrough`: Users will pass directly through the waiting room and into the
   *    origin website. As a result, any configured limits will not be respected
   *    while this is enabled. This method can be used as an alternative to disabling
   *    a waiting room (with `suspended`) so that analytics are still reported. This
   *    can be used if you wish to allow all traffic normally, but want to restrict
   *    traffic during a waiting room event, or vice versa.
   * 4. `reject`: Users will be immediately rejected from the waiting room. As a
   *    result, no users will reach the origin website while this is enabled. This
   *    can be used if you wish to reject all traffic while performing maintenance,
   *    block traffic during a specified period of time (an event), or block traffic
   *    while events are not occurring. Consider a waiting room used for vaccine
   *    distribution that only allows traffic during sign-up events, and otherwise
   *    blocks all traffic. For this case, the waiting room uses `reject`, and its
   *    events override this with `fifo`, `random`, or `passthrough`. When this
   *    queueing method is enabled and neither `queueAll` is enabled nor an event is
   *    prequeueing, the waiting room page **will not refresh automatically**.
   */
  queueing_method?: 'fifo' | 'random' | 'passthrough' | 'reject';

  /**
   * HTTP status code returned to a user while in the queue.
   */
  queueing_status_code?: 200 | 202 | 429;

  /**
   * Lifetime of a cookie (in minutes) set by Cloudflare for users who get access to
   * the route. If a user is not seen by Cloudflare again in that time period, they
   * will be treated as a new user that visits the route.
   */
  session_duration?: number;

  /**
   * Suspends or allows traffic going to the waiting room. If set to `true`, the
   * traffic will not go to the waiting room.
   */
  suspended?: boolean;

  /**
   * Sets the total number of active user sessions on the route at a point in time. A
   * route is a combination of host and path on which a waiting room is available.
   * This value is used as a baseline for the total number of active user sessions on
   * the route. It is possible to have a situation where there are more or less
   * active users sessions on the route based on the traffic patterns at that time
   * around the world.
   */
  total_active_users?: number;
}

export namespace WaitingroomWaitingroom {
  export interface AdditionalRoute {
    /**
     * The hostname to which this waiting room will be applied (no wildcards). The
     * hostname must be the primary domain, subdomain, or custom hostname (if using SSL
     * for SaaS) of this zone. Please do not include the scheme (http:// or https://).
     */
    host?: string;

    /**
     * Sets the path within the host to enable the waiting room on. The waiting room
     * will be enabled for all subpaths as well. If there are two waiting rooms on the
     * same subpath, the waiting room for the most specific path will be chosen.
     * Wildcards and query parameters are not supported.
     */
    path?: string;
  }

  /**
   * Configures cookie attributes for the waiting room cookie. This encrypted cookie
   * stores a user's status in the waiting room, such as queue position.
   */
  export interface CookieAttributes {
    /**
     * Configures the SameSite attribute on the waiting room cookie. Value `auto` will
     * be translated to `lax` or `none` depending if **Always Use HTTPS** is enabled.
     * Note that when using value `none`, the secure attribute cannot be set to
     * `never`.
     */
    samesite?: 'auto' | 'lax' | 'none' | 'strict';

    /**
     * Configures the Secure attribute on the waiting room cookie. Value `always`
     * indicates that the Secure attribute will be set in the Set-Cookie header,
     * `never` indicates that the Secure attribute will not be set, and `auto` will set
     * the Secure attribute depending if **Always Use HTTPS** is enabled.
     */
    secure?: 'auto' | 'always' | 'never';
  }
}

export type WaitingRoomListResponse = Array<WaitingroomWaitingroom>;

export interface WaitingRoomDeleteResponse {
  id?: unknown;
}

export interface WaitingRoomCreateParams {
  /**
   * The host name to which the waiting room will be applied (no wildcards). Please
   * do not include the scheme (http:// or https://). The host and path combination
   * must be unique.
   */
  host: string;

  /**
   * A unique name to identify the waiting room. Only alphanumeric characters,
   * hyphens and underscores are allowed.
   */
  name: string;

  /**
   * Sets the number of new users that will be let into the route every minute. This
   * value is used as baseline for the number of users that are let in per minute. So
   * it is possible that there is a little more or little less traffic coming to the
   * route based on the traffic patterns at that time around the world.
   */
  new_users_per_minute: number;

  /**
   * Sets the total number of active user sessions on the route at a point in time. A
   * route is a combination of host and path on which a waiting room is available.
   * This value is used as a baseline for the total number of active user sessions on
   * the route. It is possible to have a situation where there are more or less
   * active users sessions on the route based on the traffic patterns at that time
   * around the world.
   */
  total_active_users: number;

  /**
   * Only available for the Waiting Room Advanced subscription. Additional hostname
   * and path combinations to which this waiting room will be applied. There is an
   * implied wildcard at the end of the path. The hostname and path combination must
   * be unique to this and all other waiting rooms.
   */
  additional_routes?: Array<WaitingRoomCreateParams.AdditionalRoute>;

  /**
   * Configures cookie attributes for the waiting room cookie. This encrypted cookie
   * stores a user's status in the waiting room, such as queue position.
   */
  cookie_attributes?: WaitingRoomCreateParams.CookieAttributes;

  /**
   * Appends a '\_' + a custom suffix to the end of Cloudflare Waiting Room's cookie
   * name(**cf_waitingroom). If `cookie_suffix` is "abcd", the cookie name will be
   * `**cf_waitingroom_abcd`. This field is required if using `additional_routes`.
   */
  cookie_suffix?: string;

  /**
   * Only available for the Waiting Room Advanced subscription. This is a template
   * html file that will be rendered at the edge. If no custom_page_html is provided,
   * the default waiting room will be used. The template is based on mustache (
   * https://mustache.github.io/ ). There are several variables that are evaluated by
   * the Cloudflare edge:
   *
   * 1. {{`waitTimeKnown`}} Acts like a boolean value that indicates the behavior to
   *    take when wait time is not available, for instance when queue_all is
   *    **true**.
   * 2. {{`waitTimeFormatted`}} Estimated wait time for the user. For example, five
   *    minutes. Alternatively, you can use:
   * 3. {{`waitTime`}} Number of minutes of estimated wait for a user.
   * 4. {{`waitTimeHours`}} Number of hours of estimated wait for a user
   *    (`Math.floor(waitTime/60)`).
   * 5. {{`waitTimeHourMinutes`}} Number of minutes above the `waitTimeHours` value
   *    (`waitTime%60`).
   * 6. {{`queueIsFull`}} Changes to **true** when no more people can be added to the
   *    queue.
   *
   * To view the full list of variables, look at the `cfWaitingRoom` object described
   * under the `json_response_enabled` property in other Waiting Room API calls.
   */
  custom_page_html?: string;

  /**
   * The language of the default page template. If no default_template_language is
   * provided, then `en-US` (English) will be used.
   */
  default_template_language?:
    | 'en-US'
    | 'es-ES'
    | 'de-DE'
    | 'fr-FR'
    | 'it-IT'
    | 'ja-JP'
    | 'ko-KR'
    | 'pt-BR'
    | 'zh-CN'
    | 'zh-TW'
    | 'nl-NL'
    | 'pl-PL'
    | 'id-ID'
    | 'tr-TR'
    | 'ar-EG'
    | 'ru-RU'
    | 'fa-IR';

  /**
   * A note that you can use to add more details about the waiting room.
   */
  description?: string;

  /**
   * Only available for the Waiting Room Advanced subscription. Disables automatic
   * renewal of session cookies. If `true`, an accepted user will have
   * session_duration minutes to browse the site. After that, they will have to go
   * through the waiting room again. If `false`, a user's session cookie will be
   * automatically renewed on every request.
   */
  disable_session_renewal?: boolean;

  /**
   * Only available for the Waiting Room Advanced subscription. If `true`, requests
   * to the waiting room with the header `Accept: application/json` will receive a
   * JSON response object with information on the user's status in the waiting room
   * as opposed to the configured static HTML page. This JSON response object has one
   * property `cfWaitingRoom` which is an object containing the following fields:
   *
   * 1. `inWaitingRoom`: Boolean indicating if the user is in the waiting room
   *    (always **true**).
   * 2. `waitTimeKnown`: Boolean indicating if the current estimated wait times are
   *    accurate. If **false**, they are not available.
   * 3. `waitTime`: Valid only when `waitTimeKnown` is **true**. Integer indicating
   *    the current estimated time in minutes the user will wait in the waiting room.
   *    When `queueingMethod` is **random**, this is set to `waitTime50Percentile`.
   * 4. `waitTime25Percentile`: Valid only when `queueingMethod` is **random** and
   *    `waitTimeKnown` is **true**. Integer indicating the current estimated maximum
   *    wait time for the 25% of users that gain entry the fastest (25th percentile).
   * 5. `waitTime50Percentile`: Valid only when `queueingMethod` is **random** and
   *    `waitTimeKnown` is **true**. Integer indicating the current estimated maximum
   *    wait time for the 50% of users that gain entry the fastest (50th percentile).
   *    In other words, half of the queued users are expected to let into the origin
   *    website before `waitTime50Percentile` and half are expected to be let in
   *    after it.
   * 6. `waitTime75Percentile`: Valid only when `queueingMethod` is **random** and
   *    `waitTimeKnown` is **true**. Integer indicating the current estimated maximum
   *    wait time for the 75% of users that gain entry the fastest (75th percentile).
   * 7. `waitTimeFormatted`: String displaying the `waitTime` formatted in English
   *    for users. If `waitTimeKnown` is **false**, `waitTimeFormatted` will display
   *    **unavailable**.
   * 8. `queueIsFull`: Boolean indicating if the waiting room's queue is currently
   *    full and not accepting new users at the moment.
   * 9. `queueAll`: Boolean indicating if all users will be queued in the waiting
   *    room and no one will be let into the origin website.
   * 10. `lastUpdated`: String displaying the timestamp as an ISO 8601 string of the
   *     user's last attempt to leave the waiting room and be let into the origin
   *     website. The user is able to make another attempt after
   *     `refreshIntervalSeconds` past this time. If the user makes a request too
   *     soon, it will be ignored and `lastUpdated` will not change.
   * 11. `refreshIntervalSeconds`: Integer indicating the number of seconds after
   *     `lastUpdated` until the user is able to make another attempt to leave the
   *     waiting room and be let into the origin website. When the `queueingMethod`
   *     is `reject`, there is no specified refresh time — it will always be
   *     **zero**.
   * 12. `queueingMethod`: The queueing method currently used by the waiting room. It
   *     is either **fifo**, **random**, **passthrough**, or **reject**.
   * 13. `isFIFOQueue`: Boolean indicating if the waiting room uses a FIFO
   *     (First-In-First-Out) queue.
   * 14. `isRandomQueue`: Boolean indicating if the waiting room uses a Random queue
   *     where users gain access randomly.
   * 15. `isPassthroughQueue`: Boolean indicating if the waiting room uses a
   *     passthrough queue. Keep in mind that when passthrough is enabled, this JSON
   *     response will only exist when `queueAll` is **true** or `isEventPrequeueing`
   *     is **true** because in all other cases requests will go directly to the
   *     origin.
   * 16. `isRejectQueue`: Boolean indicating if the waiting room uses a reject queue.
   * 17. `isEventActive`: Boolean indicating if an event is currently occurring.
   *     Events are able to change a waiting room's behavior during a specified
   *     period of time. For additional information, look at the event properties
   *     `prequeue_start_time`, `event_start_time`, and `event_end_time` in the
   *     documentation for creating waiting room events. Events are considered active
   *     between these start and end times, as well as during the prequeueing period
   *     if it exists.
   * 18. `isEventPrequeueing`: Valid only when `isEventActive` is **true**. Boolean
   *     indicating if an event is currently prequeueing users before it starts.
   * 19. `timeUntilEventStart`: Valid only when `isEventPrequeueing` is **true**.
   *     Integer indicating the number of minutes until the event starts.
   * 20. `timeUntilEventStartFormatted`: String displaying the `timeUntilEventStart`
   *     formatted in English for users. If `isEventPrequeueing` is **false**,
   *     `timeUntilEventStartFormatted` will display **unavailable**.
   * 21. `timeUntilEventEnd`: Valid only when `isEventActive` is **true**. Integer
   *     indicating the number of minutes until the event ends.
   * 22. `timeUntilEventEndFormatted`: String displaying the `timeUntilEventEnd`
   *     formatted in English for users. If `isEventActive` is **false**,
   *     `timeUntilEventEndFormatted` will display **unavailable**.
   * 23. `shuffleAtEventStart`: Valid only when `isEventActive` is **true**. Boolean
   *     indicating if the users in the prequeue are shuffled randomly when the event
   *     starts.
   *
   * An example cURL to a waiting room could be:
   *
   *     curl -X GET "https://example.com/waitingroom" \
   *     	-H "Accept: application/json"
   *
   * If `json_response_enabled` is **true** and the request hits the waiting room, an
   * example JSON response when `queueingMethod` is **fifo** and no event is active
   * could be:
   *
   *     {
   *     	"cfWaitingRoom": {
   *     		"inWaitingRoom": true,
   *     		"waitTimeKnown": true,
   *     		"waitTime": 10,
   *     		"waitTime25Percentile": 0,
   *     		"waitTime50Percentile": 0,
   *     		"waitTime75Percentile": 0,
   *     		"waitTimeFormatted": "10 minutes",
   *     		"queueIsFull": false,
   *     		"queueAll": false,
   *     		"lastUpdated": "2020-08-03T23:46:00.000Z",
   *     		"refreshIntervalSeconds": 20,
   *     		"queueingMethod": "fifo",
   *     		"isFIFOQueue": true,
   *     		"isRandomQueue": false,
   *     		"isPassthroughQueue": false,
   *     		"isRejectQueue": false,
   *     		"isEventActive": false,
   *     		"isEventPrequeueing": false,
   *     		"timeUntilEventStart": 0,
   *     		"timeUntilEventStartFormatted": "unavailable",
   *     		"timeUntilEventEnd": 0,
   *     		"timeUntilEventEndFormatted": "unavailable",
   *     		"shuffleAtEventStart": false
   *     	}
   *     }
   *
   * If `json_response_enabled` is **true** and the request hits the waiting room, an
   * example JSON response when `queueingMethod` is **random** and an event is active
   * could be:
   *
   *     {
   *     	"cfWaitingRoom": {
   *     		"inWaitingRoom": true,
   *     		"waitTimeKnown": true,
   *     		"waitTime": 10,
   *     		"waitTime25Percentile": 5,
   *     		"waitTime50Percentile": 10,
   *     		"waitTime75Percentile": 15,
   *     		"waitTimeFormatted": "5 minutes to 15 minutes",
   *     		"queueIsFull": false,
   *     		"queueAll": false,
   *     		"lastUpdated": "2020-08-03T23:46:00.000Z",
   *     		"refreshIntervalSeconds": 20,
   *     		"queueingMethod": "random",
   *     		"isFIFOQueue": false,
   *     		"isRandomQueue": true,
   *     		"isPassthroughQueue": false,
   *     		"isRejectQueue": false,
   *     		"isEventActive": true,
   *     		"isEventPrequeueing": false,
   *     		"timeUntilEventStart": 0,
   *     		"timeUntilEventStartFormatted": "unavailable",
   *     		"timeUntilEventEnd": 15,
   *     		"timeUntilEventEndFormatted": "15 minutes",
   *     		"shuffleAtEventStart": true
   *     	}
   *     }.
   */
  json_response_enabled?: boolean;

  /**
   * Sets the path within the host to enable the waiting room on. The waiting room
   * will be enabled for all subpaths as well. If there are two waiting rooms on the
   * same subpath, the waiting room for the most specific path will be chosen.
   * Wildcards and query parameters are not supported.
   */
  path?: string;

  /**
   * If queue_all is `true`, all the traffic that is coming to a route will be sent
   * to the waiting room. No new traffic can get to the route once this field is set
   * and estimated time will become unavailable.
   */
  queue_all?: boolean;

  /**
   * Sets the queueing method used by the waiting room. Changing this parameter from
   * the **default** queueing method is only available for the Waiting Room Advanced
   * subscription. Regardless of the queueing method, if `queue_all` is enabled or an
   * event is prequeueing, users in the waiting room will not be accepted to the
   * origin. These users will always see a waiting room page that refreshes
   * automatically. The valid queueing methods are:
   *
   * 1. `fifo` **(default)**: First-In-First-Out queue where customers gain access in
   *    the order they arrived.
   * 2. `random`: Random queue where customers gain access randomly, regardless of
   *    arrival time.
   * 3. `passthrough`: Users will pass directly through the waiting room and into the
   *    origin website. As a result, any configured limits will not be respected
   *    while this is enabled. This method can be used as an alternative to disabling
   *    a waiting room (with `suspended`) so that analytics are still reported. This
   *    can be used if you wish to allow all traffic normally, but want to restrict
   *    traffic during a waiting room event, or vice versa.
   * 4. `reject`: Users will be immediately rejected from the waiting room. As a
   *    result, no users will reach the origin website while this is enabled. This
   *    can be used if you wish to reject all traffic while performing maintenance,
   *    block traffic during a specified period of time (an event), or block traffic
   *    while events are not occurring. Consider a waiting room used for vaccine
   *    distribution that only allows traffic during sign-up events, and otherwise
   *    blocks all traffic. For this case, the waiting room uses `reject`, and its
   *    events override this with `fifo`, `random`, or `passthrough`. When this
   *    queueing method is enabled and neither `queueAll` is enabled nor an event is
   *    prequeueing, the waiting room page **will not refresh automatically**.
   */
  queueing_method?: 'fifo' | 'random' | 'passthrough' | 'reject';

  /**
   * HTTP status code returned to a user while in the queue.
   */
  queueing_status_code?: 200 | 202 | 429;

  /**
   * Lifetime of a cookie (in minutes) set by Cloudflare for users who get access to
   * the route. If a user is not seen by Cloudflare again in that time period, they
   * will be treated as a new user that visits the route.
   */
  session_duration?: number;

  /**
   * Suspends or allows traffic going to the waiting room. If set to `true`, the
   * traffic will not go to the waiting room.
   */
  suspended?: boolean;
}

export namespace WaitingRoomCreateParams {
  export interface AdditionalRoute {
    /**
     * The hostname to which this waiting room will be applied (no wildcards). The
     * hostname must be the primary domain, subdomain, or custom hostname (if using SSL
     * for SaaS) of this zone. Please do not include the scheme (http:// or https://).
     */
    host?: string;

    /**
     * Sets the path within the host to enable the waiting room on. The waiting room
     * will be enabled for all subpaths as well. If there are two waiting rooms on the
     * same subpath, the waiting room for the most specific path will be chosen.
     * Wildcards and query parameters are not supported.
     */
    path?: string;
  }

  /**
   * Configures cookie attributes for the waiting room cookie. This encrypted cookie
   * stores a user's status in the waiting room, such as queue position.
   */
  export interface CookieAttributes {
    /**
     * Configures the SameSite attribute on the waiting room cookie. Value `auto` will
     * be translated to `lax` or `none` depending if **Always Use HTTPS** is enabled.
     * Note that when using value `none`, the secure attribute cannot be set to
     * `never`.
     */
    samesite?: 'auto' | 'lax' | 'none' | 'strict';

    /**
     * Configures the Secure attribute on the waiting room cookie. Value `always`
     * indicates that the Secure attribute will be set in the Set-Cookie header,
     * `never` indicates that the Secure attribute will not be set, and `auto` will set
     * the Secure attribute depending if **Always Use HTTPS** is enabled.
     */
    secure?: 'auto' | 'always' | 'never';
  }
}

export interface WaitingRoomUpdateParams {
  /**
   * The host name to which the waiting room will be applied (no wildcards). Please
   * do not include the scheme (http:// or https://). The host and path combination
   * must be unique.
   */
  host: string;

  /**
   * A unique name to identify the waiting room. Only alphanumeric characters,
   * hyphens and underscores are allowed.
   */
  name: string;

  /**
   * Sets the number of new users that will be let into the route every minute. This
   * value is used as baseline for the number of users that are let in per minute. So
   * it is possible that there is a little more or little less traffic coming to the
   * route based on the traffic patterns at that time around the world.
   */
  new_users_per_minute: number;

  /**
   * Sets the total number of active user sessions on the route at a point in time. A
   * route is a combination of host and path on which a waiting room is available.
   * This value is used as a baseline for the total number of active user sessions on
   * the route. It is possible to have a situation where there are more or less
   * active users sessions on the route based on the traffic patterns at that time
   * around the world.
   */
  total_active_users: number;

  /**
   * Only available for the Waiting Room Advanced subscription. Additional hostname
   * and path combinations to which this waiting room will be applied. There is an
   * implied wildcard at the end of the path. The hostname and path combination must
   * be unique to this and all other waiting rooms.
   */
  additional_routes?: Array<WaitingRoomUpdateParams.AdditionalRoute>;

  /**
   * Configures cookie attributes for the waiting room cookie. This encrypted cookie
   * stores a user's status in the waiting room, such as queue position.
   */
  cookie_attributes?: WaitingRoomUpdateParams.CookieAttributes;

  /**
   * Appends a '\_' + a custom suffix to the end of Cloudflare Waiting Room's cookie
   * name(**cf_waitingroom). If `cookie_suffix` is "abcd", the cookie name will be
   * `**cf_waitingroom_abcd`. This field is required if using `additional_routes`.
   */
  cookie_suffix?: string;

  /**
   * Only available for the Waiting Room Advanced subscription. This is a template
   * html file that will be rendered at the edge. If no custom_page_html is provided,
   * the default waiting room will be used. The template is based on mustache (
   * https://mustache.github.io/ ). There are several variables that are evaluated by
   * the Cloudflare edge:
   *
   * 1. {{`waitTimeKnown`}} Acts like a boolean value that indicates the behavior to
   *    take when wait time is not available, for instance when queue_all is
   *    **true**.
   * 2. {{`waitTimeFormatted`}} Estimated wait time for the user. For example, five
   *    minutes. Alternatively, you can use:
   * 3. {{`waitTime`}} Number of minutes of estimated wait for a user.
   * 4. {{`waitTimeHours`}} Number of hours of estimated wait for a user
   *    (`Math.floor(waitTime/60)`).
   * 5. {{`waitTimeHourMinutes`}} Number of minutes above the `waitTimeHours` value
   *    (`waitTime%60`).
   * 6. {{`queueIsFull`}} Changes to **true** when no more people can be added to the
   *    queue.
   *
   * To view the full list of variables, look at the `cfWaitingRoom` object described
   * under the `json_response_enabled` property in other Waiting Room API calls.
   */
  custom_page_html?: string;

  /**
   * The language of the default page template. If no default_template_language is
   * provided, then `en-US` (English) will be used.
   */
  default_template_language?:
    | 'en-US'
    | 'es-ES'
    | 'de-DE'
    | 'fr-FR'
    | 'it-IT'
    | 'ja-JP'
    | 'ko-KR'
    | 'pt-BR'
    | 'zh-CN'
    | 'zh-TW'
    | 'nl-NL'
    | 'pl-PL'
    | 'id-ID'
    | 'tr-TR'
    | 'ar-EG'
    | 'ru-RU'
    | 'fa-IR';

  /**
   * A note that you can use to add more details about the waiting room.
   */
  description?: string;

  /**
   * Only available for the Waiting Room Advanced subscription. Disables automatic
   * renewal of session cookies. If `true`, an accepted user will have
   * session_duration minutes to browse the site. After that, they will have to go
   * through the waiting room again. If `false`, a user's session cookie will be
   * automatically renewed on every request.
   */
  disable_session_renewal?: boolean;

  /**
   * Only available for the Waiting Room Advanced subscription. If `true`, requests
   * to the waiting room with the header `Accept: application/json` will receive a
   * JSON response object with information on the user's status in the waiting room
   * as opposed to the configured static HTML page. This JSON response object has one
   * property `cfWaitingRoom` which is an object containing the following fields:
   *
   * 1. `inWaitingRoom`: Boolean indicating if the user is in the waiting room
   *    (always **true**).
   * 2. `waitTimeKnown`: Boolean indicating if the current estimated wait times are
   *    accurate. If **false**, they are not available.
   * 3. `waitTime`: Valid only when `waitTimeKnown` is **true**. Integer indicating
   *    the current estimated time in minutes the user will wait in the waiting room.
   *    When `queueingMethod` is **random**, this is set to `waitTime50Percentile`.
   * 4. `waitTime25Percentile`: Valid only when `queueingMethod` is **random** and
   *    `waitTimeKnown` is **true**. Integer indicating the current estimated maximum
   *    wait time for the 25% of users that gain entry the fastest (25th percentile).
   * 5. `waitTime50Percentile`: Valid only when `queueingMethod` is **random** and
   *    `waitTimeKnown` is **true**. Integer indicating the current estimated maximum
   *    wait time for the 50% of users that gain entry the fastest (50th percentile).
   *    In other words, half of the queued users are expected to let into the origin
   *    website before `waitTime50Percentile` and half are expected to be let in
   *    after it.
   * 6. `waitTime75Percentile`: Valid only when `queueingMethod` is **random** and
   *    `waitTimeKnown` is **true**. Integer indicating the current estimated maximum
   *    wait time for the 75% of users that gain entry the fastest (75th percentile).
   * 7. `waitTimeFormatted`: String displaying the `waitTime` formatted in English
   *    for users. If `waitTimeKnown` is **false**, `waitTimeFormatted` will display
   *    **unavailable**.
   * 8. `queueIsFull`: Boolean indicating if the waiting room's queue is currently
   *    full and not accepting new users at the moment.
   * 9. `queueAll`: Boolean indicating if all users will be queued in the waiting
   *    room and no one will be let into the origin website.
   * 10. `lastUpdated`: String displaying the timestamp as an ISO 8601 string of the
   *     user's last attempt to leave the waiting room and be let into the origin
   *     website. The user is able to make another attempt after
   *     `refreshIntervalSeconds` past this time. If the user makes a request too
   *     soon, it will be ignored and `lastUpdated` will not change.
   * 11. `refreshIntervalSeconds`: Integer indicating the number of seconds after
   *     `lastUpdated` until the user is able to make another attempt to leave the
   *     waiting room and be let into the origin website. When the `queueingMethod`
   *     is `reject`, there is no specified refresh time — it will always be
   *     **zero**.
   * 12. `queueingMethod`: The queueing method currently used by the waiting room. It
   *     is either **fifo**, **random**, **passthrough**, or **reject**.
   * 13. `isFIFOQueue`: Boolean indicating if the waiting room uses a FIFO
   *     (First-In-First-Out) queue.
   * 14. `isRandomQueue`: Boolean indicating if the waiting room uses a Random queue
   *     where users gain access randomly.
   * 15. `isPassthroughQueue`: Boolean indicating if the waiting room uses a
   *     passthrough queue. Keep in mind that when passthrough is enabled, this JSON
   *     response will only exist when `queueAll` is **true** or `isEventPrequeueing`
   *     is **true** because in all other cases requests will go directly to the
   *     origin.
   * 16. `isRejectQueue`: Boolean indicating if the waiting room uses a reject queue.
   * 17. `isEventActive`: Boolean indicating if an event is currently occurring.
   *     Events are able to change a waiting room's behavior during a specified
   *     period of time. For additional information, look at the event properties
   *     `prequeue_start_time`, `event_start_time`, and `event_end_time` in the
   *     documentation for creating waiting room events. Events are considered active
   *     between these start and end times, as well as during the prequeueing period
   *     if it exists.
   * 18. `isEventPrequeueing`: Valid only when `isEventActive` is **true**. Boolean
   *     indicating if an event is currently prequeueing users before it starts.
   * 19. `timeUntilEventStart`: Valid only when `isEventPrequeueing` is **true**.
   *     Integer indicating the number of minutes until the event starts.
   * 20. `timeUntilEventStartFormatted`: String displaying the `timeUntilEventStart`
   *     formatted in English for users. If `isEventPrequeueing` is **false**,
   *     `timeUntilEventStartFormatted` will display **unavailable**.
   * 21. `timeUntilEventEnd`: Valid only when `isEventActive` is **true**. Integer
   *     indicating the number of minutes until the event ends.
   * 22. `timeUntilEventEndFormatted`: String displaying the `timeUntilEventEnd`
   *     formatted in English for users. If `isEventActive` is **false**,
   *     `timeUntilEventEndFormatted` will display **unavailable**.
   * 23. `shuffleAtEventStart`: Valid only when `isEventActive` is **true**. Boolean
   *     indicating if the users in the prequeue are shuffled randomly when the event
   *     starts.
   *
   * An example cURL to a waiting room could be:
   *
   *     curl -X GET "https://example.com/waitingroom" \
   *     	-H "Accept: application/json"
   *
   * If `json_response_enabled` is **true** and the request hits the waiting room, an
   * example JSON response when `queueingMethod` is **fifo** and no event is active
   * could be:
   *
   *     {
   *     	"cfWaitingRoom": {
   *     		"inWaitingRoom": true,
   *     		"waitTimeKnown": true,
   *     		"waitTime": 10,
   *     		"waitTime25Percentile": 0,
   *     		"waitTime50Percentile": 0,
   *     		"waitTime75Percentile": 0,
   *     		"waitTimeFormatted": "10 minutes",
   *     		"queueIsFull": false,
   *     		"queueAll": false,
   *     		"lastUpdated": "2020-08-03T23:46:00.000Z",
   *     		"refreshIntervalSeconds": 20,
   *     		"queueingMethod": "fifo",
   *     		"isFIFOQueue": true,
   *     		"isRandomQueue": false,
   *     		"isPassthroughQueue": false,
   *     		"isRejectQueue": false,
   *     		"isEventActive": false,
   *     		"isEventPrequeueing": false,
   *     		"timeUntilEventStart": 0,
   *     		"timeUntilEventStartFormatted": "unavailable",
   *     		"timeUntilEventEnd": 0,
   *     		"timeUntilEventEndFormatted": "unavailable",
   *     		"shuffleAtEventStart": false
   *     	}
   *     }
   *
   * If `json_response_enabled` is **true** and the request hits the waiting room, an
   * example JSON response when `queueingMethod` is **random** and an event is active
   * could be:
   *
   *     {
   *     	"cfWaitingRoom": {
   *     		"inWaitingRoom": true,
   *     		"waitTimeKnown": true,
   *     		"waitTime": 10,
   *     		"waitTime25Percentile": 5,
   *     		"waitTime50Percentile": 10,
   *     		"waitTime75Percentile": 15,
   *     		"waitTimeFormatted": "5 minutes to 15 minutes",
   *     		"queueIsFull": false,
   *     		"queueAll": false,
   *     		"lastUpdated": "2020-08-03T23:46:00.000Z",
   *     		"refreshIntervalSeconds": 20,
   *     		"queueingMethod": "random",
   *     		"isFIFOQueue": false,
   *     		"isRandomQueue": true,
   *     		"isPassthroughQueue": false,
   *     		"isRejectQueue": false,
   *     		"isEventActive": true,
   *     		"isEventPrequeueing": false,
   *     		"timeUntilEventStart": 0,
   *     		"timeUntilEventStartFormatted": "unavailable",
   *     		"timeUntilEventEnd": 15,
   *     		"timeUntilEventEndFormatted": "15 minutes",
   *     		"shuffleAtEventStart": true
   *     	}
   *     }.
   */
  json_response_enabled?: boolean;

  /**
   * Sets the path within the host to enable the waiting room on. The waiting room
   * will be enabled for all subpaths as well. If there are two waiting rooms on the
   * same subpath, the waiting room for the most specific path will be chosen.
   * Wildcards and query parameters are not supported.
   */
  path?: string;

  /**
   * If queue_all is `true`, all the traffic that is coming to a route will be sent
   * to the waiting room. No new traffic can get to the route once this field is set
   * and estimated time will become unavailable.
   */
  queue_all?: boolean;

  /**
   * Sets the queueing method used by the waiting room. Changing this parameter from
   * the **default** queueing method is only available for the Waiting Room Advanced
   * subscription. Regardless of the queueing method, if `queue_all` is enabled or an
   * event is prequeueing, users in the waiting room will not be accepted to the
   * origin. These users will always see a waiting room page that refreshes
   * automatically. The valid queueing methods are:
   *
   * 1. `fifo` **(default)**: First-In-First-Out queue where customers gain access in
   *    the order they arrived.
   * 2. `random`: Random queue where customers gain access randomly, regardless of
   *    arrival time.
   * 3. `passthrough`: Users will pass directly through the waiting room and into the
   *    origin website. As a result, any configured limits will not be respected
   *    while this is enabled. This method can be used as an alternative to disabling
   *    a waiting room (with `suspended`) so that analytics are still reported. This
   *    can be used if you wish to allow all traffic normally, but want to restrict
   *    traffic during a waiting room event, or vice versa.
   * 4. `reject`: Users will be immediately rejected from the waiting room. As a
   *    result, no users will reach the origin website while this is enabled. This
   *    can be used if you wish to reject all traffic while performing maintenance,
   *    block traffic during a specified period of time (an event), or block traffic
   *    while events are not occurring. Consider a waiting room used for vaccine
   *    distribution that only allows traffic during sign-up events, and otherwise
   *    blocks all traffic. For this case, the waiting room uses `reject`, and its
   *    events override this with `fifo`, `random`, or `passthrough`. When this
   *    queueing method is enabled and neither `queueAll` is enabled nor an event is
   *    prequeueing, the waiting room page **will not refresh automatically**.
   */
  queueing_method?: 'fifo' | 'random' | 'passthrough' | 'reject';

  /**
   * HTTP status code returned to a user while in the queue.
   */
  queueing_status_code?: 200 | 202 | 429;

  /**
   * Lifetime of a cookie (in minutes) set by Cloudflare for users who get access to
   * the route. If a user is not seen by Cloudflare again in that time period, they
   * will be treated as a new user that visits the route.
   */
  session_duration?: number;

  /**
   * Suspends or allows traffic going to the waiting room. If set to `true`, the
   * traffic will not go to the waiting room.
   */
  suspended?: boolean;
}

export namespace WaitingRoomUpdateParams {
  export interface AdditionalRoute {
    /**
     * The hostname to which this waiting room will be applied (no wildcards). The
     * hostname must be the primary domain, subdomain, or custom hostname (if using SSL
     * for SaaS) of this zone. Please do not include the scheme (http:// or https://).
     */
    host?: string;

    /**
     * Sets the path within the host to enable the waiting room on. The waiting room
     * will be enabled for all subpaths as well. If there are two waiting rooms on the
     * same subpath, the waiting room for the most specific path will be chosen.
     * Wildcards and query parameters are not supported.
     */
    path?: string;
  }

  /**
   * Configures cookie attributes for the waiting room cookie. This encrypted cookie
   * stores a user's status in the waiting room, such as queue position.
   */
  export interface CookieAttributes {
    /**
     * Configures the SameSite attribute on the waiting room cookie. Value `auto` will
     * be translated to `lax` or `none` depending if **Always Use HTTPS** is enabled.
     * Note that when using value `none`, the secure attribute cannot be set to
     * `never`.
     */
    samesite?: 'auto' | 'lax' | 'none' | 'strict';

    /**
     * Configures the Secure attribute on the waiting room cookie. Value `always`
     * indicates that the Secure attribute will be set in the Set-Cookie header,
     * `never` indicates that the Secure attribute will not be set, and `auto` will set
     * the Secure attribute depending if **Always Use HTTPS** is enabled.
     */
    secure?: 'auto' | 'always' | 'never';
  }
}

export interface WaitingRoomEditParams {
  /**
   * The host name to which the waiting room will be applied (no wildcards). Please
   * do not include the scheme (http:// or https://). The host and path combination
   * must be unique.
   */
  host: string;

  /**
   * A unique name to identify the waiting room. Only alphanumeric characters,
   * hyphens and underscores are allowed.
   */
  name: string;

  /**
   * Sets the number of new users that will be let into the route every minute. This
   * value is used as baseline for the number of users that are let in per minute. So
   * it is possible that there is a little more or little less traffic coming to the
   * route based on the traffic patterns at that time around the world.
   */
  new_users_per_minute: number;

  /**
   * Sets the total number of active user sessions on the route at a point in time. A
   * route is a combination of host and path on which a waiting room is available.
   * This value is used as a baseline for the total number of active user sessions on
   * the route. It is possible to have a situation where there are more or less
   * active users sessions on the route based on the traffic patterns at that time
   * around the world.
   */
  total_active_users: number;

  /**
   * Only available for the Waiting Room Advanced subscription. Additional hostname
   * and path combinations to which this waiting room will be applied. There is an
   * implied wildcard at the end of the path. The hostname and path combination must
   * be unique to this and all other waiting rooms.
   */
  additional_routes?: Array<WaitingRoomEditParams.AdditionalRoute>;

  /**
   * Configures cookie attributes for the waiting room cookie. This encrypted cookie
   * stores a user's status in the waiting room, such as queue position.
   */
  cookie_attributes?: WaitingRoomEditParams.CookieAttributes;

  /**
   * Appends a '\_' + a custom suffix to the end of Cloudflare Waiting Room's cookie
   * name(**cf_waitingroom). If `cookie_suffix` is "abcd", the cookie name will be
   * `**cf_waitingroom_abcd`. This field is required if using `additional_routes`.
   */
  cookie_suffix?: string;

  /**
   * Only available for the Waiting Room Advanced subscription. This is a template
   * html file that will be rendered at the edge. If no custom_page_html is provided,
   * the default waiting room will be used. The template is based on mustache (
   * https://mustache.github.io/ ). There are several variables that are evaluated by
   * the Cloudflare edge:
   *
   * 1. {{`waitTimeKnown`}} Acts like a boolean value that indicates the behavior to
   *    take when wait time is not available, for instance when queue_all is
   *    **true**.
   * 2. {{`waitTimeFormatted`}} Estimated wait time for the user. For example, five
   *    minutes. Alternatively, you can use:
   * 3. {{`waitTime`}} Number of minutes of estimated wait for a user.
   * 4. {{`waitTimeHours`}} Number of hours of estimated wait for a user
   *    (`Math.floor(waitTime/60)`).
   * 5. {{`waitTimeHourMinutes`}} Number of minutes above the `waitTimeHours` value
   *    (`waitTime%60`).
   * 6. {{`queueIsFull`}} Changes to **true** when no more people can be added to the
   *    queue.
   *
   * To view the full list of variables, look at the `cfWaitingRoom` object described
   * under the `json_response_enabled` property in other Waiting Room API calls.
   */
  custom_page_html?: string;

  /**
   * The language of the default page template. If no default_template_language is
   * provided, then `en-US` (English) will be used.
   */
  default_template_language?:
    | 'en-US'
    | 'es-ES'
    | 'de-DE'
    | 'fr-FR'
    | 'it-IT'
    | 'ja-JP'
    | 'ko-KR'
    | 'pt-BR'
    | 'zh-CN'
    | 'zh-TW'
    | 'nl-NL'
    | 'pl-PL'
    | 'id-ID'
    | 'tr-TR'
    | 'ar-EG'
    | 'ru-RU'
    | 'fa-IR';

  /**
   * A note that you can use to add more details about the waiting room.
   */
  description?: string;

  /**
   * Only available for the Waiting Room Advanced subscription. Disables automatic
   * renewal of session cookies. If `true`, an accepted user will have
   * session_duration minutes to browse the site. After that, they will have to go
   * through the waiting room again. If `false`, a user's session cookie will be
   * automatically renewed on every request.
   */
  disable_session_renewal?: boolean;

  /**
   * Only available for the Waiting Room Advanced subscription. If `true`, requests
   * to the waiting room with the header `Accept: application/json` will receive a
   * JSON response object with information on the user's status in the waiting room
   * as opposed to the configured static HTML page. This JSON response object has one
   * property `cfWaitingRoom` which is an object containing the following fields:
   *
   * 1. `inWaitingRoom`: Boolean indicating if the user is in the waiting room
   *    (always **true**).
   * 2. `waitTimeKnown`: Boolean indicating if the current estimated wait times are
   *    accurate. If **false**, they are not available.
   * 3. `waitTime`: Valid only when `waitTimeKnown` is **true**. Integer indicating
   *    the current estimated time in minutes the user will wait in the waiting room.
   *    When `queueingMethod` is **random**, this is set to `waitTime50Percentile`.
   * 4. `waitTime25Percentile`: Valid only when `queueingMethod` is **random** and
   *    `waitTimeKnown` is **true**. Integer indicating the current estimated maximum
   *    wait time for the 25% of users that gain entry the fastest (25th percentile).
   * 5. `waitTime50Percentile`: Valid only when `queueingMethod` is **random** and
   *    `waitTimeKnown` is **true**. Integer indicating the current estimated maximum
   *    wait time for the 50% of users that gain entry the fastest (50th percentile).
   *    In other words, half of the queued users are expected to let into the origin
   *    website before `waitTime50Percentile` and half are expected to be let in
   *    after it.
   * 6. `waitTime75Percentile`: Valid only when `queueingMethod` is **random** and
   *    `waitTimeKnown` is **true**. Integer indicating the current estimated maximum
   *    wait time for the 75% of users that gain entry the fastest (75th percentile).
   * 7. `waitTimeFormatted`: String displaying the `waitTime` formatted in English
   *    for users. If `waitTimeKnown` is **false**, `waitTimeFormatted` will display
   *    **unavailable**.
   * 8. `queueIsFull`: Boolean indicating if the waiting room's queue is currently
   *    full and not accepting new users at the moment.
   * 9. `queueAll`: Boolean indicating if all users will be queued in the waiting
   *    room and no one will be let into the origin website.
   * 10. `lastUpdated`: String displaying the timestamp as an ISO 8601 string of the
   *     user's last attempt to leave the waiting room and be let into the origin
   *     website. The user is able to make another attempt after
   *     `refreshIntervalSeconds` past this time. If the user makes a request too
   *     soon, it will be ignored and `lastUpdated` will not change.
   * 11. `refreshIntervalSeconds`: Integer indicating the number of seconds after
   *     `lastUpdated` until the user is able to make another attempt to leave the
   *     waiting room and be let into the origin website. When the `queueingMethod`
   *     is `reject`, there is no specified refresh time — it will always be
   *     **zero**.
   * 12. `queueingMethod`: The queueing method currently used by the waiting room. It
   *     is either **fifo**, **random**, **passthrough**, or **reject**.
   * 13. `isFIFOQueue`: Boolean indicating if the waiting room uses a FIFO
   *     (First-In-First-Out) queue.
   * 14. `isRandomQueue`: Boolean indicating if the waiting room uses a Random queue
   *     where users gain access randomly.
   * 15. `isPassthroughQueue`: Boolean indicating if the waiting room uses a
   *     passthrough queue. Keep in mind that when passthrough is enabled, this JSON
   *     response will only exist when `queueAll` is **true** or `isEventPrequeueing`
   *     is **true** because in all other cases requests will go directly to the
   *     origin.
   * 16. `isRejectQueue`: Boolean indicating if the waiting room uses a reject queue.
   * 17. `isEventActive`: Boolean indicating if an event is currently occurring.
   *     Events are able to change a waiting room's behavior during a specified
   *     period of time. For additional information, look at the event properties
   *     `prequeue_start_time`, `event_start_time`, and `event_end_time` in the
   *     documentation for creating waiting room events. Events are considered active
   *     between these start and end times, as well as during the prequeueing period
   *     if it exists.
   * 18. `isEventPrequeueing`: Valid only when `isEventActive` is **true**. Boolean
   *     indicating if an event is currently prequeueing users before it starts.
   * 19. `timeUntilEventStart`: Valid only when `isEventPrequeueing` is **true**.
   *     Integer indicating the number of minutes until the event starts.
   * 20. `timeUntilEventStartFormatted`: String displaying the `timeUntilEventStart`
   *     formatted in English for users. If `isEventPrequeueing` is **false**,
   *     `timeUntilEventStartFormatted` will display **unavailable**.
   * 21. `timeUntilEventEnd`: Valid only when `isEventActive` is **true**. Integer
   *     indicating the number of minutes until the event ends.
   * 22. `timeUntilEventEndFormatted`: String displaying the `timeUntilEventEnd`
   *     formatted in English for users. If `isEventActive` is **false**,
   *     `timeUntilEventEndFormatted` will display **unavailable**.
   * 23. `shuffleAtEventStart`: Valid only when `isEventActive` is **true**. Boolean
   *     indicating if the users in the prequeue are shuffled randomly when the event
   *     starts.
   *
   * An example cURL to a waiting room could be:
   *
   *     curl -X GET "https://example.com/waitingroom" \
   *     	-H "Accept: application/json"
   *
   * If `json_response_enabled` is **true** and the request hits the waiting room, an
   * example JSON response when `queueingMethod` is **fifo** and no event is active
   * could be:
   *
   *     {
   *     	"cfWaitingRoom": {
   *     		"inWaitingRoom": true,
   *     		"waitTimeKnown": true,
   *     		"waitTime": 10,
   *     		"waitTime25Percentile": 0,
   *     		"waitTime50Percentile": 0,
   *     		"waitTime75Percentile": 0,
   *     		"waitTimeFormatted": "10 minutes",
   *     		"queueIsFull": false,
   *     		"queueAll": false,
   *     		"lastUpdated": "2020-08-03T23:46:00.000Z",
   *     		"refreshIntervalSeconds": 20,
   *     		"queueingMethod": "fifo",
   *     		"isFIFOQueue": true,
   *     		"isRandomQueue": false,
   *     		"isPassthroughQueue": false,
   *     		"isRejectQueue": false,
   *     		"isEventActive": false,
   *     		"isEventPrequeueing": false,
   *     		"timeUntilEventStart": 0,
   *     		"timeUntilEventStartFormatted": "unavailable",
   *     		"timeUntilEventEnd": 0,
   *     		"timeUntilEventEndFormatted": "unavailable",
   *     		"shuffleAtEventStart": false
   *     	}
   *     }
   *
   * If `json_response_enabled` is **true** and the request hits the waiting room, an
   * example JSON response when `queueingMethod` is **random** and an event is active
   * could be:
   *
   *     {
   *     	"cfWaitingRoom": {
   *     		"inWaitingRoom": true,
   *     		"waitTimeKnown": true,
   *     		"waitTime": 10,
   *     		"waitTime25Percentile": 5,
   *     		"waitTime50Percentile": 10,
   *     		"waitTime75Percentile": 15,
   *     		"waitTimeFormatted": "5 minutes to 15 minutes",
   *     		"queueIsFull": false,
   *     		"queueAll": false,
   *     		"lastUpdated": "2020-08-03T23:46:00.000Z",
   *     		"refreshIntervalSeconds": 20,
   *     		"queueingMethod": "random",
   *     		"isFIFOQueue": false,
   *     		"isRandomQueue": true,
   *     		"isPassthroughQueue": false,
   *     		"isRejectQueue": false,
   *     		"isEventActive": true,
   *     		"isEventPrequeueing": false,
   *     		"timeUntilEventStart": 0,
   *     		"timeUntilEventStartFormatted": "unavailable",
   *     		"timeUntilEventEnd": 15,
   *     		"timeUntilEventEndFormatted": "15 minutes",
   *     		"shuffleAtEventStart": true
   *     	}
   *     }.
   */
  json_response_enabled?: boolean;

  /**
   * Sets the path within the host to enable the waiting room on. The waiting room
   * will be enabled for all subpaths as well. If there are two waiting rooms on the
   * same subpath, the waiting room for the most specific path will be chosen.
   * Wildcards and query parameters are not supported.
   */
  path?: string;

  /**
   * If queue_all is `true`, all the traffic that is coming to a route will be sent
   * to the waiting room. No new traffic can get to the route once this field is set
   * and estimated time will become unavailable.
   */
  queue_all?: boolean;

  /**
   * Sets the queueing method used by the waiting room. Changing this parameter from
   * the **default** queueing method is only available for the Waiting Room Advanced
   * subscription. Regardless of the queueing method, if `queue_all` is enabled or an
   * event is prequeueing, users in the waiting room will not be accepted to the
   * origin. These users will always see a waiting room page that refreshes
   * automatically. The valid queueing methods are:
   *
   * 1. `fifo` **(default)**: First-In-First-Out queue where customers gain access in
   *    the order they arrived.
   * 2. `random`: Random queue where customers gain access randomly, regardless of
   *    arrival time.
   * 3. `passthrough`: Users will pass directly through the waiting room and into the
   *    origin website. As a result, any configured limits will not be respected
   *    while this is enabled. This method can be used as an alternative to disabling
   *    a waiting room (with `suspended`) so that analytics are still reported. This
   *    can be used if you wish to allow all traffic normally, but want to restrict
   *    traffic during a waiting room event, or vice versa.
   * 4. `reject`: Users will be immediately rejected from the waiting room. As a
   *    result, no users will reach the origin website while this is enabled. This
   *    can be used if you wish to reject all traffic while performing maintenance,
   *    block traffic during a specified period of time (an event), or block traffic
   *    while events are not occurring. Consider a waiting room used for vaccine
   *    distribution that only allows traffic during sign-up events, and otherwise
   *    blocks all traffic. For this case, the waiting room uses `reject`, and its
   *    events override this with `fifo`, `random`, or `passthrough`. When this
   *    queueing method is enabled and neither `queueAll` is enabled nor an event is
   *    prequeueing, the waiting room page **will not refresh automatically**.
   */
  queueing_method?: 'fifo' | 'random' | 'passthrough' | 'reject';

  /**
   * HTTP status code returned to a user while in the queue.
   */
  queueing_status_code?: 200 | 202 | 429;

  /**
   * Lifetime of a cookie (in minutes) set by Cloudflare for users who get access to
   * the route. If a user is not seen by Cloudflare again in that time period, they
   * will be treated as a new user that visits the route.
   */
  session_duration?: number;

  /**
   * Suspends or allows traffic going to the waiting room. If set to `true`, the
   * traffic will not go to the waiting room.
   */
  suspended?: boolean;
}

export namespace WaitingRoomEditParams {
  export interface AdditionalRoute {
    /**
     * The hostname to which this waiting room will be applied (no wildcards). The
     * hostname must be the primary domain, subdomain, or custom hostname (if using SSL
     * for SaaS) of this zone. Please do not include the scheme (http:// or https://).
     */
    host?: string;

    /**
     * Sets the path within the host to enable the waiting room on. The waiting room
     * will be enabled for all subpaths as well. If there are two waiting rooms on the
     * same subpath, the waiting room for the most specific path will be chosen.
     * Wildcards and query parameters are not supported.
     */
    path?: string;
  }

  /**
   * Configures cookie attributes for the waiting room cookie. This encrypted cookie
   * stores a user's status in the waiting room, such as queue position.
   */
  export interface CookieAttributes {
    /**
     * Configures the SameSite attribute on the waiting room cookie. Value `auto` will
     * be translated to `lax` or `none` depending if **Always Use HTTPS** is enabled.
     * Note that when using value `none`, the secure attribute cannot be set to
     * `never`.
     */
    samesite?: 'auto' | 'lax' | 'none' | 'strict';

    /**
     * Configures the Secure attribute on the waiting room cookie. Value `always`
     * indicates that the Secure attribute will be set in the Set-Cookie header,
     * `never` indicates that the Secure attribute will not be set, and `auto` will set
     * the Secure attribute depending if **Always Use HTTPS** is enabled.
     */
    secure?: 'auto' | 'always' | 'never';
  }
}

export namespace WaitingRooms {
  export import WaitingroomWaitingroom = WaitingRoomsAPI.WaitingroomWaitingroom;
  export import WaitingRoomListResponse = WaitingRoomsAPI.WaitingRoomListResponse;
  export import WaitingRoomDeleteResponse = WaitingRoomsAPI.WaitingRoomDeleteResponse;
  export import WaitingRoomCreateParams = WaitingRoomsAPI.WaitingRoomCreateParams;
  export import WaitingRoomUpdateParams = WaitingRoomsAPI.WaitingRoomUpdateParams;
  export import WaitingRoomEditParams = WaitingRoomsAPI.WaitingRoomEditParams;
  export import Page = PageAPI.Page;
  export import PagePreviewResponse = PageAPI.PagePreviewResponse;
  export import PagePreviewParams = PageAPI.PagePreviewParams;
  export import Events = EventsAPI.Events;
  export import WaitingroomEventResult = EventsAPI.WaitingroomEventResult;
  export import EventListResponse = EventsAPI.EventListResponse;
  export import EventDeleteResponse = EventsAPI.EventDeleteResponse;
  export import EventCreateParams = EventsAPI.EventCreateParams;
  export import EventUpdateParams = EventsAPI.EventUpdateParams;
  export import EventEditParams = EventsAPI.EventEditParams;
  export import Rules = RulesAPI.Rules;
  export import WaitingroomRuleResult = RulesAPI.WaitingroomRuleResult;
  export import RuleCreateResponse = RulesAPI.RuleCreateResponse;
  export import RuleUpdateResponse = RulesAPI.RuleUpdateResponse;
  export import RuleListResponse = RulesAPI.RuleListResponse;
  export import RuleDeleteResponse = RulesAPI.RuleDeleteResponse;
  export import RuleEditResponse = RulesAPI.RuleEditResponse;
  export import RuleCreateParams = RulesAPI.RuleCreateParams;
  export import RuleUpdateParams = RulesAPI.RuleUpdateParams;
  export import RuleEditParams = RulesAPI.RuleEditParams;
  export import Statuses = StatusesAPI.Statuses;
  export import StatusGetResponse = StatusesAPI.StatusGetResponse;
  export import Settings = SettingsAPI.Settings;
  export import SettingUpdateResponse = SettingsAPI.SettingUpdateResponse;
  export import SettingEditResponse = SettingsAPI.SettingEditResponse;
  export import SettingGetResponse = SettingsAPI.SettingGetResponse;
  export import SettingUpdateParams = SettingsAPI.SettingUpdateParams;
  export import SettingEditParams = SettingsAPI.SettingEditParams;
}
