// Copyright (C) 2016 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';

  // Maximum length for patch set descriptions.
  const PATCH_DESC_MAX_LENGTH = 500;

  Polymer({
    is: 'gr-patch-range-select',

    properties: {
      availablePatches: Array,
      changeNum: String,
      filesWeblinks: Object,
      path: String,
      patchRange: {
        type: Object,
        observer: '_updateSelected',
      },
      revisions: Object,
      _rightSelected: String,
      _leftSelected: String,
    },

    behaviors: [Gerrit.PatchSetBehavior],

    _updateSelected() {
      this._rightSelected = this.patchRange.patchNum;
      this._leftSelected = this.patchRange.basePatchNum;
    },

    _handlePatchChange(e) {
      const leftPatch = this._leftSelected;
      const rightPatch = this._rightSelected;
      let rangeStr = rightPatch;
      if (leftPatch != 'PARENT') {
        rangeStr = leftPatch + '..' + rangeStr;
      }
      page.show('/c/' + this.changeNum + '/' + rangeStr + '/' + this.path);
      e.target.blur();
    },

    _computeLeftDisabled(patchNum, patchRange) {
      return parseInt(patchNum, 10) >= parseInt(patchRange.patchNum, 10);
    },

    _computeRightDisabled(patchNum, patchRange) {
      if (patchRange.basePatchNum == 'PARENT') { return false; }
      return parseInt(patchNum, 10) <= parseInt(patchRange.basePatchNum, 10);
    },

    // On page load, the dom-if for options getting added occurs after
    // the value was set in the select. This ensures that after they
    // are loaded, the correct value will get selected.  I attempted to
    // debounce these, but because they are detecting two different
    // events, sometimes the timing was off and one ended up missing.
    _synchronizeSelectionRight() {
      this.$.rightPatchSelect.value = this._rightSelected;
    },

    _synchronizeSelectionLeft() {
      this.$.leftPatchSelect.value = this._leftSelected;
    },

    _computePatchSetDescription(revisions, patchNum) {
      const rev = this.getRevisionByPatchNum(revisions, patchNum);
      return (rev && rev.description) ?
          rev.description.substring(0, PATCH_DESC_MAX_LENGTH) : '';
    },
  });
})();
