<!--
@license
Copyright (C) 2017 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.
-->
<link rel="import" href="../../../behaviors/gr-patch-set-behavior/gr-patch-set-behavior.html">
<script>
  (function() {
    'use strict';

    /**
     * @param {Object} change A change object resulting from a change detail
     *     call that includes revision information.
     */
    function RevisionInfo(change) {
      this._change = change;
    }

    /**
     * Get the largest number of parents of the commit in any revision. For
     * example, with normal changes this will always return 1. For merge changes
     * wherein the revisions are merge commits this will return 2 or potentially
     * more.
     *
     * @return {Number}
     */
    RevisionInfo.prototype.getMaxParents = function() {
      return Object.values(this._change.revisions)
          .reduce((acc, rev) => Math.max(rev.commit.parents.length, acc), 0);
    };

    /**
     * Get an object that maps revision numbers to the number of parents of the
     * commit of that revision.
     *
     * @return {!Object}
     */
    RevisionInfo.prototype.getParentCountMap = function() {
      const result = {};
      Object.values(this._change.revisions)
          .forEach(rev => { result[rev._number] = rev.commit.parents.length; });
      return result;
    };

    /**
     * @param {number|string} patchNum
     * @return {number}
     */
    RevisionInfo.prototype.getParentCount = function(patchNum) {
      return this.getParentCountMap()[patchNum];
    };

    /**
     * Get the commit ID of the (0-offset) indexed parent in the given revision
     * number.
     *
     * @param {number|string} patchNum
     * @param {number} parentIndex (0-offset)
     * @return {string}
     */
    RevisionInfo.prototype.getParentId = function(patchNum, parentIndex) {
      const rev = Object.values(this._change.revisions).find(rev =>
        Gerrit.PatchSetBehavior.patchNumEquals(rev._number, patchNum));
      return rev.commit.parents[parentIndex].commit;
    };

    if (!window.Gerrit) {
      window.Gerrit = {};
    }
    window.Gerrit.RevisionInfo = RevisionInfo;
  })();
</script>
