package item

// WrittenBook is the item created after a book and quill is signed. It appears the same as a regular book, but
// without the quill, and has an enchanted-looking glint.
type WrittenBook struct {
	// Title is the title of the book.
	Title string
	// Author is the author of the book.
	Author string
	// Generation is the copy tier of the book. 0 = original, 1 = copy of original,
	// 2 = copy of copy.
	Generation WrittenBookGeneration
	// Pages represents the pages within the book.
	Pages []string
}

// MaxCount always returns 16.
func (WrittenBook) MaxCount() int {
	return 16
}

// TotalPages returns the total number of pages in the book.
func (w WrittenBook) TotalPages() int {
	return len(w.Pages)
}

// Page returns a specific page from the book and true when the page exists. It will otherwise return an empty string
// and false.
func (w WrittenBook) Page(page int) (string, bool) {
	if page < 0 || len(w.Pages) <= page {
		return "", false
	}
	return w.Pages[page], true
}

// DecodeNBT ...
func (w WrittenBook) DecodeNBT(data map[string]any) any {
	if pages, ok := data["pages"].([]any); ok {
		w.Pages = make([]string, len(pages))
		for i, page := range pages {
			w.Pages[i] = page.(map[string]any)["text"].(string)
		}
	}
	w.Title, _ = data["title"].(string)
	w.Author, _ = data["author"].(string)
	if v, ok := data["generation"].(uint8); ok {
		switch v {
		case 0:
			w.Generation = OriginalGeneration()
		case 1:
			w.Generation = CopyGeneration()
		case 2:
			w.Generation = CopyOfCopyGeneration()
		}
	}
	return w
}

// EncodeNBT ...
func (w WrittenBook) EncodeNBT() map[string]any {
	pages := make([]any, 0, len(w.Pages))
	for _, page := range w.Pages {
		pages = append(pages, map[string]any{"text": page})
	}
	return map[string]any{
		"pages":      pages,
		"author":     w.Author,
		"title":      w.Title,
		"generation": w.Generation.Uint8(),
	}
}

// EncodeItem ...
func (WrittenBook) EncodeItem() (name string, meta int16) {
	return "minecraft:written_book", 0
}
