import java.time.Clock;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class PolaSimpanTampil {
    public static void main(String[] args) {
        // Pola "simpan UTC": nilai mentah yang keluar masuk basis data / API.
        Instant tersimpan = Instant.parse("2026-01-15T01:23:45Z");
        System.out.println("tersimpan (UTC)       : " + tersimpan);

        // Pola "tampilkan zona": konversi hanya di lapisan tampilan.
        ZonedDateTime tampil = tersimpan.atZone(ZoneId.of("Asia/Jakarta"));
        DateTimeFormatter fmt = DateTimeFormatter.ofPattern("dd MMMM yyyy, HH:mm 'WIB'")
                .withLocale(Locale.forLanguageTag("id"));
        System.out.println("tampil untuk pengguna : " + tampil.format(fmt));

        // Teknik pengujian: Clock.fixed membuat now() menjadi deterministik.
        Clock jamBeku = Clock.fixed(
                Instant.parse("2026-01-15T01:00:00Z"), ZoneId.of("Asia/Jakarta"));
        System.out.println("LocalDate.now(clock)  : " + LocalDate.now(jamBeku));
        System.out.println("Instant.now(clock)    : " + Instant.now(jamBeku));
        System.out.println("ZonedDateTime.now(clock): " + ZonedDateTime.now(jamBeku));

        // Kedaluwarsa token: durasi fisik dihitung dari Instant.
        Instant kedaluwarsa = tersimpan.plus(Duration.ofMinutes(30));
        System.out.println("token kedaluwarsa     : " + kedaluwarsa);
    }
}
