package main

import (
	"labix.org/v2/mgo"
	"labix.org/v2/mgo/bson"
	"net/http"
	"strconv"
	"strings"
)

func buildQuery(q string) bson.M {
	var reg []bson.RegEx
	query := bson.M{}
	words := strings.Split(q, " ")
	for _, w := range words {
		tag := strings.SplitN(w, ":", 2)
		if len(tag) > 1 {
			query[tag[0]] = bson.RegEx{tag[1], "i"}
		} else {
			reg = append(reg, bson.RegEx{w, "i"})
		}
	}
	if len(reg) > 0 {
		query["keywords"] = bson.M{"$all": reg}
	}
	return query
}

type searchData struct {
	S     Status
	Found int
	Books []Book
	Page  int
	Next  string
	Prev  string
}

func searchHandler(coll *mgo.Collection) func(http.ResponseWriter, *http.Request) {
	return func(w http.ResponseWriter, r *http.Request) {
		err := r.ParseForm()
		if err != nil {
			http.Error(w, err.Error(), http.StatusInternalServerError)
			return
		}
		req := strings.Join(r.Form["q"], " ")
		page := 0
		if len(r.Form["p"]) != 0 {
			page, err = strconv.Atoi(r.Form["p"][0])
			if err != nil {
				page = 0
			}
		}
		res, num, _ := GetBook(coll, buildQuery(req), SEARCH_ITEMS_PAGE, page*SEARCH_ITEMS_PAGE)

		var data searchData
		data.S = GetStatus(w, r)
		data.S.Search = req
		data.Books = res
		data.Found = num
		data.Page = page + 1
		if num > (page+1)*SEARCH_ITEMS_PAGE {
			data.Next = "/search/?q=" + req + "&p=" + strconv.Itoa(page+1)
		}
		if page > 0 {
			data.Prev = "/search/?q=" + req + "&p=" + strconv.Itoa(page-1)
		}
		loadTemplate(w, "search", data)
	}
}