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, minBreakThreshold int64) 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: breakDuration := e.OccurredAt - breakStart if minBreakThreshold > 0 && breakDuration <= minBreakThreshold { workStart = breakStart } else { breakTotal += breakDuration 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, } }