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

import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.PrunedItems;
import com.google.common.collect.Sets;
import java.util.Set;
import java.util.function.Consumer;

public class MainDexClasses {

  private final Set<DexType> mainDexClasses;

  private MainDexClasses() {
    this(Sets.newIdentityHashSet());
  }

  private MainDexClasses(Set<DexType> mainDexClasses) {
    this.mainDexClasses = mainDexClasses;
  }

  public static Builder builder() {
    return new Builder();
  }

  public static MainDexClasses createEmptyMainDexClasses() {
    return new MainDexClasses();
  }

  public void add(DexProgramClass clazz) {
    mainDexClasses.add(clazz.getType());
  }

  public void addAll(MainDexClasses other) {
    mainDexClasses.addAll(other.mainDexClasses);
  }

  public void addAll(MainDexTracingResult other) {
    mainDexClasses.addAll(other.getClasses());
  }

  public void addAll(Iterable<DexProgramClass> classes) {
    for (DexProgramClass clazz : classes) {
      add(clazz);
    }
  }

  public boolean contains(DexType type) {
    return mainDexClasses.contains(type);
  }

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

  public boolean containsAnyOf(Iterable<DexProgramClass> classes) {
    for (DexProgramClass clazz : classes) {
      if (contains(clazz)) {
        return true;
      }
    }
    return false;
  }

  public void forEach(Consumer<DexType> fn) {
    mainDexClasses.forEach(fn);
  }

  public boolean isEmpty() {
    return mainDexClasses.isEmpty();
  }

  public MainDexClasses rewrittenWithLens(GraphLens lens) {
    MainDexClasses rewrittenMainDexClasses = createEmptyMainDexClasses();
    for (DexType mainDexClass : mainDexClasses) {
      DexType rewrittenMainDexClass = lens.lookupType(mainDexClass);
      rewrittenMainDexClasses.mainDexClasses.add(rewrittenMainDexClass);
    }
    return rewrittenMainDexClasses;
  }

  public int size() {
    return mainDexClasses.size();
  }

  public MainDexClasses withoutPrunedItems(PrunedItems prunedItems) {
    MainDexClasses mainDexClassesAfterPruning = createEmptyMainDexClasses();
    for (DexType mainDexClass : mainDexClasses) {
      if (!prunedItems.getRemovedClasses().contains(mainDexClass)) {
        mainDexClassesAfterPruning.mainDexClasses.add(mainDexClass);
      }
    }
    return mainDexClassesAfterPruning;
  }

  public static class Builder {

    private final Set<DexType> mainDexClasses = Sets.newIdentityHashSet();

    private Builder() {}

    public void add(DexProgramClass clazz) {
      mainDexClasses.add(clazz.getType());
    }

    public MainDexClasses build() {
      return new MainDexClasses(mainDexClasses);
    }
  }
}
