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

public class SesiMini {

    static class PerambanMini {
        private final Map<String, String> toples = new LinkedHashMap<>();

        void simpanDariSetCookie(String headerSetCookie) {
            String pasangan = headerSetCookie.split(";")[0].trim();
            int samaDengan = pasangan.indexOf('=');
            toples.put(pasangan.substring(0, samaDengan),
                    pasangan.substring(samaDengan + 1));
        }

        String headerCookie() {
            if (toples.isEmpty()) {
                return "(tanpa cookie)";
            }
            StringBuilder b = new StringBuilder();
            int i = 0;
            for (Map.Entry<String, String> e : toples.entrySet()) {
                if (i++ > 0) {
                    b.append("; ");
                }
                b.append(e.getKey()).append('=').append(e.getValue());
            }
            return b.toString();
        }

        void hapusCookie(String nama) {
            toples.remove(nama);
        }
    }

    static class TokoSesi {
        private final Map<String, Integer> kunjunganSesi = new LinkedHashMap<>();
        private int nomorBerikut = 0;

        String buatSetCookie(String idSesi) {
            return "JSESSIONID=" + idSesi + "; Path=/; HttpOnly; SameSite=Lax";
        }

        String tangani(String label, PerambanMini peramban) {
            System.out.println(label + ": Cookie: " + peramban.headerCookie());
            String idSesi = peramban.toples.get("JSESSIONID");
            if (idSesi == null || !kunjunganSesi.containsKey(idSesi)) {
                idSesi = String.format("SESI-%03d", ++nomorBerikut);
                kunjunganSesi.put(idSesi, 1);
                peramban.simpanDariSetCookie(buatSetCookie(idSesi));
                System.out.println(label + ": Set-Cookie: " + buatSetCookie(idSesi));
                return "halo! sesi baru " + idSesi + " dibuat";
            }
            int kunjungan = kunjunganSesi.merge(idSesi, 1, Integer::sum);
            return "selamat datang kembali, kunjungan ke-" + kunjungan;
        }

        void keluar(PerambanMini peramban) {
            String idSesi = peramban.toples.get("JSESSIONID");
            if (idSesi != null) {
                kunjunganSesi.remove(idSesi);
            }
            peramban.hapusCookie("JSESSIONID");
            System.out.println("logout   : sesi " + idSesi + " dihapus, cookie dibatalkan");
        }
    }

    public static void main(String[] args) {
        PerambanMini peramban = new PerambanMini();
        TokoSesi toko = new TokoSesi();

        System.out.println("Balasan  : " + toko.tangani("permintaan1", peramban));
        System.out.println();
        System.out.println("Balasan  : " + toko.tangani("permintaan2", peramban));
        System.out.println();
        System.out.println("Balasan  : " + toko.tangani("permintaan3", peramban));
        System.out.println();
        toko.keluar(peramban);
        System.out.println();
        System.out.println("Balasan  : " + toko.tangani("permintaan4", peramban));
    }
}
