Template.studyDateList.helpers({
    /**
     * Returns an array of studies that are related to the current study by patient ID.
     * The value for 'selected' for the currently loaded study is set to true, so that
     * this becomes the current option in the combo box.
     *
     * @returns {*} Array of studies that are related to the current study by patient ID
     */
    relatedStudies: function() {
        // Check which study is currently loaded into the study browser
        var currentStudyInBrowser = ViewerStudies.findOne({
            selected: true
        });

        // Find all Timepoint-associated studies which have the same patientId as the currently selected study
        var relatedStudies = Studies.find({
            patientId: currentStudyInBrowser.patientId
        }, {
            sort: {
                studyDate: -1
            }
        }).fetch();

        // If no Study / Timepoint associated studies exist, just
        // return the list of loaded studies
        if (!relatedStudies.length) {
            return ViewerStudies.find();
        }

        // Modify the array of related studies so the default option is the currently selected study
        relatedStudies.forEach(function(study, index) {
            // If the studyInstanceUid matches that of the current study in the browser,
            // Set this to 'selected', so that it becomes the default option
            if (study.studyInstanceUid === currentStudyInBrowser.studyInstanceUid) {
                relatedStudies[index].selected = true;
            }
        });

        // Use this array to populate the combo box
        return relatedStudies;
    },
    timepointName: function() {
        var data = this;
        var study = Studies.findOne({
            studyInstanceUid: data.studyInstanceUid
        });

        if (!study) {
            return;
        }

        var timepoint = Timepoints.findOne({
            timepointId: study.timepointId
        });

        if (!timepoint) {
            return;
        }

        return getTimepointName(timepoint);
    }
});

Template.studyDateList.events({
    /**
     * When the study date selector combo box is changed, we will
     * hide the select box, temporarily display a loading sign, and grab
     * the selected study. Once the study has been retrieved it is added
     * into the ViewerStudies collection and set as selected. This reactively
     * populated the thumbnail browser.
     *
     * @param e The select box change event
     */
    'change select#selectStudyDate': function(e) {
        var selectBox = $(e.currentTarget);
        var studyInstanceUid = selectBox.val();

        // Hide the select box
        selectBox.css('display', 'none');

        // Show the loading indicator
        var loadingIndicator = selectBox.siblings('.loading');
        loadingIndicator.css('display', 'block');

        getStudyMetadata(studyInstanceUid, function(study) {
            sortStudy(study);

            // Hide the loading indicator
            loadingIndicator.css('display', 'none');

            // Show the select box again
            selectBox.css('display', 'block');

            // Set "Selected" to false for the entire collection
            ViewerStudies.update({}, {
                $set: {
                    selected: false
                }
            }, {
                multi: true
            });

            // Check if this study already exists in the ViewerStudies collection
            // of loaded studies. If it does, set it's 'selected' value to true.
            var existingStudy = ViewerStudies.findOne({
                studyInstanceUid: studyInstanceUid
            });

            if (existingStudy) {
                // Set the current finding in the collection to true
                ViewerStudies.update(existingStudy._id, {
                    $set: {
                        selected: true
                    }
                });
                return;
            }

            // If the study does not exist, add the 'selected' key to the object
            // with the value True, and insert it into the ViewerStudies Collection
            study.selected = true;
            ViewerStudies.insert(study);
        });
    }
});
