(function(define) {
    'use strict';
    define('video/09_bumper.js', [], function() {
    /**
     * VideoBumper module.
     * @exports video/09_bumper.js
     * @constructor
     * @param {Object} player The player factory.
     * @param {Object} state The object containing the state of the video
     * @return {jquery Promise}
     */
        var VideoBumper = function(player, state) {
            if (!(this instanceof VideoBumper)) {
                return new VideoBumper(player, state);
            }

            _.bindAll(
            this, 'showMainVideoHandler', 'destroy', 'skipByDuration', 'destroyAndResolve'
        );
            this.dfd = $.Deferred();
            this.element = state.el;
            this.element.addClass('is-bumper');
            this.player = player;
            this.state = state;
            this.doNotShowAgain = false;
            this.state.videoBumper = this;
            this.bindHandlers();
            this.initialize();
            this.maxBumperDuration = 35; // seconds
        };

        VideoBumper.prototype = {
            initialize: function() {
                this.player();
            },

            getPromise: function() {
                return this.dfd.promise();
            },

            showMainVideoHandler: function() {
                this.state.storage.setItem('isBumperShown', true);
                setTimeout(function() {
                    this.saveState();
                    this.showMainVideo();
                }.bind(this), 20);
            },

            destroyAndResolve: function() {
                this.destroy();
                this.dfd.resolve();
            },

            showMainVideo: function() {
                if (this.state.videoPlayer) {
                    this.destroyAndResolve();
                } else {
                    this.state.el.on('initialize', this.destroyAndResolve);
                }
            },

            skip: function() {
                this.element.trigger('skip', [this.doNotShowAgain]);
                this.showMainVideoHandler();
            },

            skipAndDoNotShowAgain: function() {
                this.doNotShowAgain = true;
                this.skip();
            },

            skipByDuration: function(event, time) {
                if (time > this.maxBumperDuration) {
                    this.element.trigger('ended');
                }
            },

            bindHandlers: function() {
                var events = ['ended', 'error'].join(' ');
                this.element.on(events, this.showMainVideoHandler);
                this.element.on('timeupdate', this.skipByDuration);
            },

            saveState: function() {
                var info = {bumper_last_view_date: true};
                if (this.doNotShowAgain) {
                    _.extend(info, {bumper_do_not_show_again: true});
                }
                if (this.state.videoSaveStatePlugin) {
                    this.state.videoSaveStatePlugin.saveState(true, info);
                }
            },

            destroy: function() {
                var events = ['ended', 'error'].join(' ');
                this.element.off(events, this.showMainVideoHandler);
                this.element.off({
                    timeupdate: this.skipByDuration,
                    initialize: this.destroyAndResolve
                });
                this.element.removeClass('is-bumper');
                if (_.isFunction(this.state.videoPlayer.destroy)) {
                    this.state.videoPlayer.destroy();
                }
                delete this.state.videoBumper;
            }
        };

        return VideoBumper;
    });
}(RequireJS.define));
