package main

import (
	"fmt"
	"strconv"
	"strings"
)

// FormatRupiah memformat bilangan bulat menjadi teks rupiah dengan pemisah
// ribuan, contoh 150000 menjadi "Rp150.000" dan -50000 menjadi "-Rp50.000".
func FormatRupiah(nilai int) string {
	negatif := nilai < 0
	if negatif {
		nilai = -nilai
	}
	digits := strconv.Itoa(nilai)
	var b strings.Builder
	sisa := len(digits)
	for _, d := range digits {
		b.WriteRune(d)
		sisa--
		if sisa > 0 && sisa%3 == 0 {
			b.WriteByte('.')
		}
	}
	hasil := b.String()
	if negatif {
		return "-Rp" + hasil
	}
	return "Rp" + hasil
}

// Keranjang menyimpan daftar barang yang dibeli oleh satu pembeli.
type Keranjang struct {
	atasNama string
	barang   []string
}

// NewKeranjang membuat keranjang baru atas nama pembeli.
func NewKeranjang(atasNama string) *Keranjang {
	return &Keranjang{atasNama: atasNama}
}

// Tambah memasukkan satu barang ke dalam keranjang.
func (k *Keranjang) Tambah(barang string) {
	k.barang = append(k.barang, barang)
}

// Ringkasan menghasilkan satu baris deskripsi isi keranjang.
func (k *Keranjang) Ringkasan() string {
	return fmt.Sprintf("%s membeli %d barang: %s", k.atasNama, len(k.barang), strings.Join(k.barang, ", "))
}

func main() {
	fmt.Println(FormatRupiah(150000))
	fmt.Println(FormatRupiah(-50000))
	k := NewKeranjang("Budi")
	k.Tambah("buku tulis")
	k.Tambah("pulpen")
	fmt.Println(k.Ringkasan())
}
