import java.io.IOException;
import java.nio.file.DirectoryStream;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.PathMatcher;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

public class CariPola {
    public static void main(String[] args) throws IOException {
        Path proyek = Path.of("proyek");

        // Struktur contoh dibuat ulang agar program berdiri sendiri.
        Files.createDirectories(proyek.resolve("src/main"));
        Files.createDirectories(proyek.resolve("src/test"));
        Files.writeString(proyek.resolve("README.md"), "# Proyek contoh\n");
        Files.writeString(proyek.resolve("catatan.txt"), "catatan pengembang\n");
        Files.writeString(proyek.resolve("src/main/Aplikasi.java"), "class Aplikasi {}\n");
        Files.writeString(proyek.resolve("src/main/Util.java"), "class Util {}\n");
        Files.writeString(proyek.resolve("src/test/AplikasiTest.java"), "class AplikasiTest {}\n");

        // DirectoryStream dengan pola glob: satu tingkat saja.
        List<String> dokumen = new ArrayList<>();
        try (DirectoryStream<Path> stream =
                     Files.newDirectoryStream(proyek, "*.{txt,md}")) {
            for (Path p : stream) {
                dokumen.add(p.getFileName().toString());
            }
        }
        dokumen.sort(null);
        System.out.println("glob txt/md   : " + dokumen);

        // PathMatcher glob menembus kedalaman bila dipadukan dengan walk.
        PathMatcher cocokJava =
                FileSystems.getDefault().getPathMatcher("glob:**/*.java");
        List<String> berkasJava;
        try (Stream<Path> semua = Files.walk(proyek)) {
            berkasJava = semua.filter(cocokJava::matches)
                    .map(Path::toString)
                    .sorted()
                    .toList();
        }
        System.out.println("glob **/*.java: " + berkasJava);

        // PathMatcher berbasis regex.
        PathMatcher diSrc =
                FileSystems.getDefault().getPathMatcher("regex:proyek/src/.*");
        long jumlah;
        try (Stream<Path> semua = Files.walk(proyek)) {
            jumlah = semua.filter(diSrc::matches).count();
        }
        System.out.println("regex src/    : " + jumlah + " entri");
    }
}
