package cli

import (
	"context"
	"flag"
	"strconv"

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

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

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

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

		request := &account.GetProjectByIDRequest{
			Id: id,
		}

		response, err := client.GetProjectByID(ctx, request)
		OutputResponse(response, err)
	}
}

func MainListProjects(ctx context.Context, client Client, args []string) {
	orgIDList := &IDList{}
	status := &StringList{}
	idList := &IDList{}
	set := flag.NewFlagSet("ListProjects", flag.ExitOnError)
	set.Var(orgIDList, "orgID", "org ID")
	set.Var(status, "status", "project status")
	set.Var(idList, "id", "project ID")
	_ = set.Parse(args)

	request := &account.ProjectFilter{
		OrgIds: *orgIDList,
		Status: *status,
		Ids:    *idList,
	}
	OutputStep("ListProjects(orgID=%v, status=%v, id=%v)", request.OrgIds, request.Status, request.Ids)
	response, err := client.ListProjects(ctx, request)
	OutputResponse(response, err)
}

func MainListProjectsByOrgs(ctx context.Context, client Client, args []string) {
	set := flag.NewFlagSet("ListProjectsByOrgs", flag.ExitOnError)
	_ = set.Parse(args)

	orgIDList := make([]uint64, 0)
	for _, ids := range set.Args() {
		id, err := strconv.ParseUint(ids, 10, 64)
		OutputError(err)
		if err != nil {
			return
		}

		orgIDList = append(orgIDList, id)
	}

	request := &account.ListProjectsByOrgsRequest{
		OrgIds: orgIDList,
	}

	OutputStep("ListProjectsByOrgs(orgID=%v)", orgIDList)
	response, err := client.ListProjectsByOrgs(ctx, request)
	OutputResponse(response, err)
}

func MainListProjectsByOrgsInUser(ctx context.Context, client Client, args []string) {
	orgIDList := &IDList{}
	set := flag.NewFlagSet("ListProjectsByOrgsInUser", flag.ExitOnError)
	set.Var(orgIDList, "orgID", "org ID")
	userID := set.Uint64("userID", 0, "user ID")
	_ = set.Parse(args)

	request := &account.ListProjectsByOrgsInUserRequest{
		UserId: *userID,
		OrgIds: *orgIDList,
	}
	OutputStep("ListProjectsByOrgsInUser(userID=%v, orgID=%v)", request.UserId, request.OrgIds)
	response, err := client.ListProjectsByOrgsInUser(ctx, request)
	OutputResponse(response, err)
}
