// Copyright (c) 2019, 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.ir.analysis.proto;

import com.android.tools.r8.dex.VirtualFile;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.analysis.proto.schema.ProtoFieldTypeFactory;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.StringDiagnostic;
import com.google.common.collect.Sets;
import java.util.Set;

public class ProtoShrinker {

  public final RawMessageInfoDecoder decoder;
  public final ProtoFieldTypeFactory factory;
  public final GeneratedExtensionRegistryShrinker generatedExtensionRegistryShrinker;
  public final GeneratedMessageLiteShrinker generatedMessageLiteShrinker;
  public final GeneratedMessageLiteBuilderShrinker generatedMessageLiteBuilderShrinker;
  public final EnumLiteProtoShrinker enumLiteProtoShrinker;
  public final ProtoEnumSwitchMapRemover protoEnumSwitchMapRemover;
  public final ProtoReferences references;

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

  public ProtoShrinker(AppView<AppInfoWithLiveness> appView, ProtoReferences references) {
    ProtoFieldTypeFactory factory = new ProtoFieldTypeFactory();
    this.decoder = new RawMessageInfoDecoder(factory, references);
    this.factory = factory;
    this.generatedExtensionRegistryShrinker =
        appView.options().protoShrinking().enableGeneratedExtensionRegistryShrinking
            ? new GeneratedExtensionRegistryShrinker(appView, references)
            : null;
    this.generatedMessageLiteShrinker =
        appView.options().protoShrinking().enableGeneratedMessageLiteShrinking
            ? new GeneratedMessageLiteShrinker(appView, decoder, references)
            : null;
    this.generatedMessageLiteBuilderShrinker =
        appView.options().protoShrinking().enableGeneratedMessageLiteBuilderShrinking
            ? new GeneratedMessageLiteBuilderShrinker(appView, references)
            : null;
    this.enumLiteProtoShrinker =
        appView.options().protoShrinking().isEnumLiteProtoShrinkingEnabled()
            ? new EnumLiteProtoShrinker(appView, references)
            : null;
    this.protoEnumSwitchMapRemover =
        appView.options().protoShrinking().enableRemoveProtoEnumSwitchMap()
            ? new ProtoEnumSwitchMapRemover(references)
            : null;
    this.references = references;
  }

  public static ProtoShrinker create(AppView<AppInfoWithLiveness> appView) {
    if (!appView.enableWholeProgramOptimizations()
        || !appView.options().protoShrinking().isProtoShrinkingEnabled()) {
      return null;
    }

    ProtoReferences references = new ProtoReferences(appView.dexItemFactory());
    if (appView.definitionFor(references.generatedMessageLiteType) == null) {
      appView
          .reporter()
          .warning(
              new StringDiagnostic(
                  "Ignoring -shrinkunusedprotofields since the protobuf-lite runtime is missing"));
      appView.options().protoShrinking().disable();
      return null;
    }

    return new ProtoShrinker(appView, references);
  }

  public Set<DexType> getDeadProtoTypes() {
    return deadProtoTypes;
  }

  public ProtoReferences getProtoReferences() {
    return references;
  }

  public void setDeadProtoTypes(Set<DexType> deadProtoTypes) {
    // We should only need to keep track of the dead proto types for assertion purposes.
    InternalOptions.checkAssertionsEnabled();
    this.deadProtoTypes = deadProtoTypes;
  }

  public boolean verifyDeadProtoTypesNotReferenced(VirtualFile virtualFile) {
    for (DexType deadProtoType : deadProtoTypes) {
      assert !virtualFile.containsString(deadProtoType.descriptor);
      assert !virtualFile.containsType(deadProtoType);
    }
    return true;
  }
}
