package main

import (
	"Study/pkg/github"
	"encoding/json"
	"fmt"
	"log"
	"os"
)

type Movie struct {
	Title  string
	Year   int  `json:"released"`
	Color  bool `json:"color,omitempty"`
	Actors []string
}

var movies = []Movie{
	{Title: "Casablanca", Year: 1942, Color: false,
		Actors: []string{"Humphrey Bogart", "Ingrid Bergman"}},
	{Title: "Cool Hand Luke", Year: 1967, Color: true,
		Actors: []string{"Paul Newman"}},
	{Title: "Bullitt", Year: 1968, Color: true,
		Actors: []string{"Steve McQueen", "Jacqueline Bisset"}},
	// ...
}

// 这样的数据结构特别适合JSON格式，并且在两者之间相互转换也很容易。
// 将一个Go语言中类似movies的结构体slice转为JSON的过程叫编组（marshaling）。
// 编组通过调用json.Marshal函数完成：
func main() {
	//data, err := json.Marshal(movies)
	data, err := json.MarshalIndent(movies, "", "\t")
	if err != nil {
		log.Fatalf("JSON marshaling failed: %s", err)
	}
	fmt.Printf("%s\n", data)

	// 编码的逆操作是解码，对应将JSON数据解码为Go语言的数据结构，
	// Go语言中一般叫unmarshaling，通过json.Unmarshal函数完成。
	// 下面的代码将JSON格式的电影数据解码为一个结构体slice，结构体中只有Title成员。
	// 通过定义合适的Go语言数据结构，我们可以选择性地解码JSON中感兴趣的成员。
	// 当Unmarshal函数调用返回，slice将被只含有Title信息的值填充，其它JSON成员将被忽略。
	var titles []struct{ Title string }
	if err := json.Unmarshal(data, &titles); err != nil {
		log.Fatalf("JSON unmarshaling failed: %s", err)
	}
	fmt.Println(titles)

	result, err := github.SearchIssues(os.Args[1:])
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%d issues:\n", result.TotalCount)
	for _, item := range result.Items {
		fmt.Printf("#%-5d %9.9s %.55s\n",
			item.Number, item.User.Login, item.Title)
	}

}
