import type { Asset } from './Asset';

/**
 * Represents a media album (collection of assets) on the device.
 *
 * An [Album](#album) groups together media assets (images, videos, or audio files).
 * To create a new album, use [Album.create](#albumcreate).
 * To fetch an existing album, use [Album.get](#albumget).
 */
export declare class Album {
  /**
   * Reinitialize an instance of an album with a given ID.
   * @param id - The unique identifier of the album.
   */
  constructor(id: string);

  /**
   * Unique identifier of the album.
   * Can be used to re-instantiate an [Album](#album) later.
   */
  id: string;

  /**
   * Retrieves all assets contained in the album.
   * @returns A promise resolving to an array of [Asset](#asset) objects.
   *
   * @example
   * ```ts
   * const assets = await album.getAssets();
   * console.log(assets.length);
   * ```
   */
  getAssets(): Promise<Asset[]>;

  /**
   * Gets the display title (name) of the album.
   * Note that album titles are not guaranteed to be unique.
   * @returns A promise resolving to the album’s title string.
   *
   * @example
   * ```ts
   * const title = await album.getTitle();
   * console.log(title); // "Camera"
   * ```
   */
  getTitle(): Promise<string>;

  /**
   * Permanently deletes the album from the device.
   * On Android, it deletes the album and all its assets.
   * On iOS, it deletes the album but keeps the assets in the main library.
   * @returns A promise that resolves once the deletion has completed.
   * @throws An exception if the deletion fails or the album could not be found.
   *
   * @example
   * ```ts
   * await album.delete();
   * ```
   */
  delete(): Promise<void>;

  /**
   * Adds one or more assets to the album.
   * @param assets - The [Asset](#asset) or list of [Asset](#asset) objects to add.
   * @returns A promise that resolves once the assets have been added.
   *
   * @example
   * ```ts
   * const asset = await Asset.create("file:///path/to/photo.png");
   * await album.add(asset);
   * ```
   *
   * @example
   * ```ts
   * await album.add([asset1, asset2]);
   * ```
   */
  add(assets: Asset | Asset[]): Promise<void>;

  /**
   * Removes assets from the album without deleting them from the library.
   * This is supported only on iOS.
   *
   * On Android, an asset can belong to only one album. To remove it from an album,
   * delete it or add it to another album.
   * @platform ios
   * @param assets - An array of [Asset](#asset) objects to remove from the album.
   * @returns A promise that resolves once the assets have been removed.
   *
   * @example
   * ```ts
   * const assets = await album.getAssets();
   * await album.removeAssets(assets.slice(0, 2));
   * ```
   */
  removeAssets(assets: Asset[]): Promise<void>;

  /**
   * A static function. Creates a new album with a given name and assets.
   * On Android, if assets are provided and `moveAssets` is true, the assets will be moved into the new album. If false or not supported, the assets will be copied.
   *
   * @param name - Name of the new album.
   * @param assetsRefs - List of [Asset](#asset) objects or file paths (file:///...) to include.
   * @param moveAssets - On Android, whether to move assets into the album. Defaults to `true`.
   * @returns A promise resolving to the created [Album](#album).
   *
   * @example
   * ```ts
   * const album = await Album.create("My Album", [asset]);
   * console.log(await album.getTitle()); // "My Album"
   * ```
   */
  static create(name: string, assetsRefs: string[] | Asset[], moveAssets?: boolean): Promise<Album>;

  /**
   * A static function. Deletes multiple albums at once.
   * On Android, assets are always deleted along with the album regardless of `deleteAssets`.
   * @param albums - An array of [Album](#album) instances to delete.
   * @param deleteAssets - On iOS, whether to delete the assets in the albums as well. Defaults to `false`.
   * @returns A promise that resolves once the albums have been deleted.
   *
   * @example
   * ```ts
   * const album = await Album.create("My Album", [asset]);
   * await Album.delete([album]);
   * ```
   */
  static delete(albums: Album[], deleteAssets?: boolean): Promise<void>;

  /**
   * A static function. Retrieves an album by its title.
   * @param title - The title of the album to retrieve.
   * @return A promise resolving to the [Album](#album) if found, or `null` if not found.
   *
   * @example
   * ```ts
   * const album = await Album.get("Camera");
   * if (album) {
   *   console.log(await album.getTitle()); // "Camera"
   * }
   * ```
   */
  static get(title: string): Promise<Album | null>;

  /**
   * A static function. Retrieves all albums on the device.
   * @returns A promise resolving to an array of [Album](#album) objects.
   *
   * @example
   * ```ts
   * const albums = await Album.getAll();
   * ```
   */
  static getAll(): Promise<Album[]>;
}
