package commands import ( "fmt" "punchcard/internal/actions" "punchcard/internal/context" "github.com/spf13/cobra" ) func NewAddClientCmd() *cobra.Command { cmd := &cobra.Command{ Use: "client []", Short: "Add a new client", Long: "Add a new client to the database. Name can include email in format 'Name '", Args: cobra.RangeArgs(1, 2), RunE: func(cmd *cobra.Command, args []string) error { name := args[0] var email string if len(args) > 1 { email = args[1] } billableRateFloat, _ := cmd.Flags().GetFloat64("hourly-rate") var billableRate *float64 if billableRateFloat > 0 { billableRate = &billableRateFloat } q := context.GetDB(cmd.Context()) if q == nil { return fmt.Errorf("database not available in context") } a := actions.New(q) client, err := a.CreateClient(cmd.Context(), name, email, billableRate) if err != nil { return err } output := fmt.Sprintf("Created client: %s", client.Name) if client.Email.Valid { output += fmt.Sprintf(" <%s>", client.Email.String) } output += fmt.Sprintf(" (ID: %d)\n", client.ID) cmd.Print(output) return nil }, } cmd.Flags().Float64P("hourly-rate", "r", 0, "Default hourly billable rate for this client") return cmd }