define([
    "js/views/baseview",
    "underscore",
    "text!templates/license-selector.underscore"
], function(BaseView, _, licenseSelectorTemplate) {
    var defaultLicenseInfo = {
        "all-rights-reserved": {
            "name": gettext("All Rights Reserved"),
            "tooltip": gettext("You reserve all rights for your work")
        },
        "creative-commons": {
            "name": gettext("Creative Commons"),
            "tooltip": gettext("You waive some rights for your work, such that others can use it too"),
            "url": "https://creativecommons.org/about",
            "options": {
                "ver": {
                    "name": gettext("Version"),
                    "type": "string",
                    "default": "4.0",
                },
                "BY": {
                    "name": gettext("Attribution"),
                    "type": "boolean",
                    "default": true,
                    "help": gettext("Allow others to copy, distribute, display and perform your copyrighted work but only if they give credit the way you request. Currently, this option is required."),
                    "disabled": true,
                },
                "NC": {
                    "name": gettext("Noncommercial"),
                    "type": "boolean",
                    "default": true,
                    "help": gettext("Allow others to copy, distribute, display and perform your work - and derivative works based upon it - but for noncommercial purposes only."),
                },
                "ND": {
                    "name": gettext("No Derivatives"),
                    "type": "boolean",
                    "default": true,
                    "help": gettext("Allow others to copy, distribute, display and perform only verbatim copies of your work, not derivative works based upon it. This option is incompatible with \"Share Alike\"."),
                    "conflictsWith": ["SA"]
                },
                "SA": {
                    "name": gettext("Share Alike"),
                    "type": "boolean",
                    "default": false,
                    "help": gettext("Allow others to distribute derivative works only under a license identical to the license that governs your work. This option is incompatible with \"No Derivatives\"."),
                    "conflictsWith": ["ND"]
                }
            },
            "option_order": ["BY", "NC", "ND", "SA"]
        }
    }

    var LicenseView = BaseView.extend({
        events: {
            "click ul.license-types li button" : "onLicenseClick",
            "click ul.license-options li": "onOptionClick"
        },

        initialize: function(options) {
            this.licenseInfo = options.licenseInfo || defaultLicenseInfo;
            this.showPreview = !!options.showPreview; // coerce to boolean

            // Rerender when the model changes
            this.listenTo(this.model, 'change', this.render);
            this.render();
        },

        getDefaultOptionsForLicenseType: function(licenseType) {
            if (!this.licenseInfo[licenseType]) {
                // custom license type, no options
                return {};
            }
            if (!this.licenseInfo[licenseType].options) {
                // defined license type without options
                return {};
            }
            var defaults = {};
            _.each(this.licenseInfo[licenseType].options, function(value, key) {
                defaults[key] = value.default;
            })
            return defaults;
        },

        render: function() {
            this.$el.html(_.template(licenseSelectorTemplate)({
                model: this.model.attributes,
                licenseString: this.model.toString() || "",
                licenseInfo: this.licenseInfo,
                showPreview: this.showPreview,
                previewButton: false,
            }));
            return this;
        },

        onLicenseClick: function(e) {
            var $li = $(e.srcElement || e.target).closest('li');
            var licenseType = $li.data("license");

	    // Check that we've selected a different license type than what's currently selected
	    if (licenseType != this.model.attributes.type) {
		this.model.set({
                    "type": licenseType,
                    "options": this.getDefaultOptionsForLicenseType(licenseType)
		});
		// Fire the change event manually
		this.model.trigger("change change:type")
	    }
	    e.preventDefault();
        },

        onOptionClick: function(e) {
            var licenseType = this.model.get("type"),
                licenseOptions = $.extend({}, this.model.get("options")),
                $li = $(e.srcElement || e.target).closest('li');

            var optionKey = $li.data("option")
            var licenseInfo = this.licenseInfo[licenseType];
            var optionInfo = licenseInfo.options[optionKey];
            if (optionInfo.disabled) {
                // we're done here
                return;
            }
            var currentOptionValue = licenseOptions[optionKey];
            if (optionInfo.type === "boolean") {
                // toggle current value
                currentOptionValue = !currentOptionValue;
                licenseOptions[optionKey] = currentOptionValue;
            }
            // check for conflicts
            if (currentOptionValue && optionInfo.conflictsWith) {
		var conflicts = optionInfo.conflictsWith;
		for (var i=0; i<conflicts.length; i++) {
		    // Uncheck all conflicts
		    licenseOptions[conflicts[i]] = false;
		    console.log(licenseOptions);
		}
            }

            this.model.set({"options": licenseOptions})
            // Backbone has trouble identifying when objects change, so we'll
            // fire the change event manually.
            this.model.trigger("change change:options")
            e.preventDefault();
        }

    });
    return LicenseView;
});
