/**
 * Token akses bertanda tangan HMAC: muatan berisi nama pemegang dan saldo
 * permintaan, keduanya tidak bisa diubah klien tanpa merusak tanda tangan.
 * Bentuknya menyerupai JWT yang disederhanakan — muatan plus tanda tangan,
 * tanpa bagian header dan tanpa pengodean base64url — sehingga strukturnya
 * terbaca langsung.
 */
public record TokenAkses(String nama, int saldo) {

    public TokenAkses {
        if (nama == null || nama.strip().isEmpty()) {
            throw new IllegalArgumentException("nama token tidak boleh kosong");
        }
        if (nama.contains(":")) {
            throw new IllegalArgumentException("nama token tidak boleh mengandung ':'");
        }
        if (saldo < 0) {
            throw new IllegalArgumentException("saldo token tidak boleh negatif");
        }
        nama = nama.strip();
    }

    /** Muatan yang ditandatangani: nama dan saldo awal dipisah titik dua. */
    public String muatan() {
        return nama + ":" + saldo;
    }

    /** Token lengkap siap dikirim klien: muatan plus tanda tangan HMAC. */
    public String terbitkan(String kunciRahasia) {
        return muatan() + ":" + TandaTangan.hmacHex(kunciRahasia, muatan());
    }
}
