// Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

package com.android.tools.r8.graph;

import com.android.tools.r8.utils.DescriptorUtils;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
import java.util.Iterator;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Supplier;

public class ProgramPackage implements Iterable<DexProgramClass> {

  private final String packageDescriptor;
  private final Set<DexProgramClass> classes;

  public ProgramPackage(String packageDescriptor) {
    this(packageDescriptor, Sets::newIdentityHashSet);
  }

  protected ProgramPackage(
      String packageDescriptor, Supplier<Set<DexProgramClass>> backingFactory) {
    this.packageDescriptor = packageDescriptor;
    this.classes = backingFactory.get();
  }

  public boolean add(DexProgramClass clazz) {
    assert clazz.getType().getPackageDescriptor().equals(packageDescriptor);
    return classes.add(clazz);
  }

  public boolean contains(DexProgramClass clazz) {
    return classes.contains(clazz);
  }

  public String getLastPackageName() {
    int index = packageDescriptor.lastIndexOf('/');
    if (index >= 0) {
      return packageDescriptor.substring(index + 1);
    }
    return packageDescriptor;
  }

  public String getPackageDescriptor() {
    return packageDescriptor;
  }

  public String getPackageName() {
    return DescriptorUtils.getJavaTypeFromBinaryName(packageDescriptor);
  }

  public void forEachClass(Consumer<DexProgramClass> consumer) {
    forEach(consumer);
  }

  public void forEachField(Consumer<ProgramField> consumer) {
    forEach(clazz -> clazz.forEachProgramField(consumer));
  }

  public void forEachMethod(Consumer<ProgramMethod> consumer) {
    forEach(clazz -> clazz.forEachProgramMethod(consumer));
  }

  public Set<DexProgramClass> classesInPackage() {
    return ImmutableSet.copyOf(classes);
  }

  @Override
  public Iterator<DexProgramClass> iterator() {
    return classes.iterator();
  }

  @Override
  public String toString() {
    return "ProgramPackage(" + getPackageName() + ")";
  }
}
