package database

import (
	"labix.org/v2/mgo"
	"labix.org/v2/mgo/bson"
)

const (
	books_coll = "books"
)

type Book struct {
	Id          string `bson:"_id"`
	Title       string
	Author      []string
	Contributor string
	Publisher   string
	Description string
	Subject     []string
	Date        string
	Lang        []string
	Isbn        string
	Type        string
	Format      string
	Source      string
	Relation    string
	Coverage    string
	Rights      string
	Meta        string
	File        bson.ObjectId
	FileSize    int
	Cover       bson.ObjectId
	CoverSmall  bson.ObjectId
	Active      bool
	Keywords    []string
}

func addBook(coll *mgo.Collection, book interface{}) error {
	return coll.Insert(book)
}

func getBooks(coll *mgo.Collection, query bson.M, length int, start int) (books []Book, num int, err error) {
	q := coll.Find(query).Sort("-_id")
	num, err = q.Count()
	if err != nil {
		return
	}
	if start != 0 {
		q = q.Skip(start)
	}
	if length != 0 {
		q = q.Limit(length)
	}

	err = q.All(&books)
	for i, b := range books {
		books[i].Id = bson.ObjectId(b.Id).Hex()
	}
	return
}

func deleteBook(coll *mgo.Collection, id bson.ObjectId) error {
	return coll.Remove(bson.M{"_id": id})
}

func updateBook(coll *mgo.Collection, id bson.ObjectId, data interface{}) error {
	return coll.Update(bson.M{"_id": id}, bson.M{"$set": data})
}

func bookActive(coll *mgo.Collection, id bson.ObjectId) bool {
	var book Book
	err := coll.Find(bson.M{"_id": id}).One(&book)
	if err != nil {
		return false
	}
	return book.Active
}