// Copyright 2014 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package main

import (
	"fmt"
	"log"
	"net/http"
	"os"
	"strconv"
	"strings"

	books "google.golang.org/api/books/v1"
)

func init() {
	registerDemo("books", books.BooksScope, booksMain)
}

// booksMain is an example that demonstrates calling the Books API.
//
// Example usage:
//   go build -o go-api-demo *.go
//   go-api-demo -clientid="my-clientid" -secret="my-secret" books
func booksMain(client *http.Client, argv []string) {
	if len(argv) != 0 {
		fmt.Fprintln(os.Stderr, "Usage: books")
		return
	}

	svc, err := books.New(client)
	if err != nil {
		log.Fatalf("Unable to create Books service: %v", err)
	}

	bs, err := svc.Mylibrary.Bookshelves.List().Do()
	if err != nil {
		log.Fatalf("Unable to retrieve mylibrary bookshelves: %v", err)
	}

	if len(bs.Items) == 0 {
		log.Fatal("You have no bookshelves to explore.")
	}
	for _, b := range bs.Items {
		// Note that sometimes VolumeCount is not populated, so it may erroneously say '0'.
		log.Printf("You have %v books on bookshelf %q:", b.VolumeCount, b.Title)

		// List the volumes on this shelf.
		vol, err := svc.Mylibrary.Bookshelves.Volumes.List(strconv.FormatInt(b.Id, 10)).Do()
		if err != nil {
			log.Fatalf("Unable to retrieve mylibrary bookshelf volumes: %v", err)
		}
		for _, v := range vol.Items {
			var s []string
			if v.VolumeInfo.ReadingModes.Image {
				s = append(s, "image")
			} else {
				s = append(s, "text")
			}
			extra := fmt.Sprintf("; formats: %v", s)
			if v.VolumeInfo.ImageLinks != nil {
				extra += fmt.Sprintf("; thumbnail: %v", v.VolumeInfo.ImageLinks.Thumbnail)
			}
			log.Printf("  %q by %v%v", v.VolumeInfo.Title, strings.Join(v.VolumeInfo.Authors, ", "), extra)
		}
	}
}
