package cli

import (
	"context"
	"flag"
	"strconv"

	"github.com/tidbcloud/account/idl/pbgen/proto/account"
)

func MainGetUserByEmail(ctx context.Context, client Client, args []string) {
	set := flag.NewFlagSet("GetUserByEmail", flag.ExitOnError)
	makeSimpleUsage(set, "usage: GetUserByEmail [email ...]")
	_ = set.Parse(args)

	if set.NArg() <= 0 {
		set.Usage()
		return
	}

	for _, email := range set.Args() {
		request := &account.GetUserByEmailRequest{
			Email: email,
		}

		OutputStep("GetUserByEmail(email=%s)", email)
		response, err := client.GetUserByEmail(ctx, request)
		OutputResponse(response, err)
	}
}

func MainGetUserByID(ctx context.Context, client Client, args []string) {
	set := flag.NewFlagSet("GetUserByID", flag.ExitOnError)
	set.Bool("json", false, "output in json format, equivalent to -format=json")
	makeSimpleUsage(set, "usage: GetUserByID [id ...]")
	_ = set.Parse(args)

	if set.NArg() <= 0 {
		set.Usage()
		return
	}

	for _, ids := range set.Args() {
		OutputStep("GetUserByID(id=%s)", ids)
		id, err := strconv.ParseUint(ids, 10, 64)
		OutputError(err)
		if err != nil {
			continue
		}

		request := &account.GetUserByIDRequest{
			UserId: id,
		}
		response, err := client.GetUserByID(ctx, request)
		OutputResponse(response, err)
	}
}

func MainListUsers(ctx context.Context, client Client, args []string) {
	set := flag.NewFlagSet("ListUsers", flag.ExitOnError)
	makeSimpleUsage(set, "usage: ListUsers [user_id ...]")
	_ = set.Parse(args)

	request := &account.UserFilter{}

	for _, ids := range set.Args() {
		OutputStep("read user id: %s", ids)
		id, err := strconv.ParseUint(ids, 10, 64)
		OutputError(err)
		if err != nil {
			continue
		}

		request.UserIds = append(request.UserIds, id)
	}

	OutputStep("ListUsers(user_ids=%v)", request.UserIds)
	response, err := client.ListUsers(ctx, request)
	OutputResponse(response, err)
}

func MainGetSystemUser(ctx context.Context, client Client, args []string) {
	set := flag.NewFlagSet("GetSystemUser", flag.ExitOnError)
	orgID := set.Uint64("orgID", 0, "org ID")
	_ = set.Parse(args)

	if *orgID == 0 {
		set.Usage()
		return
	}

	request := &account.GetSystemUserRequest{
		OrgId: *orgID,
	}

	OutputStep("GetSystemUser(orgID=%d)", *orgID)
	response, err := client.GetSystemUser(ctx, request)
	OutputResponse(response, err)
}

func MainGetOrCreateSystemUser(ctx context.Context, client Client, args []string) {
	set := flag.NewFlagSet("GetOrCreateSystemUser", flag.ExitOnError)
	orgID := set.Uint64("orgID", 0, "org ID")
	_ = set.Parse(args)

	if *orgID == 0 {
		set.Usage()
		return
	}

	request := &account.GetOrCreateSystemUserRequest{
		OrgId: *orgID,
	}

	OutputStep("GetOrCreateSystemUser(orgID=%d)", *orgID)
	response, err := client.GetOrCreateSystemUser(ctx, request)
	OutputResponse(response, err)
}
