// 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.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) {
    if (this == NO_EFFECT) {
      return false;
    }
    boolean rewritten = false;
    KmContractVisitor kmContractVisitor = visitorProvider.get();
    for (KotlinEffectInfo effect : effects) {
      rewritten |= effect.rewrite(kmContractVisitor::visitEffect, appView);
    }
    kmContractVisitor.visitEnd();
    return rewritten;
  }
}
