// JwpPlayer

import { Player } from "jwplayer";

const JwpPlayerWidget = function (ns) {
  return class extends ns.Widgets.Widget {
    constructor(player, config) {
      super(player, config);
    }

    static defaults = {};

    draw() {
      var _opts = {},
        _player = Player(this.$[0]),
        _seekPause = false,
        _pauseState = true;

      if (typeof this.video === "undefined") {
        this.video = this.media.video;
      }

      _opts.file = this.video;
      _opts.primary = "flash";
      _opts.fallback = false;
      _opts.controls = false;
      _opts.width = this.width;
      if (this.height) {
        _opts.height = this.height;
      }

      if (this.autostart) {
        // There seems to be an autostart bug
        //_opts.autostart = true;
        //_pauseState = false;
        //this.media.trigger("play");
      }

      if (this.url_transform) {
        _opts.file = this.url_transform(_opts.file);
      }

      // Binding functions to jwplayer

      var _media = this.media;

      _media.on("setcurrenttime", function (_milliseconds) {
        _seekPause = _pauseState;
        _player.seek(_milliseconds / 1000);
      });

      _media.on("setvolume", function (_vol) {
        _player.setVolume(Math.floor(_vol * 100));
        _media.volume = _vol;
      });

      _media.on("setmuted", function (_muted) {
        _player.setMute(_muted);
        _media.muted = _muted;
      });

      _media.on("setplay", function () {
        _player.play(true);
        _media.paused = false;
      });

      _media.on("setpause", function () {
        _player.pause(true);
        _media.paused = true;
      });

      // Binding jwplater events to media

      function getVolume() {
        _media.muted = _player.getMute();
        _media.volume = _player.getVolume() / 100;
      }

      _opts.events = {
        onReady: function () {
          getVolume();
          _media.currentTime = new ns.Model.Time(
            1000 * _player.getPosition() || 0
          );
          _media.trigger("loadedmetadata");
        },
        onTime: function (_progress) {
          if (_seekPause) {
            _player.pause(true);
            _seekPause = false;
          } else {
            if (_pauseState && _player.getState() === "PLAYING") {
              _pauseState = false;
              _media.trigger("play");
            }
          }
          _media.trigger(
            "timeupdate",
            new ns.Model.Time(_progress.position * 1000)
          );
        },
        onPlay: function () {
          if (!_seekPause) {
            _pauseState = false;
            _media.trigger("play");
          }
        },
        onPause: function () {
          _pauseState = true;
          _media.trigger("pause");
        },
        onSeek: function () {
          _media.trigger("seeked");
        },
        onMute: function (_event) {
          _media.muted = _event.mute;
          _media.trigger("volumechange");
        },
        onVolume: function (_event) {
          _media.volume = _event.volume / 100;
          _media.trigger("volumechange");
        },
      };

      _player = _player.setup(_opts);

      this.jwplayer = _player;
    }
  };
};

export { JwpPlayerWidget as JwpPlayer };
