# Source: src/js/models/maps/AssetColor.js

    'use strict';

    define(
      [
        'jquery',
        'underscore',
        'backbone'
      ],
      function (
        $,
        _,
        Backbone
      ) {
        /**
         * @classdesc An AssetColor Model represents one color in a color scale that maps to
         * attributes of a Map Asset. For vector assets (e.g. Cesium3DTileset models), the
         * color is used to conditionally color vector data in a map (or plot).
         * @classcategory Models/Maps
         * @class AssetColor
         * @name AssetColor
         * @extends Backbone.Model
         * @since 2.18.0
         * @constructor
        */
        var AssetColor = Backbone.Model.extend(
          /** @lends AssetColor.prototype */ {

            /**
             * The name of this type of model
             * @type {string}
            */
            type: 'AssetColor',

            /**
             * A color to use in a map color palette, along with the value that the color
             * represents.
             * @typedef {Object} ColorConfig
             * @name MapConfig#ColorConfig
             * @property {string|number} value The value of the attribute in a MapAsset that
             * corresponds to this color. If set to null, then this color will be the default
             * color.
             * @property {string} [label] A user-facing name for this attribute value,
             * to show in map legends, etc. If not set, then the value will be displayed
             * instead.
             * @property {(string|AssetColor#Color)} color Either an object with 'red',
             * 'green', 'blue' properties defining the intensity of each of the three colours
             * with a value between 0 and 1, OR a string with a hex color code beginning with
             * #, e.g. '#44A96A'. The {@link AssetColor} model will convert the string to an
             * {@link AssetColor#Color} object.
             *
             * @example
             * {
             *   value: 0,
             *   label: 'water',
             *   color: {
             *     red: 0,
             *     green: 0.1,
             *     blue: 1
             *   }
             * }
             *
             * @example
             * {
             *   value: 'landmark',
             *   color: '#7B44A9'
             * }
             */

            /**
             * An object that defines the properties of a color
             * @typedef {Object} Color
             * @name AssetColor#Color
             * @property {number} [red=1] A number between 0 and 1 indicating the intensity of red
             * in this color.
             * @property {number} [blue=1] A number between 0 and 1 indicating the intensity of
             * red in this color.
             * @property {number} [green=1] A number between 0 and 1 indicating the intensity of
             * red in this color.
             */

            /**
             * Default attributes for AssetColor models
             * @name AssetColor#defaults
             * @type {Object}
             * @property {string|number} value The value of the attribute that corresponds to
             * this color. If set to null, then this color will be the default color.
             * @property {string} [label] A user-facing name for this attribute value,
             * to show in map legends, etc. If not set, then the value will be displayed
             * instead.
             * @property {AssetColor#Color} color The red, green, and blue intensities that define the
             * color
            */
            defaults: function () {
              return {
                value: null,
                label: null,
                color: {
                  red: 1,
                  blue: 1,
                  green: 1
                }
              }
            },

            /**
             * Executed when a new AssetColor model is created.
             * @param {MapConfig#ColorConfig} [colorConfig] The initial values of the
             * attributes, which will be set on the model.
             */
            initialize: function (colorConfig) {
              try {
                // If the color is a hex code instead of an object with RGB values, then
                // convert it.
                if (colorConfig && colorConfig.color && typeof colorConfig.color === 'string') {
                  // Assume the string is an hex color code and convert it to RGB
                  var rgb = this.hexToRGB(colorConfig.color)
                  if (rgb) {
                    this.set('color', rgb)
                  } else {
                    // Otherwise, the color is invalid, set it to the default
                    this.set('color', this.defaults().color)
                  }
                }
              }
              catch (error) {
                console.log(
                  'There was an error initializing a AssetColor model' +
                  '. Error details: ' + error
                );
              }
            },

            /**
             * Converts hex color values to RGB values between 0 and 1
             *
             * @param {string} hex a color in hexadecimal format
             * @return {Color} a color in RGB format
            */
            hexToRGB: function (hex) {
              var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
              return result ? {
                red: parseInt(result[1], 16) / 255,
                green: parseInt(result[2], 16) / 255,
                blue: parseInt(result[3], 16) / 255
              } : null;
            },

            // /**
            //  * Parses the given input into a JSON object to be set on the model.
            //  *
            //  * @param {TODO} input - The raw response object
            //  * @return {TODO} - The JSON object of all the AssetColor attributes
            //  */
            // parse: function (input) {

            //   try {
            //     // var modelJSON = {};

            //     // return modelJSON

            //   }
            //   catch (error) {
            //     console.log(
            //       'There was an error parsing a AssetColor model' +
            //       '. Error details: ' + error
            //     );
            //   }

            // },

            // /**
            //  * Overrides the default Backbone.Model.validate.function() to check if this if
            //  * the values set on this model are valid.
            //  *
            //  * @param {Object} [attrs] - A literal object of model attributes to validate.
            //  * @param {Object} [options] - A literal object of options for this validation
            //  * process
            //  *
            //  * @return {Object} - Returns a literal object with the invalid attributes and
            //  * their corresponding error message, if there are any. If there are no errors,
            //  * returns nothing.
            //  */
            // validate: function (attrs, options) {
            //   try {

            //   }
            //   catch (error) {
            //     console.log(
            //       'There was an error validating a AssetColor model' +
            //       '. Error details: ' + error
            //     );
            //   }
            // },

            // /**
            //  * Creates a string using the values set on this model's attributes.
            //  * @return {string} The AssetColor string
            //  */
            // serialize: function () {
            //   try {
            //     var serializedAssetColor = "";

            //     return serializedAssetColor;
            //   }
            //   catch (error) {
            //     console.log(
            //       'There was an error serializing a AssetColor model' +
            //       '. Error details: ' + error
            //     );
            //   }
            // },

          });

        return AssetColor;

      }
    );