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

import static com.android.tools.r8.utils.DescriptorUtils.JAVA_PACKAGE_SEPARATOR;
import static com.android.tools.r8.utils.FileUtils.CLASS_EXTENSION;

import com.android.tools.r8.errors.CompilationError;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
import com.google.common.collect.Sets;
import com.google.common.io.Closer;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Set;

public class MainDexList {

  public static Set<DexType> parse(Path path, DexItemFactory itemFactory) throws IOException {
    try (Closer closer = Closer.create()) {
      return parse(closer.register(Files.newInputStream(path)), itemFactory);
    }
  }

  public static DexType parse(String clazz, DexItemFactory itemFactory) {
    if (!clazz.endsWith(CLASS_EXTENSION)) {
      throw new CompilationError("Illegal main-dex-list entry '" + clazz + "'.");
    }
    String name = clazz.substring(0, clazz.length() - CLASS_EXTENSION.length());
    if (name.contains("" + JAVA_PACKAGE_SEPARATOR)) {
      throw new CompilationError("Illegal main-dex-list entry '" + clazz + "'.");
    }
    String descriptor = "L" + name + ";";
    return itemFactory.createType(descriptor);
  }

  public static Set<DexType> parse(InputStream input, DexItemFactory itemFactory) {
    Set<DexType> result = Sets.newIdentityHashSet();
    try {
      BufferedReader file =
          new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
      String line;
      while ((line = file.readLine()) != null) {
        result.add(parse(line, itemFactory));
      }
    } catch (IOException e) {
      throw new CompilationError("Cannot load main-dex-list.");
    }
    return result;
  }
}
