// 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.googlesource.gerrit.plugins.analytics;


import org.eclipse.jgit.lib.ObjectId;
// import org.gitective.core.stat.UserCommitActivity;
import org.gitective.core.stat.UserCommitActivity;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class UserActivitySummary {
  public final String name;
  public final String email;
  public final int numCommits;
  public final List<CommitInfo> commits;


  public UserActivitySummary(String name, String email, int numCommits,
      List<CommitInfo> commits) {
    this.name = name;
    this.email = email;
    this.numCommits = numCommits;
    this.commits = commits;
  }

  public static UserActivitySummary fromUserActivity(UserCommitActivity uca) {
    return new UserActivitySummary(uca.getName(), uca.getEmail(),
        uca.getCount(), getCommits(uca.getIds(), uca.getTimes(),
            uca.getMerges()));
  }

  private static List<CommitInfo> getCommits(ObjectId[] ids, long[] times,
      boolean[] merges) {
    List<CommitInfo> commits = new ArrayList<>(ids.length);

    for (int i = 0; i < ids.length; i++) {
      commits.add(new CommitInfo(ids[i].name(), new Date(times[i]), merges[i]));
    }

    return commits;
  }
}
