/**
 * @license
 * 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(window, GrDiffLine) {
  'use strict';

  // Prevent redefinition.
  if (window.GrDiffGroup) { return; }

  /**
   * A chunk of the diff that should be rendered together.
   *
   * @param {!GrDiffGroup.Type} type
   * @param {!Array<!GrDiffLine>=} opt_lines
   */
  function GrDiffGroup(type, opt_lines) {
    /** @type {!GrDiffGroup.Type} */
    this.type = type;

    /** @type {boolean} */
    this.dueToRebase = false;

    /**
     * True means all changes in this line are whitespace changes that should
     * not be highlighted as changed as per the user settings.
     * @type{boolean}
     */
    this.ignoredWhitespaceOnly = false;

    /**
     * True means it should not be collapsed (because it was in the URL, or
     * there is a comment on that line)
     */
    this.keyLocation = false;

    /** @type {?HTMLElement} */
    this.element = null;

    /** @type {!Array<!GrDiffLine>} */
    this.lines = [];
    /** @type {!Array<!GrDiffLine>} */
    this.adds = [];
    /** @type {!Array<!GrDiffLine>} */
    this.removes = [];

    /** Both start and end line are inclusive. */
    this.lineRange = {
      left: {start: null, end: null},
      right: {start: null, end: null},
    };

    if (opt_lines) {
      opt_lines.forEach(this.addLine, this);
    }
  }

  /** @enum {string} */
  GrDiffGroup.Type = {
    /** Unchanged context. */
    BOTH: 'both',

    /** A widget used to show more context. */
    CONTEXT_CONTROL: 'contextControl',

    /** Added, removed or modified chunk. */
    DELTA: 'delta',
  };


  /**
   * Hides lines in the given range behind a context control group.
   *
   * Groups that would be partially visible are split into their visible and
   * hidden parts, respectively.
   * The groups need to be "common groups", meaning they have to have either
   * originated from an `ab` chunk, or from an `a`+`b` chunk with
   * `common: true`.
   *
   * If the hidden range is 1 line or less, nothing is hidden and no context
   * control group is created.
   *
   * @param {!Array<!GrDiffGroup>} groups Common groups, ordered by their line
   *     ranges.
   * @param {number} hiddenStart The first element to be hidden, as a
   *     non-negative line number offset relative to the first group's start
   *     line, left and right respectively.
   * @param {number} hiddenEnd The first visible element after the hidden range,
   *     as a non-negative line number offset relative to the first group's
   *     start line, left and right respectively.
   * @return {!Array<!GrDiffGroup>}
   */
  GrDiffGroup.hideInContextControl = function(groups, hiddenStart, hiddenEnd) {
    if (groups.length === 0) return [];
    // Clamp hiddenStart and hiddenEnd - inspired by e.g. substring
    hiddenStart = Math.max(hiddenStart, 0);
    hiddenEnd = Math.max(hiddenEnd, hiddenStart);

    let before = [];
    let hidden = groups;
    let after = [];

    const numHidden = hiddenEnd - hiddenStart;

    // Only collapse if there is more than 1 line to be hidden.
    if (numHidden > 1) {
      if (hiddenStart) {
        [before, hidden] = GrDiffGroup._splitCommonGroups(hidden, hiddenStart);
      }
      if (hiddenEnd) {
        [hidden, after] = GrDiffGroup._splitCommonGroups(
            hidden, hiddenEnd - hiddenStart);
      }
    } else {
      [hidden, after] = [[], hidden];
    }

    const result = [...before];
    if (hidden.length) {
      const ctxLine = new GrDiffLine(GrDiffLine.Type.CONTEXT_CONTROL);
      ctxLine.contextGroups = hidden;
      const ctxGroup = new GrDiffGroup(
          GrDiffGroup.Type.CONTEXT_CONTROL, [ctxLine]);
      result.push(ctxGroup);
    }
    result.push(...after);
    return result;
  };

  /**
   * Splits a list of common groups into two lists of groups.
   *
   * Groups where all lines are before or all lines are after the split will be
   * retained as is and put into the first or second list respectively. Groups
   * with some lines before and some lines after the split will be split into
   * two groups, which will be put into the first and second list.
   *
   * @param {!Array<!GrDiffGroup>} groups
   * @param {number} split A line number offset relative to the first group's
   *     start line at which the groups should be split.
   * @return {!Array<!Array<!GrDiffGroup>>} The outer array has 2 elements, the
   *   list of groups before and the list of groups after the split.
   */
  GrDiffGroup._splitCommonGroups = function(groups, split) {
    if (groups.length === 0) return [[], []];
    const leftSplit = groups[0].lineRange.left.start + split;
    const rightSplit = groups[0].lineRange.right.start + split;

    const beforeGroups = [];
    const afterGroups = [];
    for (const group of groups) {
      if (group.lineRange.left.end < leftSplit ||
          group.lineRange.right.end < rightSplit) {
        beforeGroups.push(group);
        continue;
      }
      if (leftSplit <= group.lineRange.left.start ||
          rightSplit <= group.lineRange.right.start) {
        afterGroups.push(group);
        continue;
      }

      const before = [];
      const after = [];
      for (const line of group.lines) {
        if ((line.beforeNumber && line.beforeNumber < leftSplit) ||
            (line.afterNumber && line.afterNumber < rightSplit)) {
          before.push(line);
        } else {
          after.push(line);
        }
      }

      if (before.length) {
        beforeGroups.push(before.length === group.lines.length ?
          group : group.cloneWithLines(before));
      }
      if (after.length) {
        afterGroups.push(after.length === group.lines.length ?
          group : group.cloneWithLines(after));
      }
    }
    return [beforeGroups, afterGroups];
  };

  /**
   * Creates a new group with the same properties but different lines.
   *
   * The element property is not copied, because the original element is still a
   * rendering of the old lines, so that would not make sense.
   *
   * @param {!Array<!GrDiffLine>} lines
   * @return {!GrDiffGroup}
   */
  GrDiffGroup.prototype.cloneWithLines = function(lines) {
    const group = new GrDiffGroup(this.type, lines);
    group.dueToRebase = this.dueToRebase;
    group.ignoredWhitespaceOnly = this.ignoredWhitespaceOnly;
    return group;
  };

  /** @param {!GrDiffLine} line */
  GrDiffGroup.prototype.addLine = function(line) {
    this.lines.push(line);

    const notDelta = (this.type === GrDiffGroup.Type.BOTH ||
        this.type === GrDiffGroup.Type.CONTEXT_CONTROL);
    if (notDelta && (line.type === GrDiffLine.Type.ADD ||
        line.type === GrDiffLine.Type.REMOVE)) {
      throw Error('Cannot add delta line to a non-delta group.');
    }

    if (line.type === GrDiffLine.Type.ADD) {
      this.adds.push(line);
    } else if (line.type === GrDiffLine.Type.REMOVE) {
      this.removes.push(line);
    }
    this._updateRange(line);
  };

  /** @return {!Array<{left: GrDiffLine, right: GrDiffLine}>} */
  GrDiffGroup.prototype.getSideBySidePairs = function() {
    if (this.type === GrDiffGroup.Type.BOTH ||
        this.type === GrDiffGroup.Type.CONTEXT_CONTROL) {
      return this.lines.map(line => {
        return {
          left: line,
          right: line,
        };
      });
    }

    const pairs = [];
    let i = 0;
    let j = 0;
    while (i < this.removes.length || j < this.adds.length) {
      pairs.push({
        left: this.removes[i] || GrDiffLine.BLANK_LINE,
        right: this.adds[j] || GrDiffLine.BLANK_LINE,
      });
      i++;
      j++;
    }
    return pairs;
  };

  GrDiffGroup.prototype._updateRange = function(line) {
    if (line.beforeNumber === 'FILE' || line.afterNumber === 'FILE') { return; }

    if (line.type === GrDiffLine.Type.ADD ||
        line.type === GrDiffLine.Type.BOTH) {
      if (this.lineRange.right.start === null ||
          line.afterNumber < this.lineRange.right.start) {
        this.lineRange.right.start = line.afterNumber;
      }
      if (this.lineRange.right.end === null ||
          line.afterNumber > this.lineRange.right.end) {
        this.lineRange.right.end = line.afterNumber;
      }
    }

    if (line.type === GrDiffLine.Type.REMOVE ||
        line.type === GrDiffLine.Type.BOTH) {
      if (this.lineRange.left.start === null ||
          line.beforeNumber < this.lineRange.left.start) {
        this.lineRange.left.start = line.beforeNumber;
      }
      if (this.lineRange.left.end === null ||
          line.beforeNumber > this.lineRange.left.end) {
        this.lineRange.left.end = line.beforeNumber;
      }
    }
  };

  window.GrDiffGroup = GrDiffGroup;
})(window, GrDiffLine);
