2019-08-09 23:13:45 -07:00
|
|
|
// Copyright 2019 Team 254. All Rights Reserved.
|
|
|
|
|
// Author: pat@patfairbank.com (Patrick Fairbank)
|
|
|
|
|
//
|
|
|
|
|
// Functions for managing awards and their associated lower thirds.
|
|
|
|
|
|
|
|
|
|
package tournament
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
2021-05-16 11:00:29 -07:00
|
|
|
"github.com/Team254/cheesy-arena-lite/model"
|
2019-08-09 23:13:45 -07:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// Creates or updates the given award, depending on whether or not it already exists.
|
|
|
|
|
func CreateOrUpdateAward(database *model.Database, award *model.Award, createIntroLowerThird bool) error {
|
|
|
|
|
// Validate the award data.
|
|
|
|
|
if award.AwardName == "" {
|
|
|
|
|
return fmt.Errorf("Award name cannot be blank.")
|
|
|
|
|
}
|
|
|
|
|
var team *model.Team
|
|
|
|
|
if award.TeamId > 0 {
|
|
|
|
|
team, _ = database.GetTeamById(award.TeamId)
|
|
|
|
|
if team == nil {
|
|
|
|
|
return fmt.Errorf("Team %d is not present at this event.", award.TeamId)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var err error
|
|
|
|
|
if award.Id == 0 {
|
|
|
|
|
err = database.CreateAward(award)
|
|
|
|
|
} else {
|
2021-05-09 21:12:23 -07:00
|
|
|
err = database.UpdateAward(award)
|
2019-08-09 23:13:45 -07:00
|
|
|
}
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Create or update associated lower thirds.
|
|
|
|
|
awardIntroLowerThird := model.LowerThird{TopText: award.AwardName, AwardId: award.Id}
|
|
|
|
|
awardWinnerLowerThird := model.LowerThird{TopText: award.AwardName, BottomText: award.PersonName,
|
|
|
|
|
AwardId: award.Id}
|
|
|
|
|
if team != nil {
|
|
|
|
|
if award.PersonName == "" {
|
|
|
|
|
awardWinnerLowerThird.BottomText = fmt.Sprintf("Team %d, %s", team.Id, team.Nickname)
|
|
|
|
|
} else {
|
|
|
|
|
awardWinnerLowerThird.BottomText = fmt.Sprintf("%s – Team %d, %s", award.PersonName, team.Id,
|
|
|
|
|
team.Nickname)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if awardWinnerLowerThird.BottomText == "" {
|
|
|
|
|
awardWinnerLowerThird.BottomText = "(No awardee assigned yet)"
|
|
|
|
|
}
|
|
|
|
|
lowerThirds, err := database.GetLowerThirdsByAwardId(award.Id)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
bottomIndex := 0
|
|
|
|
|
if createIntroLowerThird {
|
|
|
|
|
if err = createOrUpdateAwardLowerThird(database, &awardIntroLowerThird, lowerThirds, 0); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
bottomIndex++
|
|
|
|
|
}
|
|
|
|
|
if err = createOrUpdateAwardLowerThird(database, &awardWinnerLowerThird, lowerThirds, bottomIndex); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Deletes the given award and any associated lower thirds.
|
2021-05-12 17:49:05 -07:00
|
|
|
func DeleteAward(database *model.Database, awardId int) error {
|
2021-05-09 21:12:23 -07:00
|
|
|
if err := database.DeleteAward(awardId); err != nil {
|
2019-08-09 23:13:45 -07:00
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Delete lower thirds.
|
2021-05-09 21:12:23 -07:00
|
|
|
lowerThirds, err := database.GetLowerThirdsByAwardId(awardId)
|
2019-08-09 23:13:45 -07:00
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
for _, lowerThird := range lowerThirds {
|
2021-05-09 21:12:23 -07:00
|
|
|
if err = database.DeleteLowerThird(lowerThird.Id); err != nil {
|
2019-08-09 23:13:45 -07:00
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Generates awards and lower thirds for the tournament winners and finalists.
|
|
|
|
|
func CreateOrUpdateWinnerAndFinalistAwards(database *model.Database, winnerAllianceId, finalistAllianceId int) error {
|
2022-07-31 12:08:43 -07:00
|
|
|
var winnerAlliance, finalistAlliance *model.Alliance
|
2019-08-09 23:13:45 -07:00
|
|
|
var err error
|
2022-07-31 12:08:43 -07:00
|
|
|
if winnerAlliance, err = database.GetAllianceById(winnerAllianceId); err != nil {
|
2019-08-09 23:13:45 -07:00
|
|
|
return err
|
|
|
|
|
}
|
2022-07-31 12:08:43 -07:00
|
|
|
if finalistAlliance, err = database.GetAllianceById(finalistAllianceId); err != nil {
|
2019-08-09 23:13:45 -07:00
|
|
|
return err
|
|
|
|
|
}
|
2022-07-31 12:08:43 -07:00
|
|
|
if winnerAlliance == nil || finalistAlliance == nil {
|
|
|
|
|
return fmt.Errorf("Winner and/or finalist alliances do not exist.")
|
|
|
|
|
}
|
|
|
|
|
if len(winnerAlliance.TeamIds) == 0 || len(finalistAlliance.TeamIds) == 0 {
|
|
|
|
|
return fmt.Errorf("Winner and/or finalist alliances do not contain teams.")
|
2019-08-09 23:13:45 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Clear out any awards that may exist if the final match was scored more than once.
|
|
|
|
|
winnerAwards, err := database.GetAwardsByType(model.WinnerAward)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
finalistAwards, err := database.GetAwardsByType(model.FinalistAward)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
for _, award := range append(winnerAwards, finalistAwards...) {
|
|
|
|
|
if err = DeleteAward(database, award.Id); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Create the finalist awards first since they're usually presented first.
|
2022-07-31 12:08:43 -07:00
|
|
|
finalistAward := model.Award{
|
|
|
|
|
AwardName: "Finalist",
|
|
|
|
|
Type: model.FinalistAward,
|
|
|
|
|
TeamId: finalistAlliance.TeamIds[0],
|
|
|
|
|
}
|
2019-08-09 23:13:45 -07:00
|
|
|
if err = CreateOrUpdateAward(database, &finalistAward, true); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
2022-07-31 12:08:43 -07:00
|
|
|
for _, allianceTeamId := range finalistAlliance.TeamIds[1:] {
|
2019-08-09 23:13:45 -07:00
|
|
|
finalistAward.Id = 0
|
2022-07-31 12:08:43 -07:00
|
|
|
finalistAward.TeamId = allianceTeamId
|
2019-08-09 23:13:45 -07:00
|
|
|
if err = CreateOrUpdateAward(database, &finalistAward, false); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Create the winner awards.
|
2022-07-31 12:08:43 -07:00
|
|
|
winnerAward := model.Award{
|
|
|
|
|
AwardName: "Winner",
|
|
|
|
|
Type: model.WinnerAward,
|
|
|
|
|
TeamId: winnerAlliance.TeamIds[0],
|
|
|
|
|
}
|
2019-08-09 23:13:45 -07:00
|
|
|
if err = CreateOrUpdateAward(database, &winnerAward, true); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
2022-07-31 12:08:43 -07:00
|
|
|
for _, allianceTeamId := range winnerAlliance.TeamIds[1:] {
|
2019-08-09 23:13:45 -07:00
|
|
|
winnerAward.Id = 0
|
2022-07-31 12:08:43 -07:00
|
|
|
winnerAward.TeamId = allianceTeamId
|
2019-08-09 23:13:45 -07:00
|
|
|
if err = CreateOrUpdateAward(database, &winnerAward, false); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func createOrUpdateAwardLowerThird(database *model.Database, lowerThird *model.LowerThird,
|
|
|
|
|
existingLowerThirds []model.LowerThird, index int) error {
|
|
|
|
|
if index < len(existingLowerThirds) {
|
|
|
|
|
lowerThird.Id = existingLowerThirds[index].Id
|
|
|
|
|
lowerThird.DisplayOrder = existingLowerThirds[index].DisplayOrder
|
2021-05-09 21:12:23 -07:00
|
|
|
return database.UpdateLowerThird(lowerThird)
|
2019-08-09 23:13:45 -07:00
|
|
|
} else {
|
|
|
|
|
lowerThird.DisplayOrder = database.GetNextLowerThirdDisplayOrder()
|
|
|
|
|
return database.CreateLowerThird(lowerThird)
|
|
|
|
|
}
|
|
|
|
|
}
|