// Copyright 2018 Team 254. All Rights Reserved.
// Author: pat@patfairbank.com (Patrick Fairbank)
//
// Model and datastore CRUD methods for a schedule block at an event.

package model

import (
	"sort"
	"time"
)

type ScheduleBlock struct {
	Id              int `db:"id"`
	MatchType       string
	StartTime       time.Time
	NumMatches      int
	MatchSpacingSec int
}

func (database *Database) CreateScheduleBlock(block *ScheduleBlock) error {
	return database.scheduleBlockTable.create(block)
}

func (database *Database) GetScheduleBlocksByMatchType(matchType string) ([]ScheduleBlock, error) {
	var scheduleBlocks []ScheduleBlock
	if err := database.scheduleBlockTable.getAll(&scheduleBlocks); err != nil {
		return nil, err
	}

	var matchingScheduleBlocks []ScheduleBlock
	for _, scheduleBlock := range scheduleBlocks {
		if scheduleBlock.MatchType == matchType {
			matchingScheduleBlocks = append(matchingScheduleBlocks, scheduleBlock)
		}
	}

	sort.Slice(matchingScheduleBlocks, func(i, j int) bool {
		return matchingScheduleBlocks[i].StartTime.Before(matchingScheduleBlocks[j].StartTime)
	})
	return matchingScheduleBlocks, nil
}

func (database *Database) DeleteScheduleBlocksByMatchType(matchType string) error {
	scheduleBlocks, err := database.GetScheduleBlocksByMatchType(matchType)
	if err != nil {
		return err
	}

	for _, scheduleBlock := range scheduleBlocks {
		if err = database.scheduleBlockTable.delete(scheduleBlock.Id); err != nil {
			return err
		}
	}
	return nil
}

func (database *Database) TruncateScheduleBlocks() error {
	return database.scheduleBlockTable.truncate()
}
