package main

import (
	"errors"
	"strings"
	"time"
)

/**
 * Gamejam
 * Gamejam is the struct for any gamejam (current or archived)
 */
type Gamejam struct {
	UUID  string
	Name  string
	Date  time.Time
	Teams []Team
	Votes []Vote

	m     *model   // The model that holds this gamejam's data
	mPath []string // The path in the db to this gamejam

	IsChanged bool // Flag to tell if we need to update the db
}

func NewGamejam(m *model) *Gamejam {
	gj := new(Gamejam)
	gj.m = m
	gj.mPath = []string{"jam"}
	return gj
}

/**
 * DB Functions
 * These are generally just called when the app starts up, or when the periodic 'save' runs
 */

func (m *model) LoadCurrentJam() (*Gamejam, error) {
	if err := m.openDB(); err != nil {
		return nil, err
	}
	defer m.closeDB()

	gj := NewGamejam(m)
	gj.Name, _ = m.bolt.GetValue(gj.mPath, "name")

	// Load all teams
	gj.Teams = gj.LoadAllTeams()

	// Load all votes
	gj.Votes = gj.LoadAllVotes()

	return gj, nil
}

// Save everything to the DB whether it's flagged as changed or not
func (gj *Gamejam) SaveToDB() error {
	if err := gj.m.openDB(); err != nil {
		return err
	}
	defer gj.m.closeDB()

	var errs []error
	if err := gj.m.bolt.SetValue(gj.mPath, "name", gj.Name); err != nil {
		errs = append(errs, err)
	}
	// Save all Teams
	for _, tm := range gj.Teams {
		if err := gj.SaveTeam(&tm); err != nil {
			errs = append(errs, err)
		}
	}

	// Save all Votes
	for _, vt := range gj.Votes {
		if err := gj.SaveVote(&vt); err != nil {
			errs = append(errs, err)
		}
	}
	if len(errs) > 0 {
		var errTxt string
		for i := range errs {
			errTxt = errTxt + errs[i].Error() + "\n"
		}
		errTxt = strings.TrimSpace(errTxt)
		return errors.New("Error(s) saving to DB: " + errTxt)
	}
	return nil
}
