1// SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
2//
3// SPDX-License-Identifier: AGPL-3.0-or-later
4
5package person
6
7import (
8 "fmt"
9
10 "git.secluded.site/go-lunatask"
11 "git.secluded.site/lune/internal/client"
12 "git.secluded.site/lune/internal/completion"
13 "git.secluded.site/lune/internal/ui"
14 "git.secluded.site/lune/internal/validate"
15 "github.com/spf13/cobra"
16)
17
18// AddCmd creates a new person. Exported for potential use by shortcuts.
19var AddCmd = &cobra.Command{
20 Use: "add FIRST LAST",
21 Short: "Add a new person",
22 Long: `Add a new person to the Lunatask relationship tracker.
23
24Names are required. Use flags to set additional properties.`,
25 Args: cobra.ExactArgs(2),
26 RunE: runAdd,
27}
28
29func init() {
30 AddCmd.Flags().StringP("relationship", "r", "", "Relationship strength")
31 AddCmd.Flags().String("source", "", "Source identifier")
32 AddCmd.Flags().String("source-id", "", "Source ID")
33
34 _ = AddCmd.RegisterFlagCompletionFunc("relationship", completion.Relationships)
35}
36
37func runAdd(cmd *cobra.Command, args []string) error {
38 firstName := args[0]
39 lastName := args[1]
40
41 apiClient, err := client.New()
42 if err != nil {
43 return err
44 }
45
46 builder := apiClient.NewPerson(firstName, lastName)
47
48 if err := applyRelationship(cmd, builder); err != nil {
49 return err
50 }
51
52 applySource(cmd, builder)
53
54 person, err := builder.Create(cmd.Context())
55 if err != nil {
56 return err
57 }
58
59 fmt.Fprintln(cmd.OutOrStdout(), ui.Success.Render("Created person: "+person.ID))
60
61 return nil
62}
63
64func applyRelationship(cmd *cobra.Command, builder *lunatask.PersonBuilder) error {
65 rel, _ := cmd.Flags().GetString("relationship")
66 if rel == "" {
67 return nil
68 }
69
70 strength, err := validate.RelationshipStrength(rel)
71 if err != nil {
72 return err
73 }
74
75 builder.WithRelationshipStrength(strength)
76
77 return nil
78}
79
80func applySource(cmd *cobra.Command, builder *lunatask.PersonBuilder) {
81 source, _ := cmd.Flags().GetString("source")
82 sourceID, _ := cmd.Flags().GetString("source-id")
83
84 if source != "" && sourceID != "" {
85 builder.FromSource(source, sourceID)
86 }
87}