// 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-revert-dialog',

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

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

    properties: {
      branch: String,
      message: String,
      commitInfo: {
        type: Object,
        readOnly: true,
        observer: '_commitInfoChanged',
      },
    },

    _commitInfoChanged: function(commitInfo) {
      // Strip 'Change-Id: xxx'
      var commitMessage = commitInfo.message.replace(
          /\n{1,2}\nChange-Id: \w+\n/gm, '');
      var revertCommitText = 'This reverts commit ';
      // Selector for previous revert text and commit.
      var previousRevertText =
          new RegExp('\n{1,2}' + revertCommitText + '\\w+.\n*', 'gm');
      commitMessage = commitMessage.replace(previousRevertText, '');
      this.message = 'Revert "' + commitMessage + '"\n\n' +
          revertCommitText + commitInfo.commit + '.';
    },

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

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