import type { ImageModelV4ProviderMetadata } from '@ai-sdk/provider';
import type { GeneratedFile } from '../generate-text';
import type { ImageModelProviderMetadata } from '../types/image-model';
import type { ImageModelResponseMetadata } from '../types/image-model-response-metadata';
import type { ImageModelUsage } from '../types/usage';
import type { Warning } from '../types/warning';

/**
 * The result of one underlying image model call.
 */
export interface GenerateImageCall {
  /**
   * The images generated by this call.
   */
  readonly images: Array<GeneratedFile>;

  /**
   * Provider-specific metadata for this call.
   */
  readonly providerMetadata?: ImageModelV4ProviderMetadata;

  /**
   * Response metadata from the provider.
   */
  readonly response: ImageModelResponseMetadata;

  /**
   * Warnings for this call, e.g. unsupported settings.
   */
  readonly warnings: Array<Warning>;

  /**
   * Token usage for this call, if reported by the provider.
   */
  readonly usage?: ImageModelUsage;
}

/**
 * The result of a `generateImage` call.
 * It contains the images and additional information.
 */
export interface GenerateImageResult {
  /**
   * The first image that was generated.
   */
  readonly image: GeneratedFile;

  /**
   * The images that were generated.
   */
  readonly images: Array<GeneratedFile>;

  /**
   * The results of the underlying image model calls.
   */
  readonly calls: Array<GenerateImageCall>;

  /**
   * Warnings for the call, e.g. unsupported settings.
   */
  readonly warnings: Array<Warning>;

  /**
   * Response metadata from the provider. There may be multiple responses if we made multiple calls to the model.
   *
   * @deprecated Use `calls` to preserve each response with its corresponding images, metadata, warnings, and usage.
   */
  readonly responses: Array<ImageModelResponseMetadata>;

  /**
   * Provider-specific metadata. They are passed through from the provider to the AI SDK and enable provider-specific
   * results that can be fully encapsulated in the provider.
   *
   * @deprecated Use the provider metadata in `calls` or on individual `images` to preserve its scope.
   */
  readonly providerMetadata: ImageModelProviderMetadata;

  /**
   * Combined token usage across all underlying provider calls for this image generation.
   */
  readonly usage: ImageModelUsage;
}
