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

import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.utils.DescriptorUtils;
import com.android.tools.r8.utils.StringUtils;
import com.google.common.io.ByteStreams;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.zip.ZipFile;

public class JavaExampleClassProxy {

  private final String examplesFolder;
  private final String binaryName;

  public JavaExampleClassProxy(String examples, String binaryName) {
    this.examplesFolder = examples;
    this.binaryName = binaryName;
  }

  public static Path examplesJar(String examplesFolder) {
    return Paths.get(ToolHelper.BUILD_DIR, "test", examplesFolder + ".jar");
  }

  public byte[] bytes() {
    Path examplePath = examplesJar(examplesFolder);
    if (!Files.exists(examplePath)) {
      throw new RuntimeException(
          "Could not find path "
              + examplePath
              + ". Build "
              + examplesFolder
              + " by running tools/gradle.py build"
              + StringUtils.capitalize(examplesFolder));
    }
    try (ZipFile zipFile = new ZipFile(examplePath.toFile())) {
      return ByteStreams.toByteArray(
          zipFile.getInputStream(zipFile.getEntry(binaryName + ".class")));
    } catch (IOException e) {
      throw new RuntimeException("Could not read zip-entry from " + examplePath.toString(), e);
    }
  }

  public String typeName() {
    return DescriptorUtils.getJavaTypeFromBinaryName(binaryName);
  }
}
