// 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';

  Polymer({
    is: 'gr-confirm-rebase-dialog',

    /**
     * Fired when the confirm button is pressed.
     *
     * @event confirm
     */

    /**
     * Fired when the cancel button is pressed.
     *
     * @event cancel
     */

    properties: {
      base: String,
      branch: String,
      hasParent: Boolean,
      rebaseOnCurrent: Boolean,
    },

    observers: [
      '_updateSelectedOption(rebaseOnCurrent, hasParent)',
    ],

    _displayParentOption(rebaseOnCurrent, hasParent) {
      return hasParent && rebaseOnCurrent;
    },

    _displayParentUpToDateMsg(rebaseOnCurrent, hasParent) {
      return hasParent && !rebaseOnCurrent;
    },

    _displayTipOption(rebaseOnCurrent, hasParent) {
      return !(!rebaseOnCurrent && !hasParent);
    },

    _handleConfirmTap(e) {
      e.preventDefault();
      this.fire('confirm', null, {bubbles: false});
    },

    _handleCancelTap(e) {
      e.preventDefault();
      this.fire('cancel', null, {bubbles: false});
    },

    _handleRebaseOnOther(e) {
      this.$.parentInput.focus();
    },

    /**
     * There is a subtle but important difference between setting the base to an
     * empty string and omitting it entirely from the payload. An empty string
     * implies that the parent should be cleared and the change should be
     * rebased on top of the target branch. Leaving out the base implies that it
     * should be rebased on top of its current parent.
     */
    _handleRebaseOnTip(e) {
      this.base = '';
    },

    _handleRebaseOnParent(e) {
      this.base = null;
    },

    _handleEnterChangeNumberTap(e) {
      this.$.rebaseOnOtherInput.checked = true;
    },

    /**
     * Sets the default radio button based on the state of the app and
     * the corresponding value to be submitted.
     */
    _updateSelectedOption(rebaseOnCurrent, hasParent) {
      if (this._displayParentOption(rebaseOnCurrent, hasParent)) {
        this.$.rebaseOnParentInput.checked = true;
        this._handleRebaseOnParent();
      } else if (this._displayTipOption(rebaseOnCurrent, hasParent)) {
        this.$.rebaseOnTipInput.checked = true;
        this._handleRebaseOnTip();
      } else {
        this.$.rebaseOnOtherInput.checked = true;
        this._handleRebaseOnOther();
      }
    },
  });
})();
