// Copyright (c) 2022, 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.desugar.desugaredlibrary.disabledesugarer;

import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexEncodedField;
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.desugar.CfPostProcessingDesugaring;
import com.android.tools.r8.ir.desugar.CfPostProcessingDesugaringEventConsumer;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.ExecutorService;

public class DesugaredLibraryDisableDesugarerPostProcessor implements CfPostProcessingDesugaring {

  private final AppView<?> appView;
  private final DesugaredLibraryDisableDesugarerHelper helper;

  public DesugaredLibraryDisableDesugarerPostProcessor(AppView<?> appView) {
    this.appView = appView;
    this.helper = new DesugaredLibraryDisableDesugarerHelper(appView);
  }

  public static DesugaredLibraryDisableDesugarerPostProcessor create(AppView<?> appView) {
    return DesugaredLibraryDisableDesugarerHelper.shouldCreate(appView)
        ? new DesugaredLibraryDisableDesugarerPostProcessor(appView)
        : null;
  }

  @Override
  public void postProcessingDesugaring(
      Collection<DexProgramClass> programClasses,
      CfPostProcessingDesugaringEventConsumer eventConsumer,
      ExecutorService executorService) {
    for (DexType multiDexType : appView.dexItemFactory().multiDexTypes) {
      DexClass clazz =
          appView.appInfoForDesugaring().definitionForWithoutExistenceAssert(multiDexType);
      if (clazz != null && clazz.isProgramClass()) {
        rewriteMultiDexProgramClass(clazz.asProgramClass());
      }
    }
  }

  private void rewriteMultiDexProgramClass(DexProgramClass multiDexProgramClass) {
    multiDexProgramClass.setInstanceFields(
        rewriteFields(multiDexProgramClass.instanceFields(), multiDexProgramClass));
    multiDexProgramClass.setStaticFields(
        rewriteFields(multiDexProgramClass.staticFields(), multiDexProgramClass));
  }

  private DexEncodedField[] rewriteFields(
      List<DexEncodedField> fields, DexProgramClass multiDexProgramClass) {
    List<DexEncodedField> newFields = new ArrayList<>();
    for (DexEncodedField field : fields) {
      DexField rewrittenField = helper.rewriteField(field.getReference(), multiDexProgramClass);
      newFields.add(
          rewrittenField != null ? field.toTypeSubstitutedField(appView, rewrittenField) : field);
    }
    return newFields.toArray(DexEncodedField[]::new);
  }
}
