import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;

/**
 * Satu pengguna aplikasi: nama, sandi, dan peran. Pembandingan sandi
 * memakai MessageDigest.isEqual yang membandingkan seluruh byte tanpa
 * berhenti di byte pertama yang berbeda, sehingga lama pembandingan tidak
 * membocorkan isi sandi (kelanjutan pola proyek REST API manajemen tugas).
 * Pada Spring Security, entitas ini berpadanan dengan UserDetails dan
 * sandi seharusnya tersimpan sebagai hash.
 */
public record PenggunaWeb(String nama, String sandi, Peran peran) {

    /** Peran pengguna: ANGGOTA boleh mengelola tugas, ADMIN boleh menghapus. */
    public enum Peran {
        ANGGOTA,
        ADMIN
    }

    public PenggunaWeb {
        if (nama == null || nama.isBlank()) {
            throw new IllegalArgumentException("nama pengguna wajib diisi");
        }
        if (sandi == null || sandi.isEmpty()) {
            throw new IllegalArgumentException("sandi pengguna wajib diisi");
        }
        if (peran == null) {
            throw new IllegalArgumentException("peran pengguna wajib diisi");
        }
        nama = nama.strip();
    }

    /** Membandingkan sandi kandidat dengan sandi tersimpan secara konstan. */
    public boolean cocokSandi(String kandidat) {
        String pembanding = kandidat == null ? "" : kandidat;
        return MessageDigest.isEqual(
                sandi.getBytes(StandardCharsets.UTF_8),
                pembanding.getBytes(StandardCharsets.UTF_8));
    }
}
