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