// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.

import { APIResource } from '../../../resource';
import { isRequestOptions } from '../../../core';
import * as Core from '../../../core';
import * as BulkOperationsAPI from './bulk-operations';
import { BulkOperationGetParams, BulkOperationGetResponse, BulkOperations } from './bulk-operations';
import * as ItemsAPI from './items';
import {
  ItemCreateParams,
  ItemCreateResponse,
  ItemDeleteParams,
  ItemDeleteResponse,
  ItemGetParams,
  ItemGetResponse,
  ItemListParams,
  ItemListResponse,
  ItemListResponsesCursorPaginationAfter,
  ItemUpdateParams,
  ItemUpdateResponse,
  Items,
  ListCursor,
  ListItem,
} from './items';
import { SinglePage } from '../../../pagination';

export class Lists extends APIResource {
  bulkOperations: BulkOperationsAPI.BulkOperations = new BulkOperationsAPI.BulkOperations(this._client);
  items: ItemsAPI.Items = new ItemsAPI.Items(this._client);

  /**
   * Creates a new list of the specified kind.
   *
   * @example
   * ```ts
   * const list = await client.rules.lists.create({
   *   account_id: '023e105f4ecef8ad9ca31a8372d0c353',
   *   kind: 'ip',
   *   name: 'list1',
   * });
   * ```
   */
  create(params: ListCreateParams, options?: Core.RequestOptions): Core.APIPromise<ListCreateResponse> {
    const { account_id = this._client.accountId, ...body } = params;
    return (
      this._client.post(`/accounts/${account_id}/rules/lists`, { body, ...options }) as Core.APIPromise<{
        result: ListCreateResponse;
      }>
    )._thenUnwrap((obj) => obj.result);
  }

  /**
   * Updates the description of a list.
   *
   * @example
   * ```ts
   * const list = await client.rules.lists.update(
   *   '2c0fc9fa937b11eaa1b71c4d701ab86e',
   *   { account_id: '023e105f4ecef8ad9ca31a8372d0c353' },
   * );
   * ```
   */
  update(
    listId: string,
    params: ListUpdateParams,
    options?: Core.RequestOptions,
  ): Core.APIPromise<ListUpdateResponse> {
    const { account_id = this._client.accountId, ...body } = params;
    return (
      this._client.put(`/accounts/${account_id}/rules/lists/${listId}`, {
        body,
        ...options,
      }) as Core.APIPromise<{ result: ListUpdateResponse }>
    )._thenUnwrap((obj) => obj.result);
  }

  /**
   * Fetches all lists in the account.
   *
   * @example
   * ```ts
   * // Automatically fetches more pages as needed.
   * for await (const listsList of client.rules.lists.list({
   *   account_id: '023e105f4ecef8ad9ca31a8372d0c353',
   * })) {
   *   // ...
   * }
   * ```
   */
  list(
    params?: ListListParams,
    options?: Core.RequestOptions,
  ): Core.PagePromise<ListsListsSinglePage, ListsList>;
  list(options?: Core.RequestOptions): Core.PagePromise<ListsListsSinglePage, ListsList>;
  list(
    params: ListListParams | Core.RequestOptions = {},
    options?: Core.RequestOptions,
  ): Core.PagePromise<ListsListsSinglePage, ListsList> {
    if (isRequestOptions(params)) {
      return this.list({}, params);
    }
    const { account_id = this._client.accountId } = params;
    return this._client.getAPIList(`/accounts/${account_id}/rules/lists`, ListsListsSinglePage, options);
  }

  /**
   * Deletes a specific list and all its items.
   *
   * @example
   * ```ts
   * const list = await client.rules.lists.delete(
   *   '2c0fc9fa937b11eaa1b71c4d701ab86e',
   *   { account_id: '023e105f4ecef8ad9ca31a8372d0c353' },
   * );
   * ```
   */
  delete(
    listId: string,
    params?: ListDeleteParams,
    options?: Core.RequestOptions,
  ): Core.APIPromise<ListDeleteResponse>;
  delete(listId: string, options?: Core.RequestOptions): Core.APIPromise<ListDeleteResponse>;
  delete(
    listId: string,
    params: ListDeleteParams | Core.RequestOptions = {},
    options?: Core.RequestOptions,
  ): Core.APIPromise<ListDeleteResponse> {
    if (isRequestOptions(params)) {
      return this.delete(listId, {}, params);
    }
    const { account_id = this._client.accountId } = params;
    return (
      this._client.delete(`/accounts/${account_id}/rules/lists/${listId}`, options) as Core.APIPromise<{
        result: ListDeleteResponse;
      }>
    )._thenUnwrap((obj) => obj.result);
  }

  /**
   * Fetches the details of a list.
   *
   * @example
   * ```ts
   * const list = await client.rules.lists.get(
   *   '2c0fc9fa937b11eaa1b71c4d701ab86e',
   *   { account_id: '023e105f4ecef8ad9ca31a8372d0c353' },
   * );
   * ```
   */
  get(
    listId: string,
    params?: ListGetParams,
    options?: Core.RequestOptions,
  ): Core.APIPromise<ListGetResponse>;
  get(listId: string, options?: Core.RequestOptions): Core.APIPromise<ListGetResponse>;
  get(
    listId: string,
    params: ListGetParams | Core.RequestOptions = {},
    options?: Core.RequestOptions,
  ): Core.APIPromise<ListGetResponse> {
    if (isRequestOptions(params)) {
      return this.get(listId, {}, params);
    }
    const { account_id = this._client.accountId } = params;
    return (
      this._client.get(`/accounts/${account_id}/rules/lists/${listId}`, options) as Core.APIPromise<{
        result: ListGetResponse;
      }>
    )._thenUnwrap((obj) => obj.result);
  }
}

export class ListsListsSinglePage extends SinglePage<ListsList> {}

/**
 * Valid characters for hostnames are ASCII(7) letters from a to z, the digits from
 * 0 to 9, wildcards (\*), and the hyphen (-).
 */
export interface Hostname {
  url_hostname: string;

  /**
   * Only applies to wildcard hostnames (e.g., \*.example.com). When true (default),
   * only subdomains are blocked. When false, both the root domain and subdomains are
   * blocked.
   */
  exclude_exact_hostname?: boolean;
}

/**
 * Valid characters for hostnames are ASCII(7) letters from a to z, the digits from
 * 0 to 9, wildcards (\*), and the hyphen (-).
 */
export interface HostnameParam {
  url_hostname: string;

  /**
   * Only applies to wildcard hostnames (e.g., \*.example.com). When true (default),
   * only subdomains are blocked. When false, both the root domain and subdomains are
   * blocked.
   */
  exclude_exact_hostname?: boolean;
}

export interface ListsList {
  /**
   * The unique ID of the list.
   */
  id: string;

  /**
   * The RFC 3339 timestamp of when the list was created.
   */
  created_on: string;

  /**
   * The type of the list. Each type supports specific list items (IP addresses,
   * ASNs, hostnames or redirects).
   */
  kind: 'ip' | 'redirect' | 'hostname' | 'asn';

  /**
   * The RFC 3339 timestamp of when the list was last modified.
   */
  modified_on: string;

  /**
   * An informative name for the list. Use this name in filter and rule expressions.
   */
  name: string;

  /**
   * The number of items in the list.
   */
  num_items: number;

  /**
   * The number of [filters](/api/resources/filters/) referencing the list.
   */
  num_referencing_filters: number;

  /**
   * An informative summary of the list.
   */
  description?: string;
}

/**
 * The definition of the redirect.
 */
export interface Redirect {
  source_url: string;

  target_url: string;

  include_subdomains?: boolean;

  preserve_path_suffix?: boolean;

  preserve_query_string?: boolean;

  status_code?: 301 | 302 | 307 | 308;

  subpath_matching?: boolean;
}

/**
 * The definition of the redirect.
 */
export interface RedirectParam {
  source_url: string;

  target_url: string;

  include_subdomains?: boolean;

  preserve_path_suffix?: boolean;

  preserve_query_string?: boolean;

  status_code?: 301 | 302 | 307 | 308;

  subpath_matching?: boolean;
}

export interface ListCreateResponse {
  /**
   * The unique ID of the list.
   */
  id: string;

  /**
   * The RFC 3339 timestamp of when the list was created.
   */
  created_on: string;

  /**
   * The type of the list. Each type supports specific list items (IP addresses,
   * ASNs, hostnames or redirects).
   */
  kind: 'ip' | 'redirect' | 'hostname' | 'asn';

  /**
   * The RFC 3339 timestamp of when the list was last modified.
   */
  modified_on: string;

  /**
   * An informative name for the list. Use this name in filter and rule expressions.
   */
  name: string;

  /**
   * The number of items in the list.
   */
  num_items: number;

  /**
   * The number of [filters](/api/resources/filters/) referencing the list.
   */
  num_referencing_filters: number;

  /**
   * An informative summary of the list.
   */
  description?: string;
}

export interface ListUpdateResponse {
  /**
   * The unique ID of the list.
   */
  id: string;

  /**
   * The RFC 3339 timestamp of when the list was created.
   */
  created_on: string;

  /**
   * The type of the list. Each type supports specific list items (IP addresses,
   * ASNs, hostnames or redirects).
   */
  kind: 'ip' | 'redirect' | 'hostname' | 'asn';

  /**
   * The RFC 3339 timestamp of when the list was last modified.
   */
  modified_on: string;

  /**
   * An informative name for the list. Use this name in filter and rule expressions.
   */
  name: string;

  /**
   * The number of items in the list.
   */
  num_items: number;

  /**
   * The number of [filters](/api/resources/filters/) referencing the list.
   */
  num_referencing_filters: number;

  /**
   * An informative summary of the list.
   */
  description?: string;
}

export interface ListDeleteResponse {
  /**
   * The unique ID of the list.
   */
  id: string;
}

export interface ListGetResponse {
  /**
   * The unique ID of the list.
   */
  id: string;

  /**
   * The RFC 3339 timestamp of when the list was created.
   */
  created_on: string;

  /**
   * The type of the list. Each type supports specific list items (IP addresses,
   * ASNs, hostnames or redirects).
   */
  kind: 'ip' | 'redirect' | 'hostname' | 'asn';

  /**
   * The RFC 3339 timestamp of when the list was last modified.
   */
  modified_on: string;

  /**
   * An informative name for the list. Use this name in filter and rule expressions.
   */
  name: string;

  /**
   * The number of items in the list.
   */
  num_items: number;

  /**
   * The number of [filters](/api/resources/filters/) referencing the list.
   */
  num_referencing_filters: number;

  /**
   * An informative summary of the list.
   */
  description?: string;
}

export interface ListCreateParams {
  /**
   * Path param: The Account ID for this resource.
   */
  account_id?: string;

  /**
   * Body param: The type of the list. Each type supports specific list items (IP
   * addresses, ASNs, hostnames or redirects).
   */
  kind: 'ip' | 'redirect' | 'hostname' | 'asn';

  /**
   * Body param: An informative name for the list. Use this name in filter and rule
   * expressions.
   */
  name: string;

  /**
   * Body param: An informative summary of the list.
   */
  description?: string;
}

export interface ListUpdateParams {
  /**
   * Path param: The Account ID for this resource.
   */
  account_id?: string;

  /**
   * Body param: An informative summary of the list.
   */
  description?: string;
}

export interface ListListParams {
  /**
   * The Account ID for this resource.
   */
  account_id?: string;
}

export interface ListDeleteParams {
  /**
   * The Account ID for this resource.
   */
  account_id?: string;
}

export interface ListGetParams {
  /**
   * The Account ID for this resource.
   */
  account_id?: string;
}

Lists.ListsListsSinglePage = ListsListsSinglePage;
Lists.BulkOperations = BulkOperations;
Lists.Items = Items;
Lists.ItemListResponsesCursorPaginationAfter = ItemListResponsesCursorPaginationAfter;

export declare namespace Lists {
  export {
    type Hostname as Hostname,
    type ListsList as ListsList,
    type Redirect as Redirect,
    type ListCreateResponse as ListCreateResponse,
    type ListUpdateResponse as ListUpdateResponse,
    type ListDeleteResponse as ListDeleteResponse,
    type ListGetResponse as ListGetResponse,
    ListsListsSinglePage as ListsListsSinglePage,
    type ListCreateParams as ListCreateParams,
    type ListUpdateParams as ListUpdateParams,
    type ListListParams as ListListParams,
    type ListDeleteParams as ListDeleteParams,
    type ListGetParams as ListGetParams,
  };

  export {
    BulkOperations as BulkOperations,
    type BulkOperationGetResponse as BulkOperationGetResponse,
    type BulkOperationGetParams as BulkOperationGetParams,
  };

  export {
    Items as Items,
    type ListCursor as ListCursor,
    type ListItem as ListItem,
    type ItemCreateResponse as ItemCreateResponse,
    type ItemUpdateResponse as ItemUpdateResponse,
    type ItemListResponse as ItemListResponse,
    type ItemDeleteResponse as ItemDeleteResponse,
    type ItemGetResponse as ItemGetResponse,
    ItemListResponsesCursorPaginationAfter as ItemListResponsesCursorPaginationAfter,
    type ItemCreateParams as ItemCreateParams,
    type ItemUpdateParams as ItemUpdateParams,
    type ItemListParams as ItemListParams,
    type ItemDeleteParams as ItemDeleteParams,
    type ItemGetParams as ItemGetParams,
  };
}
