import { FilledImageFieldImage } from "./types/value/image.js";
import { FilledLinkToMediaField } from "./types/value/linkToMedia.js";
import { PrismicDocument } from "./types/value/document.js";
import { Asset } from "./types/api/asset/asset.js";
import { MigrationContentRelationship } from "./types/migration/ContentRelationship.js";
import { ExistingPrismicDocument, PendingPrismicDocument, PrismicMigrationDocument } from "./types/migration/Document.js";
import { MigrationAssetConfig, PrismicMigrationAsset } from "./types/migration/Asset.js";

//#region src/Migration.d.ts
/**
 * Extracts one or more Prismic document types that match a given Prismic document type. If no
 * matches are found, no extraction is performed and the union of all provided Prismic document
 * types are returned.
 *
 * @typeParam TDocuments - Prismic document types from which to extract.
 * @typeParam TDocumentType - Type(s) to match `TDocuments` against.
 */
type ExtractDocumentType<TDocuments extends {
  type: string;
}, TDocumentType extends TDocuments["type"]> = Extract<TDocuments, {
  type: TDocumentType;
}> extends never ? TDocuments : Extract<TDocuments, {
  type: TDocumentType;
}>;
/**
 * A helper that allows preparing your migration to Prismic.
 *
 * @typeParam TDocuments - Document types that are registered for the Prismic repository. Query
 *   methods will automatically be typed based on this type.
 */
declare class Migration<TDocuments extends PrismicDocument = PrismicDocument> {
  #private;
  /**
   * Assets registered in the migration.
   *
   * @internal
   */
  _assets: Map<MigrationAssetConfig["file"], PrismicMigrationAsset>;
  /**
   * Documents registered in the migration.
   *
   * @internal
   */
  _documents: PrismicMigrationDocument<TDocuments>[];
  /**
   * Registers an asset to be created in the migration from an asset object.
   *
   * @remarks
   *   This method does not create the asset in Prismic media library right away. Instead, it
   *   registers it in your migration. The asset will be created when the migration is executed
   *   through the `writeClient.migrate()` method.
   * @param asset - An asset object from Prismic Asset API.
   * @returns A migration asset field instance.
   * @internal
   */
  createAsset(asset: Asset): PrismicMigrationAsset;
  /**
   * Registers an asset to be created in the migration from an image or link to media field.
   *
   * @remarks
   *   This method does not create the asset in Prismic media library right away. Instead, it
   *   registers it in your migration. The asset will be created when the migration is executed
   *   through the `writeClient.migrate()` method.
   * @param imageOrLinkToMediaField - An image or link to media field from Prismic Document API.
   * @returns A migration asset field instance.
   * @internal
   */
  createAsset(imageOrLinkToMediaField: FilledImageFieldImage | FilledLinkToMediaField): PrismicMigrationAsset;
  /**
   * Registers an asset to be created in the migration from a file.
   *
   * @remarks
   *   This method does not create the asset in Prismic media library right away. Instead, it
   *   registers it in your migration. The asset will be created when the migration is executed
   *   through the `writeClient.migrate()` method.
   * @param file - The URL or content of the file to be created.
   * @param filename - The filename of the asset.
   * @param params - Additional asset data.
   * @returns A migration asset field instance.
   */
  createAsset(file: MigrationAssetConfig["file"], filename: MigrationAssetConfig["filename"], params?: {
    notes?: string;
    credits?: string;
    alt?: string;
    tags?: string[];
  }): PrismicMigrationAsset;
  /**
   * Registers a document to be created in the migration.
   *
   * @remarks
   *   This method does not create the document in Prismic right away. Instead, it registers it in
   *   your migration. The document will be created when the migration is executed through the
   *   `writeClient.migrate()` method.
   * @typeParam TType - Type of the Prismic document to create.
   * @param document - The document to create.
   * @param title - The title of the document to create which will be displayed in the editor.
   * @param params - Document master language document ID.
   * @returns A migration document instance.
   */
  createDocument<TType extends TDocuments["type"]>(document: ExtractDocumentType<PendingPrismicDocument<TDocuments>, TType>, title: string, params?: {
    masterLanguageDocument?: MigrationContentRelationship;
  }): PrismicMigrationDocument<ExtractDocumentType<TDocuments, TType>>;
  /**
   * Registers an existing document to be updated in the migration.
   *
   * @remarks
   *   This method does not update the document in Prismic right away. Instead, it registers it in
   *   your migration. The document will be updated when the migration is executed through the
   *   `writeClient.migrate()` method.
   * @typeParam TType - Type of Prismic documents to update.
   * @param document - The document to update.
   * @param title - The title of the document to update which will be displayed in the editor.
   * @returns A migration document instance.
   */
  updateDocument<TType extends TDocuments["type"]>(document: ExtractDocumentType<ExistingPrismicDocument<TDocuments>, TType>, title?: string): PrismicMigrationDocument<ExtractDocumentType<TDocuments, TType>>;
  /**
   * Registers a document from another Prismic repository to be created in the migration.
   *
   * @remarks
   *   This method does not create the document in Prismic right away. Instead, it registers it in
   *   your migration. The document will be created when the migration is executed through the
   *   `writeClient.migrate()` method.
   * @param document - The document from Prismic to create.
   * @param title - The title of the document to create which will be displayed in the editor.
   * @returns A migration document instance.
   */
  createDocumentFromPrismic<TType extends TDocuments["type"]>(document: ExtractDocumentType<ExistingPrismicDocument<TDocuments>, TType>, title: string): PrismicMigrationDocument<ExtractDocumentType<TDocuments, TType>>;
  /**
   * Queries a document from the migration instance with a specific UID and custom type.
   *
   * @example
   * 	;```ts
   * 	const contentRelationship = migration.createContentRelationship(() =>
   * 		migration.getByUID("blog_post", "my-first-post"),
   * 	)
   * 	```
   *
   * @typeParam TType - Type of the Prismic document returned.
   * @param type - The API ID of the document's custom type.
   * @param uid - The UID of the document.
   * @returns The migration document instance with a UID matching the `uid` parameter, if a matching
   *   document is found.
   */
  getByUID<TType extends TDocuments["type"]>(type: TType, uid: string): PrismicMigrationDocument<ExtractDocumentType<TDocuments, TType>> | undefined;
  /**
   * Queries a singleton document from the migration instance for a specific custom type.
   *
   * @example
   * 	;```ts
   * 	const contentRelationship = migration.createContentRelationship(() =>
   * 		migration.getSingle("settings"),
   * 	)
   * 	```
   *
   * @typeParam TType - Type of the Prismic document returned.
   * @param type - The API ID of the singleton custom type.
   * @returns The migration document instance for the custom type, if a matching
   * document is found.
   */
  getSingle<TType extends TDocuments["type"]>(type: TType): PrismicMigrationDocument<ExtractDocumentType<TDocuments, TType>> | undefined;
  /**
   * Queries a document from the migration instance for a specific original ID.
   *
   * @example
   * 	;```ts
   * 	const contentRelationship = migration.createContentRelationship(() =>
   * 		migration._getByOriginalID("YhdrDxIAACgAcp_b"),
   * 	)
   * 	```
   *
   * @typeParam TType - Type of the Prismic document returned.
   * @param id - The original ID of the Prismic document.
   * @returns The migration document instance for the original ID, if a matching
   * document is found.
   * @internal
   */
  _getByOriginalID<TType extends TDocuments["type"]>(id: string): PrismicMigrationDocument<ExtractDocumentType<TDocuments, TType>> | undefined;
}
//#endregion
export { Migration };
//# sourceMappingURL=Migration.d.ts.map