// 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.utils.collections;

import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.google.common.collect.Sets;
import java.util.Set;
import java.util.function.IntFunction;

public class LongLivedProgramMethodSetBuilder<T extends ProgramMethodSet> {

  private final IntFunction<T> factory;
  private final Set<DexMethod> methods;

  private LongLivedProgramMethodSetBuilder(IntFunction<T> factory, Set<DexMethod> methods) {
    this.factory = factory;
    this.methods = methods;
  }

  public static LongLivedProgramMethodSetBuilder<?> createForIdentitySet() {
    return new LongLivedProgramMethodSetBuilder<>(
        ProgramMethodSet::create, Sets.newIdentityHashSet());
  }

  public static LongLivedProgramMethodSetBuilder<SortedProgramMethodSet> createForSortedSet() {
    return new LongLivedProgramMethodSetBuilder<>(
        ignore -> SortedProgramMethodSet.create(), Sets.newIdentityHashSet());
  }

  public static LongLivedProgramMethodSetBuilder<?> createConcurrentForIdentitySet() {
    return new LongLivedProgramMethodSetBuilder<>(
        ignore -> ProgramMethodSet.create(), Sets.newConcurrentHashSet());
  }

  public void add(ProgramMethod method) {
    methods.add(method.getReference());
  }

  public void addAll(Iterable<ProgramMethod> methods) {
    methods.forEach(this::add);
  }

  public void remove(DexMethod method) {
    methods.remove(method);
  }

  public void removeAll(Iterable<DexMethod> methods) {
    methods.forEach(this::remove);
  }

  public void rewrittenWithLens(AppView<AppInfoWithLiveness> appView, GraphLens applied) {
    Set<DexMethod> newMethods = Sets.newIdentityHashSet();
    for (DexMethod method : methods) {
      newMethods.add(appView.graphLens().getRenamedMethodSignature(method, applied));
    }
    methods.clear();
    methods.addAll(newMethods);
  }

  public T build(AppView<AppInfoWithLiveness> appView) {
    return build(appView, null);
  }

  public T build(AppView<AppInfoWithLiveness> appView, GraphLens appliedGraphLens) {
    T result = factory.apply(methods.size());
    for (DexMethod oldMethod : methods) {
      DexMethod method = appView.graphLens().getRenamedMethodSignature(oldMethod, appliedGraphLens);
      DexProgramClass holder = appView.definitionForHolder(method).asProgramClass();
      result.createAndAdd(holder, holder.lookupMethod(method));
    }
    return result;
  }

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