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

(function(define) {
    'use strict';
    define(
        ['jquery', 'underscore', 'gettext', 'backbone', 'js/certificates/models/certificate_invalidation'],

        function($, _, gettext, Backbone, CertificateInvalidationModel) {
            return Backbone.View.extend({
                el: '#certificate-invalidation',
                messages: 'div.message',
                events: {
                    'click #invalidate-certificate': 'invalidateCertificate',
                    'click .re-validate-certificate': 'reValidateCertificate'
                },

                initialize: function() {
                    this.listenTo(this.collection, 'change add remove', this.render);
                },

                render: function() {
                    var template = this.loadTemplate('certificate-invalidation');
                    this.$el.html(template({certificate_invalidations: this.collection.models}));
                },

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

                invalidateCertificate: function() {
                    var user = this.$('#certificate-invalidation-user').val();
                    var notes = this.$('#certificate-invalidation-notes').val();
                    var message = '';

                    var certificate_invalidation = new CertificateInvalidationModel(
                        {
                            user: user,
                            notes: notes
                        },
                        {
                            url: this.collection.url
                        }
                    );

                    if (this.collection.findWhere({user: user})) {
                        message = gettext('Certificate of <%= user %> has already been invalidated. Please check your spelling and retry.');  // eslint-disable-line max-len
                        this.escapeAndShowMessage(_.template(message)({user: user}));
                    } else if (certificate_invalidation.isValid()) {
                        var self = this;
                        certificate_invalidation.save(null, {
                            wait: true,

                            success: function(model) {
                                self.collection.add(model);
                                message = gettext('Certificate has been successfully invalidated for <%= user %>.');
                                self.escapeAndShowMessage(_.template(message)({user: user}));
                            },

                            error: function(model, response) {
                                try {
                                    var response_data = JSON.parse(response.responseText);
                                    self.escapeAndShowMessage(response_data.message);
                                } catch (exception) {
                                    self.escapeAndShowMessage(
                                        gettext('Server Error, Please refresh the page and try again.')
                                    );
                                }
                            }
                        });
                    } else {
                        this.escapeAndShowMessage(certificate_invalidation.validationError);
                    }
                },

                reValidateCertificate: function(event) {
                    var certificate_invalidation = $(event.target).data();
                    var model = this.collection.get(certificate_invalidation),
                        self = this;

                    if (model) {
                        model.destroy({
                            success: function() {
                                self.escapeAndShowMessage(
                                    gettext('The certificate for this learner has been re-validated and the system is re-running the grade for this learner.')  // eslint-disable-line max-len
                                );
                            },
                            error: function(model, response) {
                                try {
                                    var response_data = JSON.parse(response.responseText);
                                    self.escapeAndShowMessage(response_data.message);
                                } catch (exception) {
                                    self.escapeAndShowMessage(
                                        gettext('Server Error, Please refresh the page and try again.')
                                    );
                                }
                            },
                            wait: true,
                            data: JSON.stringify(model.attributes)
                        });
                    } else {
                        self.escapeAndShowMessage(
                            gettext('Could not find Certificate Invalidation in the list. Please refresh the page and try again')  // eslint-disable-line max-len
                        );
                    }
                },

                isEmailAddress: function validateEmail(email) {
                    var re = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
                    return re.test(email);
                },

                escapeAndShowMessage: function(message) {
                    $(this.messages + '>p').remove();
                    this.$(this.messages).removeClass('hidden').append('<p>' + _.escape(message) + '</p>');
                }

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