package main

import (
	"encoding/json"
	"errors"
	"fmt"
)

type Alamat struct {
	Kota    string
	KodePos string
}

type Pengguna struct {
	Nama      string
	Umur      int
	Email     string
	Alamat    Alamat
	Hobi      []string
	Pekerjaan map[string]string
}

type Akun struct {
	Nama  string
	sandi string // unexported: tidak pernah ikut ke JSON
}

func main() {
	p := Pengguna{
		Nama:   "Budi",
		Umur:   25,
		Email:  "budi@example.com",
		Alamat: Alamat{Kota: "Bandung", KodePos: "40115"},
		Hobi:   []string{"membaca", "bersepeda"},
		Pekerjaan: map[string]string{
			"perusahaan": "PT Maju Bersama",
			"posisi":     "Backend Engineer",
		},
	}

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

	sumber := []byte(`{
		"Nama": "Siti",
		"Umur": 28,
		"Email": "siti@example.com",
		"Alamat": {"Kota": "Surabaya", "KodePos": "60111"},
		"Hobi": ["memasak", "menjahit"],
		"Pekerjaan": {"posisi": "Frontend Engineer"},
		"Telepon": "0812-0000-0000"
	}`)

	var p2 Pengguna
	if err := json.Unmarshal(sumber, &p2); err != nil {
		fmt.Println("unmarshal gagal:", err)
		return
	}
	fmt.Printf("hasil decode: %+v\n", p2)

	dataAkun, _ := json.Marshal(Akun{Nama: "Siti", sandi: "rahasia-123"})
	fmt.Println("akun:", string(dataAkun))

	var dinamis map[string]any
	json.Unmarshal([]byte(`{"umur": 25, "aktif": true, "nama": "Budi"}`), &dinamis)
	for _, k := range []string{"nama", "umur", "aktif"} {
		fmt.Printf("dinamis[%s] = %v bertipe %T\n", k, dinamis[k], dinamis[k])
	}

	var galatTipe Pengguna
	err1 := json.Unmarshal([]byte(`{"Umur":"dua puluh lima"}`), &galatTipe)
	fmt.Println("galat 1:", err1)
	var targetTipe *json.UnmarshalTypeError
	fmt.Println("galat 1 adalah UnmarshalTypeError?", errors.As(err1, &targetTipe))

	var galatSintaks Pengguna
	err2 := json.Unmarshal([]byte(`{"Nama":`), &galatSintaks)
	fmt.Println("galat 2:", err2)
	var targetSintaks *json.SyntaxError
	fmt.Println("galat 2 adalah SyntaxError?", errors.As(err2, &targetSintaks))
}
