import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/** Peta format jpackage per platform dan pembangkit berkas .cfg launcher. */
public class PetaPaket {

    /** Satu format installer: tipe --type, nama berkas hasil, prasyarat alat eksternal. */
    record Format(String tipe, String berkas, String prasyarat) {}

    static final Map<String, List<Format>> PER_PLATFORM = Map.of(
            "linux", List.of(
                    new Format("app-image", "kasirapp/ (folder citra)", "tanpa alat tambahan"),
                    new Format("deb", "kasirapp_1.0.0-1_amd64.deb", "dpkg-deb + fakeroot"),
                    new Format("rpm", "kasirapp-1.0.0-1.x86_64.rpm", "rpmbuild")),
            "windows", List.of(
                    new Format("msi", "kasirapp-1.0.0.msi", "WiX Toolset 3.x"),
                    new Format("exe", "kasirapp-1.0.0.exe", "WiX Toolset 3.x")),
            "macos", List.of(
                    new Format("dmg", "kasirapp-1.0.0.dmg", "alat bawaan macOS"),
                    new Format("pkg", "kasirapp-1.0.0.pkg", "pkgbuild")));

    /** Bangun isi berkas .cfg launcher — format yang sama dengan keluaran jpackage. */
    static String bangunCfg(String jarUtama, String kelasUtama, String versi,
                            List<String> opsiJvm) {
        StringBuilder cfg = new StringBuilder();
        cfg.append("[Application]\n");
        cfg.append("app.classpath=$APPDIR/").append(jarUtama).append("\n");
        cfg.append("app.mainclass=").append(kelasUtama).append("\n");
        cfg.append("\n[JavaOptions]\n");
        cfg.append("java-options=-Djpackage.app-version=").append(versi).append("\n");
        for (String opsi : opsiJvm) {
            cfg.append("java-options=").append(opsi).append("\n");
        }
        return cfg.toString();
    }

    /** Pilih format pertama yang prasyaratnya terpenuhi oleh alat yang tersedia. */
    static String pilihFormat(String platform, Map<String, Boolean> alatTersedia) {
        for (Format f : PER_PLATFORM.get(platform)) {
            if (f.prasyarat().equals("tanpa alat tambahan")
                    || alatTersedia.getOrDefault(f.prasyarat(), false)) {
                return f.tipe();
            }
        }
        return "app-image";
    }

    public static void main(String[] args) {
        System.out.println("== Matriks --type jpackage per platform ==");
        Map<String, List<Format>> urutan = new LinkedHashMap<>();
        urutan.put("linux", PER_PLATFORM.get("linux"));
        urutan.put("windows", PER_PLATFORM.get("windows"));
        urutan.put("macos", PER_PLATFORM.get("macos"));
        for (var e : urutan.entrySet()) {
            System.out.printf("%-8s :%n", e.getKey().toUpperCase());
            for (Format f : e.getValue()) {
                System.out.printf("  %-10s -> %-34s (%s)%n",
                        f.tipe(), f.berkas(), f.prasyarat());
            }
        }

        System.out.println();
        System.out.println("== Berkas .cfg launcher untuk kasirapp ==");
        System.out.print(bangunCfg("toko-fat.jar", "toko.AplikasiKasir", "1.0.0",
                List.of("-Xmx256m", "-Dfile.encoding=UTF-8")));

        System.out.println();
        System.out.println("== Keputusan bundler di Linux tanpa fakeroot ==");
        Map<String, Boolean> alat = new LinkedHashMap<>();
        alat.put("dpkg-deb + fakeroot", false);
        alat.put("rpmbuild", false);
        System.out.println("terpilih: --type " + pilihFormat("linux", alat));
    }
}
