import {
  IPreloaderCallbacksMap,
  IPreloaderMutableProps,
  IPreloaderStaticProps,
} from '../Preloader';

/**
 * Static properties for configuring the progress preloader.
 */
export interface IProgressPreloaderStaticProps extends IPreloaderStaticProps {
  /**
   * Container source for preloader resources.
   * @default null
   */
  resourceContainer?: HTMLElement | null;

  /**
   * Enables automatic preloading of images.
   * @default true
   */
  preloadImages?: boolean;

  /**
   * Enables automatic preloading of videos.
   * @default false
   */
  preloadVideos?: boolean;

  /**
   * Selector for custom resources to preload. Elements should include `data-weight` and `data-loaded` attributes.
   * Example: `data-weight="10"` for a weight of 10, `data-loaded="10"` when loaded.
   * @default '.js-preload'
   */
  customSelector?: string;

  /**
   * Class name for elements to exclude from preloading.
   * @default 'js-preload-ignore'
   */
  ignoreClassName?: string;

  /**
   * Linear interpolation factor for smooth progress updates. `1` disables interpolation for instant updates.
   * @default 0.1
   */
  lerp?: number;

  /**
   * Duration (ms) to complete the preloader if resources are loaded but progress < 1.
   * @default 500
   */
  endDuration?: number;
}

/**
 * Mutable properties for the progress preloader.
 */
export interface IProgressPreloaderMutableProps extends IPreloaderMutableProps {}

/**
 * Callback events for the progress preloader.
 */
export interface IProgressPreloaderCallbacksMap extends IPreloaderCallbacksMap<IProgressPreloaderMutableProps> {
  /**
   * Fired when the preloader's progress updates.
   */
  progress: undefined;

  /**
   * Fired each time a resource is loaded during preloading.
   */
  resource: IProgressPreloaderResource;
}

/**
 * Data structure for custom resources to preload.
 */
export interface IProgressPreloaderResource {
  /**
   * The custom resource identifier.
   */
  id: Element | string;

  /**
   * A resource may be split into multiple parts. This is the resource weight
   */
  weight: number;

  /**
   * Loaded weight
   */
  loaded: number;
}
