package cli

import (
	"context"
	"flag"
	"strconv"

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

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

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

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

		request := &account.GetOrgByIDRequest{
			Id: id,
		}
		response, err := client.GetOrgByID(ctx, request)
		OutputResponse(response, err)
	}
}

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

	request := &account.OrgFilter{
		Ids:    *idList,
		Status: *statusList,
	}
	OutputStep("ListOrgs(id=%+v, status=%+v)", idList, statusList)
	response, err := client.ListOrgs(ctx, request)
	OutputResponse(response, err)
}

func MainListOrgsByUser(ctx context.Context, client Client, args []string) {
	set := flag.NewFlagSet("ListOrgsByUser", flag.ExitOnError)
	userID := set.Uint64("userID", 0, "user ID")
	_ = set.Parse(args)

	request := &account.ListOrgsByUserRequest{
		UserId: *userID,
	}

	OutputStep("ListOrgsByUser(userID=%+v)", *userID)
	response, err := client.ListOrgsByUser(ctx, request)
	OutputResponse(response, err)
}

func MainListTrials(ctx context.Context, client Client, args []string) {
	set := flag.NewFlagSet("ListTrials", flag.ExitOnError)
	orgID := set.Uint64("orgID", 0, "org ID")
	trialType := set.String("trialType", "", "trial type")
	_ = set.Parse(args)

	request := &account.TrialFilter{
		OrgId:     *orgID,
		TrialType: *trialType,
	}

	OutputStep("ListTrials(orgID=%+v, trialType=%+v)", *orgID, *trialType)
	response, err := client.ListTrials(ctx, request)
	OutputResponse(response, err)
}

func MainCreateTrail(ctx context.Context, client Client, args []string) {
	var createdAt, startedAt, estimatedEndedAt, endedAt Time
	set := flag.NewFlagSet("CreateTrail", flag.ExitOnError)
	id := set.Uint64("id", 0, "id")
	set.Var(&createdAt, "created_at", "craeted_at")
	createdByID := set.Uint64("created_by_id", 0, "created_by_id")
	orgID := set.Uint64("orgID", 0, "orgID")
	set.Var(&startedAt, "started_at", "started_at")
	set.Var(&estimatedEndedAt, "estimated_ended_at", "estimated_ended_at")
	set.Var(&endedAt, "ended_at", "ended_at")
	trialType := set.String("trialType", "", "trialType")
	_ = set.Parse(args)

	request := &account.CreateTrialRequest{
		Trial: &account.Trial{
			Id:               *id,
			CreatedAt:        createdAt.ToProto(),
			CreatedById:      *createdByID,
			OrgId:            *orgID,
			StartedAt:        startedAt.ToProto(),
			EstimatedEndedAt: estimatedEndedAt.ToProto(),
			EndedAt:          endedAt.ToProto(),
			TrialType:        *trialType,
		},
	}

	OutputStep("CreateTrail(id=%+v, created_at=%+v, created_by_id=%+v, orgID=%+v, started_at=%+v, estimated_ended_at=%+v, ended_at=%+v, trialType=%+v)",
		*id, createdAt, *createdByID, *orgID, startedAt, estimatedEndedAt, endedAt, *trialType)
	response, err := client.CreateTrial(ctx, request)
	OutputResponse(response, err)
}
