// Copyright (c) 2018, 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.debug;

import static com.android.tools.r8.KotlinTestBase.getCompileMemoizer;
import static com.android.tools.r8.TestBase.memoizeBiFunction;

import com.android.tools.r8.KotlinCompilerTool;
import com.android.tools.r8.KotlinTestBase;
import com.android.tools.r8.KotlinTestBase.KotlinCompileMemoizer;
import com.android.tools.r8.KotlinTestParameters;
import com.android.tools.r8.OutputMode;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.utils.AndroidApiLevel;
import java.io.IOException;
import java.nio.file.Path;
import java.util.Collections;
import java.util.function.BiFunction;

/** Shared test configuration for D8 compiled resources from the "kotlinR8TestResources/debug". */
class KotlinDebugD8Config extends D8DebugTestConfig {

  static final KotlinCompileMemoizer compiledKotlinJars =
      getCompileMemoizer(KotlinTestBase.getKotlinFilesInResource("debug"))
          .configure(KotlinCompilerTool::includeRuntime);

  private static final BiFunction<KotlinTestParameters, AndroidApiLevel, Path>
      compiledResourcesMemoized = memoizeBiFunction(KotlinDebugD8Config::getCompiledResources);

  private static Path getCompiledResources(
      KotlinTestParameters kotlinTestParameters, AndroidApiLevel apiLevel) throws IOException {
    Path outputPath =
        TestBase.getStaticTemp().newFolder().toPath().resolve("d8_debug_test_resources_kotlin.jar");
    Path kotlinJar = compiledKotlinJars.getForConfiguration(kotlinTestParameters);
    D8DebugTestConfig.d8Compile(Collections.singletonList(kotlinJar), apiLevel, null)
        .write(outputPath, OutputMode.DexIndexed);
    return outputPath;
  }

  public static KotlinDebugD8Config build(
      KotlinTestParameters kotlinTestParameters, AndroidApiLevel apiLevel) {
    try {
      KotlinDebugD8Config kotlinDebugD8Config = new KotlinDebugD8Config();
      kotlinDebugD8Config.addPaths(compiledResourcesMemoized.apply(kotlinTestParameters, apiLevel));
      return kotlinDebugD8Config;
    } catch (Throwable e) {
      throw new RuntimeException(e);
    }
  }
}
