// 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.

package com.google.gerrit.client;

import com.google.gerrit.extensions.client.GeneralPreferencesInfo.DefaultBase;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.PatchSet;

/**
 * Represent an object that can be diffed. This can be either a regular patch set, the base of a
 * patch set, the parent of a merge, the auto-merge of a merge or an edit patch set.
 */
public class DiffObject {
  public static final String AUTO_MERGE = "AutoMerge";

  /**
   * Parses a string that represents a diff object.
   *
   * <p>The following string representations are supported:
   *
   * <ul>
   *   <li>a positive integer: represents a patch set
   *   <li>a negative integer: represents a parent of a merge patch set
   *   <li>'0': represents the edit patch set
   *   <li>empty string or null: represents the parent of a 1-parent patch set, also called base
   *   <li>'AutoMerge': represents the auto-merge of a merge patch set
   * </ul>
   *
   * @param changeId the ID of the change to which the diff object belongs
   * @param str the string representation of the diff object
   * @return the parsed diff object, {@code null} if str cannot be parsed as diff object
   */
  public static DiffObject parse(Change.Id changeId, String str) {
    if (str == null || str.isEmpty()) {
      return new DiffObject(false);
    }

    if (AUTO_MERGE.equals(str)) {
      return new DiffObject(true);
    }

    return new DiffObject(Dispatcher.toPsId(changeId, str));
  }

  /** Create a DiffObject that represents the parent of a 1-parent patch set. */
  public static DiffObject base() {
    return new DiffObject(false);
  }

  /** Create a DiffObject that represents the auto-merge for a merge patch set. */
  public static DiffObject autoMerge() {
    return new DiffObject(true);
  }

  /** Create a DiffObject that represents a patch set. */
  public static DiffObject patchSet(PatchSet.Id psId) {
    return new DiffObject(psId);
  }

  private final PatchSet.Id psId;
  private final boolean autoMerge;

  private DiffObject(PatchSet.Id psId) {
    this.psId = psId;
    this.autoMerge = false;
  }

  private DiffObject(boolean autoMerge) {
    this.psId = null;
    this.autoMerge = autoMerge;
  }

  public boolean isBase() {
    return psId == null && !autoMerge;
  }

  public boolean isAutoMerge() {
    return psId == null && autoMerge;
  }

  public boolean isBaseOrAutoMerge() {
    return psId == null;
  }

  public boolean isPatchSet() {
    return psId != null && psId.get() > 0;
  }

  public boolean isParent() {
    return psId != null && psId.get() < 0;
  }

  public boolean isEdit() {
    return psId != null && psId.get() == 0;
  }

  /**
   * Returns the DiffObject as PatchSet.Id.
   *
   * @return PatchSet.Id with an id > 0 for a regular patch set; PatchSet.Id with an id < 0 for a
   *     parent of a merge; PatchSet.Id with id == 0 for an edit patch set; {@code null} for the
   *     base of a 1-parent patch set and for the auto-merge of a merge patch set
   */
  public PatchSet.Id asPatchSetId() {
    return psId;
  }

  /**
   * Returns the parent number for a parent of a merge.
   *
   * @return 1-based parent number, 0 if this DiffObject is not a parent of a merge
   */
  public int getParentNum() {
    if (!isParent()) {
      return 0;
    }

    return -psId.get();
  }

  /**
   * Returns a string representation of this DiffObject that can be used in URLs.
   *
   * <p>The following string representations are returned:
   *
   * <ul>
   *   <li>a positive integer for a patch set
   *   <li>a negative integer for a parent of a merge patch set
   *   <li>'0' for the edit patch set
   *   <li>{@code null} for the parent of a 1-parent patch set, also called base
   *   <li>'AutoMerge' for the auto-merge of a merge patch set
   * </ul>
   *
   * @return string representation of this DiffObject
   */
  public String asString() {
    if (autoMerge) {
      if (Gerrit.getUserPreferences().defaultBaseForMerges() != DefaultBase.AUTO_MERGE) {
        return AUTO_MERGE;
      }
      return null;
    }

    if (psId != null) {
      return psId.getId();
    }

    return null;
  }

  @Override
  public String toString() {
    if (isPatchSet()) {
      return "Patch Set " + psId.getId();
    }

    if (isParent()) {
      return "Parent " + psId.getId();
    }

    if (isEdit()) {
      return "Edit Patch Set";
    }

    if (isAutoMerge()) {
      return "Auto Merge";
    }

    return "Base";
  }
}
