import java.util.List;
import java.util.Map;
import java.util.TreeMap;

public class KerangkaProyek {

    // Struktur direktori sederhana untuk pohon berkas.
    static class Node {
        final TreeMap<String, Node> anak = new TreeMap<>();
        boolean berkas = false;
    }

    private static final List<String> BERKAS = List.of(
            ".gitattributes",
            ".gitignore",
            "mvnw",
            "mvnw.cmd",
            "pom.xml",
            "src/main/java/id/example/layanan/LayananApplication.java",
            "src/main/resources/application.properties",
            "src/main/resources/static/index.html",
            "src/main/resources/templates/beranda.html",
            "src/test/java/id/example/layanan/LayananApplicationTests.java");

    private static final List<String> WAJIB = List.of(
            "pom.xml",
            "mvnw",
            "src/main/java/id/example/layanan/LayananApplication.java",
            "src/main/resources/application.properties",
            "src/test/java/id/example/layanan/LayananApplicationTests.java");

    public static void main(String[] args) {
        Node akar = new Node();
        for (String berkas : BERKAS) {
            Node sekarang = akar;
            String[] bagian = berkas.split("/");
            for (int i = 0; i < bagian.length; i++) {
                sekarang = sekarang.anak.computeIfAbsent(bagian[i], k -> new Node());
                if (i == bagian.length - 1) {
                    sekarang.berkas = true;
                }
            }
        }

        System.out.println("layanan/");
        cetakPohon(akar, "");

        System.out.println();
        System.out.println("== pemeriksaan struktur hasil Initializr ==");
        int kurang = 0;
        for (String wajib : WAJIB) {
            boolean ada = BERKAS.contains(wajib);
            System.out.println((ada ? "[OK]     " : "[KURANG] ") + wajib);
            if (!ada) {
                kurang++;
            }
        }
        System.out.println();
        System.out.println(kurang == 0
                ? "Proyek lengkap: siap diimpor ke IDE dan dijalankan."
                : "Terdapat " + kurang + " berkas wajib yang hilang.");
    }

    private static void cetakPohon(Node node, String prefiks) {
        Map<String, Node> anak = node.anak;
        int i = 0;
        for (Map.Entry<String, Node> e : anak.entrySet()) {
            String cabang = (i == anak.size() - 1) ? "`-- " : "|-- ";
            String tipe = e.getValue().berkas ? "" : "/";
            System.out.println(prefiks + cabang + e.getKey() + tipe);
            cetakPohon(e.getValue(), prefiks + (i == anak.size() - 1 ? "    " : "|   "));
            i++;
        }
    }
}
