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

public class RiwayatSkema {

    record Migrasi(int versi, String nama, String sqlNaik, String sqlTurun) {
    }

    static class BukuMigrasi {
        private final Map<Integer, Migrasi> terdaftar = new LinkedHashMap<>();
        private int versiTerpasang = 0;

        void daftar(Migrasi m) {
            if (terdaftar.containsKey(m.versi())) {
                throw new IllegalStateException("versi " + m.versi() + " sudah ada");
            }
            terdaftar.put(m.versi(), m);
        }

        void naikkan() {
            int berikut = versiTerpasang + 1;
            Migrasi m = terdaftar.get(berikut);
            if (m == null) {
                System.out.println("tidak ada migrasi baru (versi " + versiTerpasang + ")");
                return;
            }
            System.out.println("migrasi " + m.versi() + " -- " + m.nama());
            System.out.println("  SQL: " + m.sqlNaik());
            versiTerpasang = berikut;
        }

        int versi() {
            return versiTerpasang;
        }

        List<String> riwayat() {
            List<String> r = new ArrayList<>();
            for (int v = 1; v <= versiTerpasang; v++) {
                r.add("V" + v + "__" + terdaftar.get(v).nama());
            }
            return r;
        }
    }

    public static void main(String[] args) {
        BukuMigrasi buku = new BukuMigrasi();
        buku.daftar(new Migrasi(1, "buat_tabel_pengguna",
                "CREATE TABLE pengguna (...);", "DROP TABLE pengguna;"));
        buku.daftar(new Migrasi(2, "tambah_kolom_telepon",
                "ALTER TABLE pengguna ADD telepon VARCHAR(20);",
                "ALTER TABLE pengguna DROP COLUMN telepon;"));
        buku.daftar(new Migrasi(3, "buat_indeks_email",
                "CREATE INDEX idx_email ON pengguna(email);",
                "DROP INDEX idx_email;"));

        buku.naikkan();
        buku.naikkan();
        buku.naikkan();
        buku.naikkan();   // tidak ada lagi -- aman dan dilaporkan
        System.out.println("versi skema : " + buku.versi());
        System.out.println("riwayat     : " + String.join(", ", buku.riwayat()));
    }
}
