/**
 * @license
 * Copyright (C) 2018 The Android Open Source Project
 *
 * 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.
 */
(function() {
  'use strict';

  /**
    * @appliesMixin Gerrit.RepoPluginConfigMixin
    */
  class GrRepoPluginConfig extends Polymer.mixinBehaviors( [
    Gerrit.RepoPluginConfig,
  ], Polymer.GestureEventListeners(
      Polymer.LegacyElementMixin(
          Polymer.Element))) {
    static get is() { return 'gr-repo-plugin-config'; }
    /**
     * Fired when the plugin config changes.
     *
     * @event plugin-config-changed
     */

    static get properties() {
      return {
      /** @type {?} */
        pluginData: Object,
        /** @type {Array} */
        _pluginConfigOptions: {
          type: Array,
          computed: '_computePluginConfigOptions(pluginData.*)',
        },
      };
    }

    _computePluginConfigOptions(dataRecord) {
      if (!dataRecord || !dataRecord.base || !dataRecord.base.config) {
        return [];
      }
      const {config} = dataRecord.base;
      return Object.keys(config).map(_key => ({_key, info: config[_key]}));
    }

    _isArray(type) {
      return type === this.ENTRY_TYPES.ARRAY;
    }

    _isBoolean(type) {
      return type === this.ENTRY_TYPES.BOOLEAN;
    }

    _isList(type) {
      return type === this.ENTRY_TYPES.LIST;
    }

    _isString(type) {
      // Treat numbers like strings for simplicity.
      return type === this.ENTRY_TYPES.STRING ||
          type === this.ENTRY_TYPES.INT ||
          type === this.ENTRY_TYPES.LONG;
    }

    _computeDisabled(editable) {
      return editable === 'false';
    }

    _computeChecked(value) {
      return JSON.parse(value);
    }

    _handleStringChange(e) {
      const el = Polymer.dom(e).localTarget;
      const _key = el.getAttribute('data-option-key');
      const configChangeInfo =
          this._buildConfigChangeInfo(el.value, _key);
      this._handleChange(configChangeInfo);
    }

    _handleListChange(e) {
      const el = Polymer.dom(e).localTarget;
      const _key = el.getAttribute('data-option-key');
      const configChangeInfo =
          this._buildConfigChangeInfo(el.value, _key);
      this._handleChange(configChangeInfo);
    }

    _handleBooleanChange(e) {
      const el = Polymer.dom(e).localTarget;
      const _key = el.getAttribute('data-option-key');
      const configChangeInfo =
          this._buildConfigChangeInfo(JSON.stringify(el.checked), _key);
      this._handleChange(configChangeInfo);
    }

    _buildConfigChangeInfo(value, _key) {
      const info = this.pluginData.config[_key];
      info.value = value;
      return {
        _key,
        info,
        notifyPath: `${_key}.value`,
      };
    }

    _handleArrayChange({detail}) {
      this._handleChange(detail);
    }

    _handleChange({_key, info, notifyPath}) {
      const {name, config} = this.pluginData;

      /** @type {Object} */
      const detail = {
        name,
        config: Object.assign(config, {[_key]: info}, {}),
        notifyPath: `${name}.${notifyPath}`,
      };

      this.dispatchEvent(new CustomEvent(
          this.PLUGIN_CONFIG_CHANGED, {detail, bubbles: true, composed: true}));
    }
  }

  customElements.define(GrRepoPluginConfig.is, GrRepoPluginConfig);
})();
