;(function (define, undefined) {
'use strict';
define([
    'jquery',
    'underscore',
    'backbone',
    'edx-ui-toolkit/js/utils/html-utils',
    'js/edxnotes/models/tab'
], function ($, _, Backbone, HtmlUtils, TabModel) {
    var TabView = Backbone.View.extend({
        PanelConstructor: null,

        tabInfo: {
            name: '',
            class_name: ''
        },

        initialize: function (options) {
            _.bindAll(this, 'showLoadingIndicator', 'hideLoadingIndicator');
            this.options = _.defaults(options || {}, {
                createTabOnInitialization: true,
                createHeaderFooter: true
            });

            if (this.options.createTabOnInitialization) {
                this.createTab();
            }
        },

        /**
         * Creates a tab for the view.
         */
        createTab: function () {
            this.tabModel = new TabModel(this.tabInfo);
            this.options.tabsCollection.add(this.tabModel);
            this.listenTo(this.tabModel, {
                'change:is_active': function (model, value) {
                    if (value) {
                        this.render();
                    } else {
                        this.destroySubView();
                    }
                },
                'destroy': function () {
                    this.destroySubView();
                    this.tabModel = null;
                    this.onClose();
                }
            });
        },

        /**
         * Renders content for the view.
         */
        render: function () {
            this.hideErrorMessage().showLoadingIndicator();
            // If the view is already rendered, destroy it.
            this.destroySubView();
            this.renderContent().always(this.hideLoadingIndicator);
            this.$('.sr-is-focusable.sr-tab-panel').focus();
            return this;
        },

        renderContent: function () {
            this.contentView = this.getSubView();
            this.$('.wrapper-tabs').append(this.contentView.render().$el);
            return $.Deferred().resolve().promise();
        },

        getSubView: function () {
            var collection = this.getCollection();
            return new this.PanelConstructor(
                {
                    collection: collection,
                    scrollToTag: this.options.scrollToTag,
                    createHeaderFooter: this.options.createHeaderFooter
                }
            );
        },

        destroySubView: function () {
            if (this.contentView) {
                this.contentView.remove();
                this.contentView = null;
            }
        },

        /**
         * Returns collection for the view.
         * @return {Backbone.Collection}
         */
        getCollection: function () {
            return this.collection;
        },

        /**
         * Callback that is called on closing the tab.
         */
        onClose: function () { },

        /**
         * Returns the page's loading indicator.
         */
        getLoadingIndicator: function() {
            return this.$('.ui-loading');
        },

        /**
         * Shows the page's loading indicator.
         */
        showLoadingIndicator: function() {
            this.getLoadingIndicator().removeClass('is-hidden');
            return this;
        },

        /**
         * Hides the page's loading indicator.
         */
        hideLoadingIndicator: function() {
            this.getLoadingIndicator().addClass('is-hidden');
            return this;
        },


        /**
         * Shows error message.
         */
        showErrorMessageHtml: function (htmlMessage) {
            var $wrapper = this.$('.wrapper-msg');
            $wrapper.removeClass('is-hidden');

            HtmlUtils.setHtml($wrapper.find('.msg-content .copy'), htmlMessage);
            return this;
        },

        /**
         * Hides error message.
         */
        hideErrorMessage: function () {
            this.$('.wrapper-msg')
                .addClass('is-hidden')
                .find('.msg-content .copy').html('');

            return this;
        }
    });

    return TabView;
});
}).call(this, define || RequireJS.define);
