// SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
//
// SPDX-License-Identifier: AGPL-3.0-or-later

package person

import (
	"fmt"

	"git.secluded.site/go-lunatask"
	"git.secluded.site/lune/internal/client"
	"git.secluded.site/lune/internal/completion"
	"git.secluded.site/lune/internal/ui"
	"git.secluded.site/lune/internal/validate"
	"github.com/spf13/cobra"
)

// AddCmd creates a new person. Exported for potential use by shortcuts.
var AddCmd = &cobra.Command{
	Use:   "add FIRST [LAST]",
	Short: "Add a new person",
	Long: `Add a new person to the Lunatask relationship tracker.

First name is required; last name is optional.
Use flags to set additional properties.`,
	Args: cobra.RangeArgs(1, 2),
	RunE: runAdd,
}

func init() {
	AddCmd.Flags().StringP("relationship", "r", "", "Relationship strength")
	AddCmd.Flags().String("source", "", "Source identifier")
	AddCmd.Flags().String("source-id", "", "Source ID")

	_ = AddCmd.RegisterFlagCompletionFunc("relationship", completion.Relationships)
}

func runAdd(cmd *cobra.Command, args []string) error {
	firstName := args[0]

	lastName := ""
	if len(args) > 1 {
		lastName = args[1]
	}

	apiClient, err := client.New()
	if err != nil {
		return err
	}

	builder := apiClient.NewPerson(firstName, lastName)

	if err := applyRelationship(cmd, builder); err != nil {
		return err
	}

	applySource(cmd, builder)

	person, err := ui.Spin("Creating person…", func() (*lunatask.Person, error) {
		return builder.Create(cmd.Context())
	})
	if err != nil {
		return err
	}

	fmt.Fprintln(cmd.OutOrStdout(), ui.Success.Render("Created person: "+person.ID))

	return nil
}

func applyRelationship(cmd *cobra.Command, builder *lunatask.PersonBuilder) error {
	rel, _ := cmd.Flags().GetString("relationship")
	if rel == "" {
		return nil
	}

	strength, err := validate.RelationshipStrength(rel)
	if err != nil {
		return err
	}

	builder.WithRelationshipStrength(strength)

	return nil
}

func applySource(cmd *cobra.Command, builder *lunatask.PersonBuilder) {
	source, _ := cmd.Flags().GetString("source")
	sourceID, _ := cmd.Flags().GetString("source-id")

	if source != "" && sourceID != "" {
		builder.FromSource(source, sourceID)
	}
}
