package user

import (
	"bufio"
	"fmt"
	"os"
	"strings"

	"github.com/spf13/cobra"
	"gitlab.c3sl.ufpr.br/tss24/useradm/model"
)

var CreateCmd = &cobra.Command{
	Use:   "create",
	Short: "Create new user",
	RunE:  createUserFunc,
}

func init() {
	// Possible Flags
	CreateCmd.Flags().StringP("grr", "r", "", "User GRR, required for ini type")
	CreateCmd.Flags().StringP("type", "t", "ini", "Type of auto-generated login: ini, first or last")
	CreateCmd.Flags().StringP("path", "w", "", "Path to webdir      (e.g. path/login)")
	CreateCmd.Flags().StringP("name", "n", "", "User full name      (use quotes for spaces)")
	CreateCmd.Flags().StringP("login", "l", "", "User login name     (auto-generated if empty)")
	CreateCmd.Flags().StringP("group", "g", "", "User initial group")
	CreateCmd.Flags().StringP("shell", "s", "/bin/bash", "Full path to shell ")
	CreateCmd.Flags().StringP("homedir", "d", "", "Home directory path (/home/group/login if empty)")
	CreateCmd.Flags().StringP("password", "p", "", "User password       (auto-generated if empty)")

	// Required Flags
	CreateCmd.MarkFlagRequired("name")
	CreateCmd.MarkFlagRequired("type")
	CreateCmd.MarkFlagRequired("group")

	CreateCmd.Flags().BoolP("confirm", "y", false, "Skip confirmation prompt")
}

func createUserFunc(cmd *cobra.Command, args []string) error {
	confirm, err := cmd.Flags().GetBool("confirm")
	if err != nil {
		return err
	}
	userName, err := cmd.Flags().GetString("name")
	if err != nil {
		return err
	}
	userType, err := cmd.Flags().GetString("type")
	if err != nil {
		return err
	}
	userGroup, err := cmd.Flags().GetString("group")
	if err != nil {
		return err
	}
	userGRR, err := cmd.Flags().GetString("grr")
	if err != nil {
		return err
	}
	userPath, err := cmd.Flags().GetString("path")
	if err != nil {
		return err
	}
	userLogin, err := cmd.Flags().GetString("login")
	if err != nil {
		return err
	}
	userShell, err := cmd.Flags().GetString("shell")
	if err != nil {
		return err
	}
	userHomedir, err := cmd.Flags().GetString("homedir")
	if err != nil {
		return err
	}
	userPassword, err := cmd.Flags().GetString("password")
	if err != nil {
		return err
	}

	user := model.User{
		Name:     userName,
		Ltype:    userType,
		Group:    userGroup,
		GRR:      userGRR,
		Path:     userPath,
		Login:    ifThenElse(userLogin != "", userLogin, "[auto-generate]"),
		Shell:    userShell,
		Homedir:  userHomedir,
		Password: ifThenElse(userPassword != "", "[set]", "[auto-generate]"),
	}

	fmt.Println(user.ToString())

	if !confirm {
		fmt.Print("Proceed with user creation? [y/N] ")
		reader := bufio.NewReader(os.Stdin)
		response, _ := reader.ReadString('\n')
		if strings.TrimSpace(strings.ToLower(response)) != "y" {
			fmt.Fprintln(os.Stderr, "Aborted.")
			os.Exit(1)
		}
	}

	fmt.Println("Done!")

	return nil
}

func ifThenElse(condition bool, a string, b string) string {
	if condition {
		return a
	}
	return b
}