import java.util.ArrayList;
import java.util.List;

public class GrafTugas {

    // Task dan daftar task yang menjadi prasyaratnya (meniru plugin java).
    private static final String[] TASK = {
        "compileJava", "processResources", "classes", "compileTestJava",
        "test", "jar", "assemble", "check", "build"
    };

    private static final String[][] BERGANTUNG_PADA = {
        {},                                    // compileJava
        {},                                    // processResources
        {"compileJava", "processResources"},   // classes
        {"classes"},                           // compileTestJava
        {"compileTestJava"},                   // test
        {"classes"},                           // jar
        {"jar"},                               // assemble
        {"test"},                              // check
        {"assemble", "check"}                  // build
    };

    private static final List<String> urutan = new ArrayList<>();

    public static void main(String[] args) {
        susun("build");

        System.out.println("urutan eksekusi task 'build':");
        for (int i = 0; i < urutan.size(); i++) {
            System.out.printf("%d. %s%n", i + 1, urutan.get(i));
        }
        System.out.println();
        System.out.println("total task terjadwal: " + urutan.size());
    }

    /** DFS: sebuah task hanya dijadwalkan setelah seluruh prasyaratnya. */
    private static void susun(String nama) {
        if (urutan.contains(nama)) {
            return;
        }
        for (String prasyarat : BERGANTUNG_PADA[indeks(nama)]) {
            susun(prasyarat);
        }
        urutan.add(nama);
    }

    private static int indeks(String nama) {
        for (int i = 0; i < TASK.length; i++) {
            if (TASK[i].equals(nama)) {
                return i;
            }
        }
        throw new IllegalArgumentException("task tidak dikenal: " + nama);
    }
}
