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

import { APIResource } from "../../resource";
import * as AccountSettingsAPI from "./account-settings";
import * as AIAPI from "./ai";
import * as DomainsAPI from "./domains";
import * as SubdomainsAPI from "./subdomains";
import * as ScriptsAPI from "./scripts/scripts";

export class Workers extends APIResource {
  ai: AIAPI.AI = new AIAPI.AI(this._client);
  scripts: ScriptsAPI.Scripts = new ScriptsAPI.Scripts(this._client);
  accountSettings: AccountSettingsAPI.AccountSettings = new AccountSettingsAPI.AccountSettings(this._client);
  domains: DomainsAPI.Domains = new DomainsAPI.Domains(this._client);
  subdomains: SubdomainsAPI.Subdomains = new SubdomainsAPI.Subdomains(this._client);
}

/**
 * A binding to allow the Worker to communicate with resources
 */
export type Binding =
  | KVNamespaceBinding
  | ServiceBinding
  | DurableObjectBinding
  | R2Binding
  | Binding.WorkersQueueBinding
  | D1Binding
  | DispatchNamespaceBinding
  | MTLSCERTBinding;

export namespace Binding {
  export interface WorkersQueueBinding {
    /**
     * A JavaScript variable name for the binding.
     */
    name: string;

    /**
     * Name of the Queue to bind to
     */
    queue_name: string;

    /**
     * The class of resource that the binding provides.
     */
    type: 'queue';
  }
}

export interface D1Binding {
  /**
   * ID of the D1 database to bind to
   */
  id: string;

  /**
   * A JavaScript variable name for the binding.
   */
  binding: string;

  /**
   * The name of the D1 database associated with the 'id' provided.
   */
  name: string;

  /**
   * The class of resource that the binding provides.
   */
  type: 'd1';
}

export interface DispatchNamespaceBinding {
  /**
   * A JavaScript variable name for the binding.
   */
  name: string;

  /**
   * Namespace to bind to
   */
  namespace: string;

  /**
   * The class of resource that the binding provides.
   */
  type: 'dispatch_namespace';

  /**
   * Outbound worker
   */
  outbound?: DispatchNamespaceBinding.Outbound;
}

export namespace DispatchNamespaceBinding {
  /**
   * Outbound worker
   */
  export interface Outbound {
    /**
     * Pass information from the Dispatch Worker to the Outbound Worker through the
     * parameters
     */
    params?: Array<string>;

    /**
     * Outbound worker
     */
    worker?: Outbound.Worker;
  }

  export namespace Outbound {
    /**
     * Outbound worker
     */
    export interface Worker {
      /**
       * Environment of the outbound worker
       */
      environment?: string;

      /**
       * Name of the outbound worker
       */
      service?: string;
    }
  }
}

export interface DurableObjectBinding {
  /**
   * The exported class name of the Durable Object
   */
  class_name: string;

  /**
   * A JavaScript variable name for the binding.
   */
  name: string;

  /**
   * The class of resource that the binding provides.
   */
  type: 'durable_object_namespace';

  /**
   * The environment of the script_name to bind to
   */
  environment?: string;

  /**
   * Namespace identifier tag.
   */
  namespace_id?: string;

  /**
   * The script where the Durable Object is defined, if it is external to this Worker
   */
  script_name?: string;
}

export interface KVNamespaceBinding {
  /**
   * A JavaScript variable name for the binding.
   */
  name: string;

  /**
   * Namespace identifier tag.
   */
  namespace_id: string;

  /**
   * The class of resource that the binding provides.
   */
  type: 'kv_namespace';
}

export interface MigrationStep {
  /**
   * A list of classes to delete Durable Object namespaces from.
   */
  deleted_classes?: Array<string>;

  /**
   * A list of classes to create Durable Object namespaces from.
   */
  new_classes?: Array<string>;

  /**
   * A list of classes with Durable Object namespaces that were renamed.
   */
  renamed_classes?: Array<MigrationStep.RenamedClass>;

  /**
   * A list of transfers for Durable Object namespaces from a different Worker and
   * class to a class defined in this Worker.
   */
  transferred_classes?: Array<MigrationStep.TransferredClass>;
}

export namespace MigrationStep {
  export interface RenamedClass {
    from?: string;

    to?: string;
  }

  export interface TransferredClass {
    from?: string;

    from_script?: string;

    to?: string;
  }
}

export interface MTLSCERTBinding {
  certificate: unknown;

  /**
   * A JavaScript variable name for the binding.
   */
  name: string;

  /**
   * The class of resource that the binding provides.
   */
  type: 'mtls_certificate';

  /**
   * ID of the certificate to bind to
   */
  certificate_id?: string;
}

export interface PlacementConfiguration {
  /**
   * Enables
   * [Smart Placement](https://developers.cloudflare.com/workers/configuration/smart-placement).
   * Only `"smart"` is currently supported
   */
  mode?: 'smart';
}

export interface R2Binding {
  /**
   * R2 bucket to bind to
   */
  bucket_name: string;

  /**
   * A JavaScript variable name for the binding.
   */
  name: string;

  /**
   * The class of resource that the binding provides.
   */
  type: 'r2_bucket';
}

export interface ServiceBinding {
  /**
   * Optional environment if the Worker utilizes one.
   */
  environment: string;

  /**
   * A JavaScript variable name for the binding.
   */
  name: string;

  /**
   * Name of Worker to bind to
   */
  service: string;

  /**
   * The class of resource that the binding provides.
   */
  type: 'service';
}

/**
 * A single set of migrations to apply.
 */
export interface SingleStepMigration {
  /**
   * A list of classes to delete Durable Object namespaces from.
   */
  deleted_classes?: Array<string>;

  /**
   * A list of classes to create Durable Object namespaces from.
   */
  new_classes?: Array<string>;

  /**
   * Tag to set as the latest migration tag.
   */
  new_tag?: string;

  /**
   * Tag used to verify against the latest migration tag for this Worker. If they
   * don't match, the upload is rejected.
   */
  old_tag?: string;

  /**
   * A list of classes with Durable Object namespaces that were renamed.
   */
  renamed_classes?: Array<SingleStepMigration.RenamedClass>;

  /**
   * A list of transfers for Durable Object namespaces from a different Worker and
   * class to a class defined in this Worker.
   */
  transferred_classes?: Array<SingleStepMigration.TransferredClass>;
}

export namespace SingleStepMigration {
  export interface RenamedClass {
    from?: string;

    to?: string;
  }

  export interface TransferredClass {
    from?: string;

    from_script?: string;

    to?: string;
  }
}

export interface SteppedMigration {
  /**
   * Tag to set as the latest migration tag.
   */
  new_tag?: string;

  /**
   * Tag used to verify against the latest migration tag for this Worker. If they
   * don't match, the upload is rejected.
   */
  old_tag?: string;

  /**
   * Migrations to apply in order.
   */
  steps?: Array<MigrationStep>;
}

/**
 * JSON encoded metadata about the uploaded parts and Worker configuration.
 */
export interface WorkerMetadata {
  /**
   * Name of the part in the multipart request that contains the script (e.g. the
   * file adding a listener to the `fetch` event). Indicates a
   * `service worker syntax` Worker.
   */
  body_part?: string;

  /**
   * Name of the part in the multipart request that contains the main module (e.g.
   * the file exporting a `fetch` handler). Indicates a `module syntax` Worker.
   */
  main_module?: string;
}

export namespace Workers {
  export import AI = AIAPI.AI;
  export import AIRunResponse = AIAPI.AIRunResponse;
  export import AIRunParams = AIAPI.AIRunParams;
  export import Scripts = ScriptsAPI.Scripts;
  export import Script = ScriptsAPI.Script;
  export import ScriptSetting = ScriptsAPI.ScriptSetting;
  export import ScriptsSinglePage = ScriptsAPI.ScriptsSinglePage;
  export import ScriptUpdateParams = ScriptsAPI.ScriptUpdateParams;
  export import ScriptListParams = ScriptsAPI.ScriptListParams;
  export import ScriptDeleteParams = ScriptsAPI.ScriptDeleteParams;
  export import ScriptGetParams = ScriptsAPI.ScriptGetParams;
  export import AccountSettings = AccountSettingsAPI.AccountSettings;
  export import AccountSettingUpdateResponse = AccountSettingsAPI.AccountSettingUpdateResponse;
  export import AccountSettingGetResponse = AccountSettingsAPI.AccountSettingGetResponse;
  export import AccountSettingUpdateParams = AccountSettingsAPI.AccountSettingUpdateParams;
  export import AccountSettingGetParams = AccountSettingsAPI.AccountSettingGetParams;
  export import Domains = DomainsAPI.Domains;
  export import Domain = DomainsAPI.Domain;
  export import DomainsSinglePage = DomainsAPI.DomainsSinglePage;
  export import DomainUpdateParams = DomainsAPI.DomainUpdateParams;
  export import DomainListParams = DomainsAPI.DomainListParams;
  export import DomainDeleteParams = DomainsAPI.DomainDeleteParams;
  export import DomainGetParams = DomainsAPI.DomainGetParams;
  export import Subdomains = SubdomainsAPI.Subdomains;
  export import SubdomainUpdateResponse = SubdomainsAPI.SubdomainUpdateResponse;
  export import SubdomainGetResponse = SubdomainsAPI.SubdomainGetResponse;
  export import SubdomainUpdateParams = SubdomainsAPI.SubdomainUpdateParams;
  export import SubdomainGetParams = SubdomainsAPI.SubdomainGetParams;
}
