package commands import ( "database/sql" "errors" "fmt" "time" punchctx "punchcard/internal/context" "github.com/spf13/cobra" ) var ErrNoActiveTimer = errors.New("no active timer found") func NewOutCmd() *cobra.Command { return &cobra.Command{ Use: "out", Short: "Stop the active timer", Long: "Stop tracking time for the current work session by setting the end time of the active time entry.", Args: cobra.NoArgs, RunE: func(cmd *cobra.Command, args []string) error { q := punchctx.GetDB(cmd.Context()) if q == nil { return fmt.Errorf("database not available in context") } // Stop the active timer by setting end_time to now stoppedEntry, err := q.StopTimeEntry(cmd.Context()) if err != nil { if errors.Is(err, sql.ErrNoRows) { return ErrNoActiveTimer } return fmt.Errorf("failed to stop timer: %w", err) } // Calculate duration duration := stoppedEntry.EndTime.Time.Sub(stoppedEntry.StartTime) // Output success message cmd.Printf("Timer stopped. Session duration: %v\n", duration.Round(time.Second)) // Show entry ID for reference cmd.Printf("Time entry ID: %d\n", stoppedEntry.ID) return nil }, } }