/**
 * Model for Course Programs.
 */
(function (define) {
    'use strict';
    define([
            'backbone'
        ], 
        function (Backbone) {
        return Backbone.Model.extend({
            initialize: function(data) {
                if (data) {
                    this.context = data;
                    this.setActiveRunMode(this.getRunMode(data.run_modes));
                }
            },

            getUnselectedRunMode: function(runModes) {      
                if(runModes && runModes.length > 0) {  
                    return {
                        course_image_url: runModes[0].course_image_url,
                        marketing_url: runModes[0].marketing_url,
                        is_enrollment_open: runModes[0].is_enrollment_open
                    };
                }

                return {};
            },

            getRunMode: function(runModes) {
                var enrolled_mode = _.findWhere(runModes, {is_enrolled: true}),
                    openEnrollmentRunModes = this.getEnrollableRunModes(),
                    desiredRunMode;
                // We populate our model by looking at the run modes.
                if (enrolled_mode) {
                    // If the learner is already enrolled in a run mode, return that one.
                    desiredRunMode = enrolled_mode;
                } else if (openEnrollmentRunModes.length > 0) {
                    if (openEnrollmentRunModes.length === 1) {
                        desiredRunMode = openEnrollmentRunModes[0];
                    } else {
                        desiredRunMode = this.getUnselectedRunMode(openEnrollmentRunModes);
                    }
                } else {
                    desiredRunMode = this.getUnselectedRunMode(runModes); 
                }

                return desiredRunMode;
            },

            getEnrollableRunModes: function() {
                return _.where(this.context.run_modes, {
                    is_enrollment_open: true,
                    is_enrolled: false,
                    is_course_ended: false
                });
            },

            getUpcomingRunModes: function() {
                return _.where(this.context.run_modes, {
                    is_enrollment_open: false,
                    is_enrolled: false,
                    is_course_ended: false
                });
            },

            setActiveRunMode: function(runMode){
                if (runMode){
                    this.set({
                        certificate_url: runMode.certificate_url,
                        course_image_url: runMode.course_image_url || '',
                        course_key: runMode.course_key,
                        course_url: runMode.course_url || '',
                        display_name: this.context.display_name,
                        end_date: runMode.end_date,
                        enrollable_run_modes: this.getEnrollableRunModes(),
                        is_course_ended: runMode.is_course_ended,
                        is_enrolled: runMode.is_enrolled,
                        is_enrollment_open: runMode.is_enrollment_open,
                        key: this.context.key,
                        marketing_url: runMode.marketing_url,
                        mode_slug: runMode.mode_slug,
                        run_key: runMode.run_key,
                        start_date: runMode.start_date,
                        upcoming_run_modes: this.getUpcomingRunModes(),
                        upgrade_url: runMode.upgrade_url
                    });
                }
            },

            setUnselected: function() {
                // Called to reset the model back to the unselected state.
                var unselectedMode = this.getUnselectedRunMode(this.get('enrollable_run_modes'));
                this.setActiveRunMode(unselectedMode);
            },

            updateRun: function(runKey){
                var selectedRun = _.findWhere(this.get('run_modes'), {run_key: runKey});
                if (selectedRun) {
                    this.setActiveRunMode(selectedRun);
                }
            }
        });
    });
}).call(this, define || RequireJS.define);
