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

import { APIResource } from '../../core/resource';
import * as AssociationsAPI from './associations';
import {
  AssociationGetParams,
  Associations,
  BaseAssociations,
  CertificateAsssociation,
  CertificateAsssociationsSinglePage,
} from './associations';
import { APIPromise } from '../../core/api-promise';
import { PagePromise, SinglePage } from '../../core/pagination';
import { RequestOptions } from '../../internal/request-options';
import { path } from '../../internal/utils/path';

export class BaseMTLSCertificates extends APIResource {
  static override readonly _key: readonly ['mtlsCertificates'] = Object.freeze(['mtlsCertificates'] as const);

  /**
   * Upload a certificate that you want to use with mTLS-enabled Cloudflare services,
   * such as Bring Your Own CA (BYO-CA) for mTLS. To create certificates issued by
   * the Cloudflare managed CA, use the
   * [Create Client Certificate endpoint](/api/resources/client_certificates/methods/create/).
   *
   * @example
   * ```ts
   * const mtlsCertificate =
   *   await client.mtlsCertificates.create({
   *     account_id: '023e105f4ecef8ad9ca31a8372d0c353',
   *     ca: true,
   *     certificates:
   *       '-----BEGIN CERTIFICATE-----\nMIIDmDCCAoCgAwIBAgIUKTOAZNjcXVZRj4oQt0SHsl1c1vMwDQYJKoZIhvcNAQEL\nBQAwUTELMAkGA1UEBhMCVVMxFjAUBgNVBAgMDVNhbiBGcmFuY2lzY28xEzARBgNV\nBAcMCkNhbGlmb3JuaWExFTATBgNVBAoMDEV4YW1wbGUgSW5jLjAgFw0yMjExMjIx\nNjU5NDdaGA8yMTIyMTAyOTE2NTk0N1owUTELMAkGA1UEBhMCVVMxFjAUBgNVBAgM\nDVNhbiBGcmFuY2lzY28xEzARBgNVBAcMCkNhbGlmb3JuaWExFTATBgNVBAoMDEV4\nYW1wbGUgSW5jLjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMRcORwg\nJFTdcG/2GKI+cFYiOBNDKjCZUXEOvXWY42BkH9wxiMT869CO+enA1w5pIrXow6kC\nM1sQspHHaVmJUlotEMJxyoLFfA/8Kt1EKFyobOjuZs2SwyVyJ2sStvQuUQEosULZ\nCNGZEqoH5g6zhMPxaxm7ZLrrsDZ9maNGVqo7EWLWHrZ57Q/5MtTrbxQL+eXjUmJ9\nK3kS+3uEwMdqR6Z3BluU1ivanpPc1CN2GNhdO0/hSY4YkGEnuLsqJyDd3cIiB1Mx\nuCBJ4ZaqOd2viV1WcP3oU3dxVPm4MWyfYIldMWB14FahScxLhWdRnM9YZ/i9IFcL\nypXsuz7DjrJPtPUCAwEAAaNmMGQwHQYDVR0OBBYEFP5JzLUawNF+c3AXsYTEWHh7\nz2czMB8GA1UdIwQYMBaAFP5JzLUawNF+c3AXsYTEWHh7z2czMA4GA1UdDwEB/wQE\nAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEBMA0GCSqGSIb3DQEBCwUAA4IBAQBc+Be7\nNDhpE09y7hLPZGRPl1cSKBw4RI0XIv6rlbSTFs5EebpTGjhx/whNxwEZhB9HZ711\n1Oa1YlT8xkI9DshB78mjAHCKBAJ76moK8tkG0aqdYpJ4ZcJTVBB7l98Rvgc7zfTi\ni7WemTy72deBbSeiEtXavm4EF0mWjHhQ5Nxpnp00Bqn5g1x8CyTDypgmugnep+xG\n+iFzNmTdsz7WI9T/7kDMXqB7M/FPWBORyS98OJqNDswCLF8bIZYwUBEe+bRHFomo\nShMzaC3tvim7WCb16noDkSTMlfKO4pnvKhpcVdSgwcruATV7y+W+Lvmz2OT/Gui4\nJhqeoTewsxndhDDE\n-----END CERTIFICATE-----',
   *   });
   * ```
   */
  create(
    params: MTLSCertificateCreateParams,
    options?: RequestOptions,
  ): APIPromise<MTLSCertificateCreateResponse> {
    const { account_id, ...body } = params;
    return (
      this._client.post(path`/accounts/${account_id}/mtls_certificates`, { body, ...options }) as APIPromise<{
        result: MTLSCertificateCreateResponse;
      }>
    )._thenUnwrap((obj) => obj.result);
  }

  /**
   * Lists all mTLS certificates uploaded to your account, such as Bring Your Own CA
   * (BYO-CA) for mTLS. To list certificates issued by the Cloudflare managed CA, use
   * the
   * [List Client Certificates endpoint](/api/resources/client_certificates/methods/list/).
   *
   * @example
   * ```ts
   * // Automatically fetches more pages as needed.
   * for await (const mtlsCertificate of client.mtlsCertificates.list(
   *   { account_id: '023e105f4ecef8ad9ca31a8372d0c353' },
   * )) {
   *   // ...
   * }
   * ```
   */
  list(
    params: MTLSCertificateListParams,
    options?: RequestOptions,
  ): PagePromise<MTLSCertificatesSinglePage, MTLSCertificate> {
    const { account_id, ...query } = params;
    return this._client.getAPIList(
      path`/accounts/${account_id}/mtls_certificates`,
      SinglePage<MTLSCertificate>,
      { query, ...options },
    );
  }

  /**
   * Deletes the mTLS certificate unless the certificate is in use by one or more
   * Cloudflare services.
   *
   * @example
   * ```ts
   * const mtlsCertificate =
   *   await client.mtlsCertificates.delete(
   *     '2458ce5a-0c35-4c7f-82c7-8e9487d3ff60',
   *     { account_id: '023e105f4ecef8ad9ca31a8372d0c353' },
   *   );
   * ```
   */
  delete(
    mtlsCertificateID: string,
    params: MTLSCertificateDeleteParams,
    options?: RequestOptions,
  ): APIPromise<MTLSCertificate> {
    const { account_id } = params;
    return (
      this._client.delete(
        path`/accounts/${account_id}/mtls_certificates/${mtlsCertificateID}`,
        options,
      ) as APIPromise<{ result: MTLSCertificate }>
    )._thenUnwrap((obj) => obj.result);
  }

  /**
   * Fetches a single mTLS certificate uploaded to your account. To get a certificate
   * issued by the Cloudflare managed CA, use the
   * [Client Certificate Details endpoint](/api/resources/client_certificates/methods/get/).
   *
   * @example
   * ```ts
   * const mtlsCertificate = await client.mtlsCertificates.get(
   *   '2458ce5a-0c35-4c7f-82c7-8e9487d3ff60',
   *   { account_id: '023e105f4ecef8ad9ca31a8372d0c353' },
   * );
   * ```
   */
  get(
    mtlsCertificateID: string,
    params: MTLSCertificateGetParams,
    options?: RequestOptions,
  ): APIPromise<MTLSCertificate> {
    const { account_id } = params;
    return (
      this._client.get(
        path`/accounts/${account_id}/mtls_certificates/${mtlsCertificateID}`,
        options,
      ) as APIPromise<{ result: MTLSCertificate }>
    )._thenUnwrap((obj) => obj.result);
  }
}
export class MTLSCertificates extends BaseMTLSCertificates {
  associations: AssociationsAPI.Associations = new AssociationsAPI.Associations(this._client);
}

export type MTLSCertificatesSinglePage = SinglePage<MTLSCertificate>;

export interface MTLSCertificate {
  /**
   * Certificate identifier tag.
   */
  id?: string;

  /**
   * Indicates whether the certificate is a CA or leaf certificate.
   */
  ca?: boolean;

  /**
   * The uploaded root CA certificate.
   */
  certificates?: string;

  /**
   * When the certificate expires.
   */
  expires_on?: string;

  /**
   * The certificate authority that issued the certificate.
   */
  issuer?: string;

  /**
   * Optional unique name for the certificate. Only used for human readability.
   */
  name?: string;

  /**
   * The certificate serial number.
   */
  serial_number?: string;

  /**
   * The type of hash used for the certificate.
   */
  signature?: string;

  /**
   * The type of the certificate, indicating how it was created and who manages it.
   */
  type?: 'custom' | 'gateway_managed' | 'access_managed';

  /**
   * This is the time the certificate was uploaded.
   */
  uploaded_on?: string;
}

export interface MTLSCertificateCreateResponse {
  /**
   * Certificate identifier tag.
   */
  id?: string;

  /**
   * Indicates whether the certificate is a CA or leaf certificate.
   */
  ca?: boolean;

  /**
   * The uploaded root CA certificate.
   */
  certificates?: string;

  /**
   * When the certificate expires.
   */
  expires_on?: string;

  /**
   * The certificate authority that issued the certificate.
   */
  issuer?: string;

  /**
   * Optional unique name for the certificate. Only used for human readability.
   */
  name?: string;

  /**
   * The certificate serial number.
   */
  serial_number?: string;

  /**
   * The type of hash used for the certificate.
   */
  signature?: string;

  /**
   * The type of the certificate, indicating how it was created and who manages it.
   */
  type?: 'custom' | 'gateway_managed' | 'access_managed';

  /**
   * This is the time the certificate was updated.
   */
  updated_at?: string;

  /**
   * This is the time the certificate was uploaded.
   */
  uploaded_on?: string;
}

export interface MTLSCertificateCreateParams {
  /**
   * Path param: Identifier.
   */
  account_id: string;

  /**
   * Body param: Indicates whether the certificate is a CA or leaf certificate.
   */
  ca: boolean;

  /**
   * Body param: The uploaded root CA certificate.
   */
  certificates: string;

  /**
   * Body param: Optional unique name for the certificate. Only used for human
   * readability.
   */
  name?: string;

  /**
   * Body param: The private key for the certificate. This field is only needed for
   * specific use cases such as using a custom certificate with Zero Trust's block
   * page.
   */
  private_key?: string;
}

export interface MTLSCertificateListParams {
  /**
   * Path param: Identifier.
   */
  account_id: string;

  /**
   * Query param: Filters results by certificate type. Multiple types can be
   * comma-separated.
   */
  type?: Array<'custom' | 'gateway_managed' | 'access_managed'>;
}

export interface MTLSCertificateDeleteParams {
  /**
   * Identifier.
   */
  account_id: string;
}

export interface MTLSCertificateGetParams {
  /**
   * Identifier.
   */
  account_id: string;
}

MTLSCertificates.Associations = Associations;
MTLSCertificates.BaseAssociations = BaseAssociations;

export declare namespace MTLSCertificates {
  export {
    type MTLSCertificate as MTLSCertificate,
    type MTLSCertificateCreateResponse as MTLSCertificateCreateResponse,
    type MTLSCertificatesSinglePage as MTLSCertificatesSinglePage,
    type MTLSCertificateCreateParams as MTLSCertificateCreateParams,
    type MTLSCertificateListParams as MTLSCertificateListParams,
    type MTLSCertificateDeleteParams as MTLSCertificateDeleteParams,
    type MTLSCertificateGetParams as MTLSCertificateGetParams,
  };

  export {
    Associations as Associations,
    BaseAssociations as BaseAssociations,
    type CertificateAsssociation as CertificateAsssociation,
    type CertificateAsssociationsSinglePage as CertificateAsssociationsSinglePage,
    type AssociationGetParams as AssociationGetParams,
  };
}
