// Copyright (c) 2016, 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;

import com.android.tools.r8.dex.ApplicationReader;
import com.android.tools.r8.graph.DexApplication;
import com.android.tools.r8.graph.DexEncodedField;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.naming.ClassNameMapper;
import com.android.tools.r8.naming.MemberNaming.FieldSignature;
import com.android.tools.r8.naming.MemberNaming.MethodSignature;
import com.android.tools.r8.utils.AndroidApp;
import com.android.tools.r8.utils.AndroidApp.Builder;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.ListUtils;
import com.android.tools.r8.utils.Timing;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class PrintClassList {

  public static void main(String[] args) throws IOException, ExecutionException {
    List<String> dexFiles = Arrays.asList(args);
    Builder builder = AndroidApp.builder();
    Path proguardMapFile = null;
    if (args[0].endsWith("map")) {
      proguardMapFile = Paths.get(args[0]);
      dexFiles = dexFiles.subList(1, dexFiles.size());
    }
    builder.addProgramFiles(ListUtils.map(dexFiles, Paths::get));

    ExecutorService executorService = Executors.newCachedThreadPool();
    DexApplication application =
        new ApplicationReader(builder.build(), new InternalOptions(), new Timing("PrintClassList"))
            .read(
                proguardMapFile == null ? null : StringResource.fromFile(proguardMapFile),
                executorService
            );
    ClassNameMapper map = application.getProguardMap();
    for (DexProgramClass clazz : application.classes()) {
      System.out.print(maybeDeobfuscateType(map, clazz.type));
      System.out.println();
      clazz.forEachMethod(method -> printMethod(method, map));
      clazz.forEachField(field -> printField(field, map));
    }
    executorService.shutdown();
  }

  private static void printMethod(DexEncodedMethod encodedMethod, ClassNameMapper map) {
    DexMethod method = encodedMethod.method;
    if (map != null) {
      System.out.println(map.originalNameOf(method));
    } else {
      // Detour via Signature to get the same formatting.
      MethodSignature signature = MethodSignature.fromDexMethod(method);
      System.out.println(method.holder.toSourceString() + " " + signature);
    }
  }

  private static void printField(DexEncodedField encodedField, ClassNameMapper map) {
    DexField field = encodedField.field;
    if (map != null) {
      System.out.println(map.originalNameOf(field));
    } else {
      // Detour via Signature to get the same formatting.
      FieldSignature signature = new FieldSignature(field.name.toSourceString(),
          field.type.toSourceString());
      System.out.println(field.holder.toSourceString() + " " + signature);
    }
  }

  private static String maybeDeobfuscateType(ClassNameMapper map, DexType type) {
    return map == null ? type.toSourceString() : map.originalNameOf(type);
  }
}
