package main

import (
	"encoding/xml"
	"fmt"
)

type Harga struct {
	MataUang string `xml:"mata_uang,attr"`
	Nilai    string `xml:",chardata"`
}

type Buku struct {
	ID      string `xml:"id,attr"`
	Judul   string `xml:"judul"`
	Penulis string `xml:"penulis"`
	Harga   Harga  `xml:"harga"`
	Rating  int    `xml:"-"` // tidak pernah ikut ke XML
}

type Katalog struct {
	XMLName xml.Name `xml:"katalog"`
	Toko    string   `xml:"toko,attr"`
	Buku    []Buku   `xml:"buku"`
}

func main() {
	k := Katalog{
		Toko: "Toko Buku Sejahtera",
		Buku: []Buku{
			{
				ID:      "B-01",
				Judul:   "Belajar Go",
				Penulis: "Budi Santoso",
				Harga:   Harga{MataUang: "IDR", Nilai: "95000"},
				Rating:  5,
			},
			{
				ID:      "B-02",
				Judul:   "Go untuk Data",
				Penulis: "Siti Aminah",
				Harga:   Harga{MataUang: "IDR", Nilai: "120000"},
				Rating:  4,
			},
		},
	}

	data, err := xml.MarshalIndent(k, "", "  ")
	if err != nil {
		fmt.Println("marshal gagal:", err)
		return
	}
	fmt.Println(string(data))

	sumber := []byte(`<katalog toko="Toko Buku Sejahtera">
  <buku id="B-03">
    <judul>Concurrency di Go</judul>
    <penulis>Rina Wijaya</penulis>
    <harga mata_uang="IDR">150000</harga>
  </buku>
</katalog>`)

	var k2 Katalog
	if err := xml.Unmarshal(sumber, &k2); err != nil {
		fmt.Println("unmarshal gagal:", err)
		return
	}
	fmt.Printf("hasil decode: %+v\n", k2)
	for _, b := range k2.Buku {
		fmt.Printf("buku %s: %s oleh %s, harga %s %s\n", b.ID, b.Judul, b.Penulis, b.Harga.Nilai, b.Harga.MataUang)
	}
}
