'use strict'

import { Ticker, UPDATE_PRIORITY } from '@pixi/ticker';
import { Options } from './options';
import { Effect } from './effects/effect';

/**
 * Camera that can be applied to a game/animation made with pixijs.
 */
export class Camera {
  /**
   * A reference to the options passed to camera pixi on initialization.
   * 
   * @private
   * 
   * @private {Options}
   */
  private _options: Options;

  /**
   * A reference to the PIXI Ticker, if it's being used.
   * 
   * @private
   * 
   * @property {Ticker}
   */
  private _ticker?: Ticker;

  /**
   * @param {Ticker} [options] A reference to the PIXI Ticker, if it's being used.
   */
  constructor(options?: Object) {
    this._options = new Options(options);
    if (this._options.ticker) this._ticker = this._options.ticker;
  }

  /**
   * Runs a provided effect.
   * 
   * @param {Effect} effect The instance of the effect to run.
   */
  effect(effect: Effect) {
    this._addToTicker(effect);
  }

  /**
   * Adds an effect to the PIXI Ticker if it's being used and removes it when necessary.
   * 
   * @private
   * 
   * @param {Effect} effect The effect to add to the Ticker.
   */
  private _addToTicker(effect: Effect) {
    const effectBound = effect.update.bind(effect);

    if (this._ticker) {
      effect.finished.add(() => this._ticker?.remove(effectBound, this));
      this._ticker?.add(effectBound, this, UPDATE_PRIORITY.NORMAL);
    } else effect.start();
  }
}
