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

import static com.android.tools.r8.utils.FunctionUtils.forEachApply;

import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexDefinitionSupplier;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.shaking.EnqueuerMetadataTraceable;
import com.android.tools.r8.utils.Reporter;
import com.google.common.collect.ImmutableList;
import java.util.List;
import kotlinx.metadata.KmContract;
import kotlinx.metadata.KmContractVisitor;
import kotlinx.metadata.KmEffect;

public class KotlinContractInfo implements EnqueuerMetadataTraceable {

  private static final KotlinContractInfo NO_EFFECT = new KotlinContractInfo(ImmutableList.of());

  private final List<KotlinEffectInfo> effects;

  private KotlinContractInfo(List<KotlinEffectInfo> effects) {
    this.effects = effects;
  }

  static KotlinContractInfo create(
      KmContract kmContract, DexItemFactory factory, Reporter reporter) {
    if (kmContract == null) {
      return NO_EFFECT;
    }
    List<KmEffect> effects = kmContract.getEffects();
    if (effects.isEmpty()) {
      return NO_EFFECT;
    }
    ImmutableList.Builder<KotlinEffectInfo> builder = ImmutableList.builder();
    for (KmEffect effect : effects) {
      builder.add(KotlinEffectInfo.create(effect, factory, reporter));
    }
    return new KotlinContractInfo(builder.build());
  }

  @Override
  public void trace(DexDefinitionSupplier definitionSupplier) {
    forEachApply(effects, effect -> effect::trace, definitionSupplier);
  }

  boolean rewrite(
      KmVisitorProviders.KmContractVisitorProvider visitorProvider,
      AppView<?> appView,
      NamingLens namingLens) {
    if (this == NO_EFFECT) {
      return false;
    }
    boolean rewritten = false;
    KmContractVisitor kmContractVisitor = visitorProvider.get();
    for (KotlinEffectInfo effect : effects) {
      rewritten |= effect.rewrite(kmContractVisitor::visitEffect, appView, namingLens);
    }
    kmContractVisitor.visitEnd();
    return rewritten;
  }
}
