package user

import (
	"fmt"

	"github.com/spf13/cobra"
	"gitlab.c3sl.ufpr.br/tss24/useradm/internal/auth"
	"gitlab.c3sl.ufpr.br/tss24/useradm/internal/manage"
	"gitlab.c3sl.ufpr.br/tss24/useradm/pkg/utils"
)

var GroupCmd = &cobra.Command{
	Use:     "group [username] [new-group]",
	Short:   "Change a user's base group",
	Example: "  useradm user group mvrp22 ppginf",
	Args:    cobra.ExactArgs(2),
	RunE:    groupUserCmd,
}

func init() {
	GroupCmd.Flags().BoolP("confirm", "y", false, "Skip confirmation prompt")
}

func groupUserCmd(cmd *cobra.Command, args []string) error {
	confirm, err := cmd.Flags().GetBool("confirm")
	if err != nil {
		return err
	}

	l, err := auth.ConnLDAP()
	if err != nil {
		return err
	}
	defer l.Close()

	// Locate returns a error if more than one user was found
	u, err := manage.Locate(l, args[0])
	if err != nil {
		return err
	}

	groups, err := auth.GetAllGroupsLDAP(l)
	if err != nil {
		return err
	}

	// checks if group does in fact exist
	_, err = utils.GetGIDNumFromGID(groups, args[1])
	if err != nil {
		return err
	}

	fmt.Printf("%v\n", u.FullToString())
	utils.ConfirmationPrompt(confirm, "user group change")

	err = auth.ChangeBaseGroupLDAP(l, u.DN, args[1])
	if err != nil {
		return err
	}

	fmt.Println("Base group updated!")

	return nil
}