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

import { APIResource } from '../../core/resource';
import { APIPromise } from '../../core/api-promise';
import { PagePromise, SinglePage } from '../../core/pagination';
import { RequestOptions } from '../../internal/request-options';
import { path } from '../../internal/utils/path';

/**
 * @deprecated Use DNS settings API instead.
 */
export class BaseCustomNameservers extends APIResource {
  static override readonly _key: readonly ['zones', 'customNameservers'] = Object.freeze([
    'zones',
    'customNameservers',
  ] as const);

  /**
   * Set metadata for account-level custom nameservers on a zone.
   *
   * If you would like new zones in the account to use account custom nameservers by
   * default, use PUT /accounts/:identifier to set the account setting
   * use_account_custom_ns_by_default to true.
   *
   * Deprecated in favor of
   * [Update DNS Settings](https://developers.cloudflare.com/api/operations/dns-settings-for-a-zone-update-dns-settings).
   *
   * @deprecated Use [DNS settings API](https://developers.cloudflare.com/api/resources/dns/subresources/settings/methods/put/) instead.
   */
  update(
    params: CustomNameserverUpdateParams,
    options?: RequestOptions,
  ): PagePromise<CustomNameserverUpdateResponsesSinglePage, CustomNameserverUpdateResponse> {
    const { zone_id, ...body } = params;
    return this._client.getAPIList(
      path`/zones/${zone_id}/custom_ns`,
      SinglePage<CustomNameserverUpdateResponse>,
      { body, method: 'put', ...options },
    );
  }

  /**
   * Get metadata for account-level custom nameservers on a zone.
   *
   * Deprecated in favor of
   * [Show DNS Settings](https://developers.cloudflare.com/api/operations/dns-settings-for-a-zone-list-dns-settings).
   *
   * @deprecated Use [DNS settings API](https://developers.cloudflare.com/api/resources/dns/subresources/settings/methods/get/) instead.
   */
  get(params: CustomNameserverGetParams, options?: RequestOptions): APIPromise<CustomNameserverGetResponse> {
    const { zone_id } = params;
    return this._client.get(path`/zones/${zone_id}/custom_ns`, options);
  }
}
/**
 * @deprecated Use DNS settings API instead.
 */
export class CustomNameservers extends BaseCustomNameservers {}

export type CustomNameserverUpdateResponsesSinglePage = SinglePage<CustomNameserverUpdateResponse>;

/**
 * Unused
 */
export type CustomNameserverUpdateResponse = string;

export interface CustomNameserverGetResponse {
  errors: Array<CustomNameserverGetResponse.Error>;

  messages: Array<CustomNameserverGetResponse.Message>;

  /**
   * Whether the API call was successful.
   */
  success: true;

  /**
   * Whether zone uses account-level custom nameservers.
   */
  enabled?: boolean;

  /**
   * The number of the name server set to assign to the zone.
   */
  ns_set?: number;

  result_info?: CustomNameserverGetResponse.ResultInfo;
}

export namespace CustomNameserverGetResponse {
  export interface Error {
    code: number;

    message: string;

    documentation_url?: string;

    source?: Error.Source;
  }

  export namespace Error {
    export interface Source {
      pointer?: string;
    }
  }

  export interface Message {
    code: number;

    message: string;

    documentation_url?: string;

    source?: Message.Source;
  }

  export namespace Message {
    export interface Source {
      pointer?: string;
    }
  }

  export interface ResultInfo {
    /**
     * Total number of results for the requested service.
     */
    count?: number;

    /**
     * Current page within paginated list of results.
     */
    page?: number;

    /**
     * Number of results per page of results.
     */
    per_page?: number;

    /**
     * Total results available without any search parameters.
     */
    total_count?: number;

    /**
     * The number of total pages in the entire result set.
     */
    total_pages?: number;
  }
}

export interface CustomNameserverUpdateParams {
  /**
   * Path param: Identifier.
   */
  zone_id: string;

  /**
   * Body param: Whether zone uses account-level custom nameservers.
   */
  enabled?: boolean;

  /**
   * Body param: The number of the name server set to assign to the zone.
   */
  ns_set?: number;
}

export interface CustomNameserverGetParams {
  /**
   * Identifier.
   */
  zone_id: string;
}

export declare namespace CustomNameservers {
  export {
    type CustomNameserverUpdateResponse as CustomNameserverUpdateResponse,
    type CustomNameserverGetResponse as CustomNameserverGetResponse,
    type CustomNameserverUpdateResponsesSinglePage as CustomNameserverUpdateResponsesSinglePage,
    type CustomNameserverUpdateParams as CustomNameserverUpdateParams,
    type CustomNameserverGetParams as CustomNameserverGetParams,
  };
}
