import { PrismicDocument } from "./types/value/document.cjs";
import { Client, ClientConfig, FetchParams } from "./Client.cjs";
import { PrismicMigrationDocument } from "./types/migration/Document.cjs";
import { PrismicMigrationAsset } from "./types/migration/Asset.cjs";
import { Migration } from "./Migration.cjs";

//#region src/WriteClient.d.ts
/** Utility type to construct events reported by the migration process. */
type MigrateReporterEvent<TType extends string, TData = never> = TData extends never ? {
  type: TType;
} : {
  type: TType;
  data: TData;
};
/** A map of event types and their data reported by the migration process. */
type MigrateReporterEventMap = {
  start: {
    pending: {
      documents: number;
      assets: number;
    };
  };
  end: {
    migrated: {
      documents: number;
      assets: number;
    };
  };
  "assets:creating": {
    current: number;
    remaining: number;
    total: number;
    asset: PrismicMigrationAsset;
  };
  "assets:created": {
    created: number;
  };
  "documents:masterLocale": {
    masterLocale: string;
  };
  "documents:creating": {
    current: number;
    remaining: number;
    total: number;
    document: PrismicMigrationDocument;
  };
  "documents:created": {
    created: number;
  };
  "documents:updating": {
    current: number;
    remaining: number;
    total: number;
    document: PrismicMigrationDocument;
  };
  "documents:updated": {
    updated: number;
  };
};
/** Available event types reported by the migration process. */
type MigrateReporterEventTypes = keyof MigrateReporterEventMap;
/**
 * All events reported by the migration process. Events can be listened to by providing a `reporter`
 * function to the `migrate` method.
 */
type MigrateReporterEvents = { [K in MigrateReporterEventTypes]: MigrateReporterEvent<K, MigrateReporterEventMap[K]> }[MigrateReporterEventTypes];
/** Configuration for clients that determine how content is queried. */
type WriteClientConfig = {
  /** A Prismic write token that allows writing content to the repository. */writeToken: string;
  /**
   * The Prismic Asset API endpoint.
   *
   * @defaultValue `"https://asset-api.prismic.io/"`
   * @see Prismic Asset API technical reference: {@link https://prismic.io/docs/asset-api-technical-reference}
   */
  assetAPIEndpoint?: string;
  /**
   * The Prismic Migration API endpoint.
   *
   * @defaultValue `"https://migration.prismic.io/"`
   * @see Prismic Migration API technical reference: {@link https://prismic.io/docs/migration-api-technical-reference}
   */
  migrationAPIEndpoint?: string;
} & ClientConfig;
/**
 * A client that allows querying and writing content to a Prismic repository.
 *
 * If used in an environment where a global `fetch` function is unavailable, such as Node.js, the
 * `fetch` option must be provided as part of the `options` parameter.
 *
 * @typeParam TDocuments - Document types that are registered for the Prismic repository. Query
 *   methods will automatically be typed based on this type.
 */
declare class WriteClient<TDocuments extends PrismicDocument = PrismicDocument> extends Client<TDocuments> {
  #private;
  writeToken: string;
  assetAPIEndpoint: string;
  migrationAPIEndpoint: string;
  /**
   * Creates a Prismic client that can be used to query and write content to a repository.
   *
   * If used in an environment where a global `fetch` function is unavailable, such as in some
   * Node.js versions, the `fetch` option must be provided as part of the `options` parameter.
   *
   * @param repositoryName - The Prismic repository name for the repository.
   * @param options - Configuration that determines how content will be queried from and written to
   *   the Prismic repository.
   * @returns A client that can query and write content to the repository.
   */
  constructor(repositoryName: string, options: WriteClientConfig);
  /**
   * Creates a migration release on the Prismic repository based on the provided prepared migration.
   *
   * @param migration - A migration prepared with {@link createMigration}.
   * @param params - An event listener and additional fetch parameters.
   * @see Prismic Migration API technical reference: {@link https://prismic.io/docs/migration-api-technical-reference}
   */
  migrate(migration: Migration<TDocuments>, params?: {
    reporter?: (event: MigrateReporterEvents) => void;
  } & FetchParams): Promise<void>;
  /**
   * Creates assets in the Prismic repository's media library.
   *
   * @param migration - A migration prepared with {@link createMigration}.
   * @param params - An event listener and additional fetch parameters.
   * @internal This method is one of the step performed by the {@link migrate} method.
   */
  private migrateCreateAssets;
  /**
   * Creates documents in the Prismic repository's migration release.
   *
   * @param migration - A migration prepared with {@link createMigration}.
   * @param params - An event listener and additional fetch parameters.
   * @internal This method is one of the step performed by the {@link migrate} method.
   */
  private migrateCreateDocuments;
  /**
   * Updates documents in the Prismic repository's migration release with their patched data.
   *
   * @param migration - A migration prepared with {@link createMigration}.
   * @param params - An event listener and additional fetch parameters.
   * @internal This method is one of the step performed by the {@link migrate} method.
   */
  private migrateUpdateDocuments;
  /**
   * Creates an asset in the Prismic media library.
   *
   * @param file - The file to upload as an asset.
   * @param filename - The filename of the asset.
   * @param params - Additional asset data and fetch parameters.
   * @returns The created asset.
   */
  private createAsset;
  /**
   * Updates an asset in the Prismic media library.
   *
   * @param id - The ID of the asset to update.
   * @param params - The asset data to update and additional fetch parameters.
   * @returns The updated asset.
   */
  private updateAsset;
  /**
   * Fetches a foreign asset from a URL.
   *
   * @param url - The URL of the asset to fetch.
   * @param params - Additional fetch parameters.
   * @returns A file representing the fetched asset.
   */
  private fetchForeignAsset;
  /** {@link resolveAssetTagIDs} rate limiter. */
  private _resolveAssetTagIDsLimit;
  /**
   * Resolves asset tag IDs from tag names.
   *
   * @param tagNames - An array of tag names to resolve.
   * @param params - Whether or not missing tags should be created and additional fetch parameters.
   * @returns An array of resolved tag IDs.
   */
  private resolveAssetTagIDs;
  /**
   * Creates a tag in the Asset API.
   *
   * @remarks
   *   Tags should be at least 3 characters long and 20 characters at most.
   * @param name - The name of the tag to create.
   * @param params - Additional fetch parameters.
   * @returns The created tag.
   */
  private createAssetTag;
  /**
   * Queries existing tags from the Asset API.
   *
   * @param params - Additional fetch parameters.
   * @returns An array of existing tags.
   */
  private getAssetTags;
  /**
   * Creates a document in the repository's migration release.
   *
   * @typeParam TType - Type of Prismic documents to create.
   * @param document - The document to create.
   * @param documentTitle - The title of the document to create which will be displayed in the
   *   editor.
   * @param params - Document master language document ID and additional fetch parameters.
   * @returns The ID of the created document.
   * @see Prismic Migration API technical reference: {@link https://prismic.io/docs/migration-api-technical-reference}
   */
  private createDocument;
  /**
   * Updates an existing document in the repository's migration release.
   *
   * @typeParam TType - Type of Prismic documents to update.
   * @param id - The ID of the document to update.
   * @param document - The document content to update.
   * @param params - Additional fetch parameters.
   * @see Prismic Migration API technical reference: {@link https://prismic.io/docs/migration-api-technical-reference}
   */
  private updateDocument;
}
//#endregion
export { MigrateReporterEvents, WriteClient, WriteClientConfig };
//# sourceMappingURL=WriteClient.d.cts.map