// Copyright (C) 2022 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.owners.entities;

import com.google.common.base.Objects;
import java.util.Map;
import java.util.Set;

/* Files to Owners response API representation */
public class FilesOwnersResponse {

  private final Map<String, Set<Owner>> files;
  private final Map<Integer, Map<String, Integer>> ownersLabels;

  public FilesOwnersResponse(
      Map<Integer, Map<String, Integer>> ownersLabels, Map<String, Set<Owner>> files) {
    this.ownersLabels = ownersLabels;
    this.files = files;
  }

  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    FilesOwnersResponse that = (FilesOwnersResponse) o;
    return Objects.equal(files, that.files) && Objects.equal(ownersLabels, that.ownersLabels);
  }

  @Override
  public int hashCode() {
    return Objects.hashCode(files, ownersLabels);
  }
}
