Files
worktimeBot/internal/bot/totals.go

74 lines
1.3 KiB
Go

package bot
import (
"sort"
"worktimeBot/internal/db"
)
type State int
const (
StateIdle State = iota
StateWorking
StateOnBreak
)
type DailyTotals struct {
TotalSeconds int64
BreakSeconds int64
PairCount int
}
func ComputeDailyTotals(events []db.Event) DailyTotals {
if len(events) == 0 {
return DailyTotals{}
}
sorted := make([]db.Event, len(events))
copy(sorted, events)
sort.Slice(sorted, func(i, j int) bool {
return sorted[i].OccurredAt < sorted[j].OccurredAt
})
var workTotal, breakTotal int64
var workStart, breakStart int64
pairs := 0
state := StateIdle
for _, e := range sorted {
switch e.EventType {
case "in":
switch state {
case StateIdle:
workStart = e.OccurredAt
state = StateWorking
case StateOnBreak:
breakTotal += e.OccurredAt - breakStart
breakStart = 0
workStart = e.OccurredAt
state = StateWorking
}
case "out":
switch state {
case StateWorking:
workTotal += e.OccurredAt - workStart
workStart = 0
pairs++
breakStart = e.OccurredAt
state = StateOnBreak
case StateIdle:
breakStart = e.OccurredAt
state = StateOnBreak
case StateOnBreak:
breakStart = e.OccurredAt
}
}
}
return DailyTotals{
TotalSeconds: workTotal,
BreakSeconds: breakTotal,
PairCount: pairs,
}
}