/*****************************************************************************
 * Open MCT, Copyright (c) 2014-2018, United States Government
 * as represented by the Administrator of the National Aeronautics and Space
 * Administration. All rights reserved.
 *
 * Open MCT is licensed under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * http://www.apache.org/licenses/LICENSE-2.0.
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 *
 * Open MCT includes source code licensed under additional open source
 * licenses. See the Open Source Licenses file (LICENSES.md) included with
 * this source code distribution or the Licensing information page available
 * at runtime from the About dialog for additional information.
 *****************************************************************************/

define([
    './PlotModelFormController',
    'lodash'
], function (
    PlotModelFormController,
    _
) {

    function dynamicPathForKey(key) {
        return function (object, model) {
            var modelIdentifier = model.get('identifier');
            var index = _.findIndex(object.configuration.series, function (s) {
                return _.isEqual(s.identifier, modelIdentifier);
            });
            return 'configuration.series[' + index + '].' + key;
        };
    }

    var PlotSeriesFormController = PlotModelFormController.extend({

        /**
         * Set the color for the current plot series.  If the new color was
         * already assigned to a different plot series, then swap the colors.
         */
        setColor: function (color) {
            var oldColor = this.model.get('color');
            var otherSeriesWithColor = this.model.collection.filter(function (s) {
                return s.get('color') === color;
            })[0];


            this.model.set('color', color);

            var getPath = dynamicPathForKey('color');
            var seriesColorPath = getPath(this.domainObject, this.model);

            this.openmct.objects.mutate(
                this.domainObject,
                seriesColorPath,
                color.asHexString()
            );

            if (otherSeriesWithColor) {
                otherSeriesWithColor.set('color', oldColor);

                var otherSeriesColorPath = getPath(
                    this.domainObject,
                    otherSeriesWithColor
                );

                this.openmct.objects.mutate(
                    this.domainObject,
                    otherSeriesColorPath,
                    oldColor.asHexString()
                );
            }
        },

        /**
         * Populate scope with options and add setColor callback.
         */
        initialize: function () {
            this.$scope.setColor = this.setColor.bind(this);

            var metadata = this.model.metadata;
            this.$scope.yKeyOptions = metadata
                .valuesForHints(['range'])
                .map(function (o) {
                    return {
                        name: o.key,
                        value: o.key
                    };
                });
        },

        fields: [
            {
                modelProp: 'yKey',
                objectPath: dynamicPathForKey('yKey')
            },
            {
                modelProp: 'interpolate',
                objectPath: dynamicPathForKey('interpolate')
            },
            {
                modelProp: 'markers',
                objectPath: dynamicPathForKey('markers')
            },
            {
                modelProp: 'markerSize',
                coerce: Number,
                objectPath: dynamicPathForKey('markerSize')
            },
            {
                modelProp: 'alarmMarkers',
                coerce: Boolean,
                objectPath: dynamicPathForKey('alarmMarkers')
            }
        ]
    });

    return PlotSeriesFormController;
});

