// Copyright (c) 2021, 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.PrunedItems;
import com.android.tools.r8.graph.lens.GraphLens;
import com.android.tools.r8.utils.Timing;
import com.google.common.collect.Sets;
import java.util.Set;

public class ProguardCompatibilityActions {

  private final Set<DexType> compatInstantiatedTypes;

  private ProguardCompatibilityActions(Set<DexType> compatInstantiatedTypes) {
    this.compatInstantiatedTypes = compatInstantiatedTypes;
  }

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

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

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

  public ProguardCompatibilityActions withoutPrunedItems(PrunedItems prunedItems, Timing timing) {
    timing.begin("Prune ProguardCompatibilityActions");
    Builder builder = builder();
    for (DexType compatInstantiatedType : compatInstantiatedTypes) {
      if (!prunedItems.isRemoved(compatInstantiatedType)) {
        builder.addCompatInstantiatedType(compatInstantiatedType);
      }
    }
    ProguardCompatibilityActions result = builder.build();
    timing.end();
    return result;
  }

  public ProguardCompatibilityActions rewrittenWithLens(GraphLens lens, Timing timing) {
    return timing.time("Rewrite ProguardCompatibilityActions", () -> rewrittenWithLens(lens));
  }

  private ProguardCompatibilityActions rewrittenWithLens(GraphLens lens) {
    Builder builder = builder();
    for (DexType compatInstantiatedType : compatInstantiatedTypes) {
      builder.addCompatInstantiatedType(lens.lookupType(compatInstantiatedType));
    }
    return builder.build();
  }

  public static class Builder {

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

    public void addCompatInstantiatedType(DexProgramClass clazz) {
      addCompatInstantiatedType(clazz.getType());
    }

    private void addCompatInstantiatedType(DexType type) {
      compatInstantiatedTypes.add(type);
    }

    public ProguardCompatibilityActions build() {
      return new ProguardCompatibilityActions(compatInstantiatedTypes);
    }
  }
}
