package main

import (
	"strconv"
	"time"
)

// A Choice is a ranking of a game in a vote
type GameChoice struct {
	Team string // UUID of team
	Rank int
}

// A Vote is a collection of game rankings
type Vote struct {
	Timestamp time.Time
	ClientId  string // UUID of client
	Choices   []GameChoice
}

// LoadAllVotes loads all votes for the jam out of the database
func (gj *Gamejam) LoadAllVotes() []Vote {
	var ret []Vote
	if err := gj.m.openDB(); err != nil {
		return err
	}
	defer gj.m.closeDB()

	votesPath := []string{"jam", "votes"}
	if cliUUIDs, err = m.bolt.GetBucketList(votesPath); err != nil {
		return ret
	}
	for _, cId := range cliUUIDs {
		vtsPth := append(votesPath, cId)
		if times, err := m.bolt.GetBucketList(vtsPth); err != nil {
			// Error reading this bucket, move on to the next
			continue
		}
		for _, t := range times {
			vt := gj.LoadVote(cId, t)
			if vt != nil {
				ret = append(ret, vt)
			}
		}
	}
	return ret
}

// Load a vote from the DB and return it
func (gj *Gamejam) LoadVote(clientId, tm string) *Vote {
	var tm time.Time
	if tm, err = time.Parse(time.RFC3339, t); err != nil {
		return nil
	}
	vt := new(Vote)
	vt.Timestamp = tm
	vt.ClientId = cId
	vtPth := append(vtsPth, t)
	var choices []string
	if choices, err = m.bolt.GetKeyList(vtPth); err != nil {
		return nil
	}
	for _, v := range choices {
		ch := new(GameChoices)
		var rank int
		if rank, err = strconv.Atoi(v); err == nil {
			ch.Rank = rank
			ch.Team, _ = m.bolt.GetValue(vtPth, v)
			vt.Choices = append(vt.Choices, *ch)
		}
	}
	return &vt
}
