// Backbone Application View: CertificateWhitelist View
/* global define, RequireJS */

(function(define) {
    'use strict';

    define([
        'jquery',
        'underscore',
        'gettext',
        'backbone'
    ],

        function($, _, gettext, Backbone) {
            return Backbone.View.extend({
                el: '#white-listed-students',
                message_div: 'div.white-listed-students > div.message',
                generate_exception_certificates_radio:
                    'input:radio[name=generate-exception-certificates-radio]:checked',

                events: {
                    'click #generate-exception-certificates': 'generateExceptionCertificates',
                    'click .delete-exception': 'removeException'
                },

                initialize: function(options) {
                    this.certificateWhiteListEditorView = options.certificateWhiteListEditorView;
                    this.active_certificate = options.active_certificate;
                    // Re-render the view when an item is added to the collection
                    this.listenTo(this.collection, 'change add remove', this.render);
                },

                render: function() {
                    var template = this.loadTemplate('certificate-white-list');
                    this.$el.html(template({certificates: this.collection.models}));
                    if (!this.active_certificate || this.collection.isEmpty()) {
                        this.$('#generate-exception-certificates').attr('disabled', 'disabled');
                    } else {
                        this.$('#generate-exception-certificates').removeAttr('disabled');
                    }
                },

                loadTemplate: function(name) {
                    var templateSelector = '#' + name + '-tpl',
                        templateText = $(templateSelector).text();
                    return _.template(templateText);
                },

                removeException: function(event) {
                    var certificate = $(event.target).data();
                    var model = this.collection.findWhere(certificate);
                    var self = this;
                    if (model) {
                        model.destroy(
                            {
                                success: function() {
                                    self.escapeAndShowMessage(
                                        gettext('Student Removed from certificate white list successfully.')
                                    );
                                },
                                error: this.showError(this),
                                wait: true,
                                data: JSON.stringify(model.attributes)
                            }
                        );
                    } else {
                        this.escapeAndShowMessage(
                            gettext('Could not find Certificate Exception in white list. Please refresh the page and try again')  // eslint-disable-line max-len
                        );
                    }
                },

                generateExceptionCertificates: function() {
                    this.collection.sync(
                        {success: this.showSuccess(this), error: this.showError(this)},
                        $(this.generate_exception_certificates_radio).val()
                    );
                },

                escapeAndShowMessage: function(message) {
                    $(this.message_div + '>p').remove();
                    $(this.message_div).removeClass('hidden').append('<p>' + _.escape(message) + '</p>').focus();
                    $(this.message_div).fadeOut(6000, 'linear');
                },

                showSuccess: function(caller_object) {
                    return function(xhr) {
                        caller_object.escapeAndShowMessage(xhr.message);
                    };
                },

                showError: function(caller_object) {
                    return function(xhr) {
                        try {
                            var response = JSON.parse(xhr.responseText);
                            caller_object.escapeAndShowMessage(response.message);
                        } catch (exception) {
                            caller_object.escapeAndShowMessage(
                                gettext('Server Error, Please refresh the page and try again.')
                            );
                        }
                    };
                }
            });
        }
    );
}).call(this, define || RequireJS.define);