/**
 * @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.RESTClientMixin
    */
  class GrChangeRequirements extends Polymer.mixinBehaviors( [
    Gerrit.RESTClientBehavior,
  ], Polymer.GestureEventListeners(
      Polymer.LegacyElementMixin(
          Polymer.Element))) {
    static get is() { return 'gr-change-requirements'; }

    static get properties() {
      return {
      /** @type {?} */
        change: Object,
        account: Object,
        mutable: Boolean,
        _requirements: {
          type: Array,
          computed: '_computeRequirements(change)',
        },
        _requiredLabels: {
          type: Array,
          value: () => [],
        },
        _optionalLabels: {
          type: Array,
          value: () => [],
        },
        _showWip: {
          type: Boolean,
          computed: '_computeShowWip(change)',
        },
        _showOptionalLabels: {
          type: Boolean,
          value: true,
        },
      };
    }

    static get observers() {
      return [
        '_computeLabels(change.labels.*)',
      ];
    }

    _computeShowWip(change) {
      return change.work_in_progress;
    }

    _computeRequirements(change) {
      const _requirements = [];

      if (change.requirements) {
        for (const requirement of change.requirements) {
          requirement.satisfied = requirement.status === 'OK';
          requirement.style =
              this._computeRequirementClass(requirement.satisfied);
          _requirements.push(requirement);
        }
      }
      if (change.work_in_progress) {
        _requirements.push({
          fallback_text: 'Work-in-progress',
          tooltip: 'Change must not be in \'Work in Progress\' state.',
        });
      }

      return _requirements;
    }

    _computeRequirementClass(requirementStatus) {
      return requirementStatus ? 'approved' : '';
    }

    _computeRequirementIcon(requirementStatus) {
      return requirementStatus ? 'gr-icons:check' : 'gr-icons:hourglass';
    }

    _computeLabels(labelsRecord) {
      const labels = labelsRecord.base;
      this._optionalLabels = [];
      this._requiredLabels = [];

      for (const label in labels) {
        if (!labels.hasOwnProperty(label)) { continue; }

        const labelInfo = labels[label];
        const icon = this._computeLabelIcon(labelInfo);
        const style = this._computeLabelClass(labelInfo);
        const path = labelInfo.optional ? '_optionalLabels' : '_requiredLabels';

        this.push(path, {label, icon, style, labelInfo});
      }
    }

    /**
     * @param {Object} labelInfo
     * @return {string} The icon name, or undefined if no icon should
     *     be used.
     */
    _computeLabelIcon(labelInfo) {
      if (labelInfo.approved) { return 'gr-icons:check'; }
      if (labelInfo.rejected) { return 'gr-icons:close'; }
      return 'gr-icons:hourglass';
    }

    /**
     * @param {Object} labelInfo
     */
    _computeLabelClass(labelInfo) {
      if (labelInfo.approved) { return 'approved'; }
      if (labelInfo.rejected) { return 'rejected'; }
      return '';
    }

    _computeShowOptional(optionalFieldsRecord) {
      return optionalFieldsRecord.base.length ? '' : 'hidden';
    }

    _computeLabelValue(value) {
      return (value > 0 ? '+' : '') + value;
    }

    _computeShowHideIcon(showOptionalLabels) {
      return showOptionalLabels ?
        'gr-icons:expand-less' :
        'gr-icons:expand-more';
    }

    _computeSectionClass(show) {
      return show ? '' : 'hidden';
    }

    _handleShowHide(e) {
      this._showOptionalLabels = !this._showOptionalLabels;
    }
  }

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