// Copyright (C) 2014 Google Inc. All Rights Reserved.
//
// 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.gitiles.blame;

import static com.google.common.base.Preconditions.checkArgument;

import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.PersonIdent;

import java.io.Serializable;

/** Region of the blame of a file. */
public class Region implements Serializable, Comparable<Region> {
  private static final long serialVersionUID = 1L;

  private final String sourcePath;
  private final ObjectId sourceCommit;
  private final PersonIdent sourceAuthor;
  private final int count;
  private transient int start;

  public Region(String path, ObjectId commit, PersonIdent author, int start, int end) {
    checkArgument(
        (path != null && commit != null && author != null)
            || (path == null && commit == null && author == null),
        "expected all null or none: %s, %s, %s",
        path,
        commit,
        author);
    this.sourcePath = path;
    this.sourceCommit = commit;
    this.sourceAuthor = author;
    this.start = start;
    this.count = end - start;
  }

  void setStart(int start) {
    this.start = start;
  }

  int getStart() {
    return start;
  }

  int getEnd() {
    return start + count;
  }

  public int getCount() {
    return count;
  }

  public String getSourcePath() {
    return sourcePath;
  }

  public ObjectId getSourceCommit() {
    return sourceCommit;
  }

  public PersonIdent getSourceAuthor() {
    return sourceAuthor;
  }

  @Override
  public int compareTo(Region o) {
    return start - o.start;
  }

  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder();
    if (sourceCommit != null) {
      sb.append(sourceCommit.name(), 0, 7)
          .append(' ')
          .append(sourceAuthor.toExternalString())
          .append(" (")
          .append(sourcePath)
          .append(')');
    } else {
      sb.append("<unblamed region>");
    }
    sb.append(' ').append("start=").append(start).append(", count=").append(count);
    return sb.toString();
  }
}
