package actions

import (
	"context"
	"fmt"
	"strconv"

	opent "github.com/tidbcloud/devops/entity/operation"
	"github.com/tidbcloud/devops/pkg/infra/clients/coresvccli"
	"github.com/tidbcloud/devops/pkg/infra/consts"

	mgmtv1 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_mgmt_service/v1"
)

func InstanceDetailLink(insID uint64) string {
	return fmt.Sprintf("https://%s/operations/%d", consts.ConsoleAddr(), insID)
}

func GetTenantID(instance *opent.Instance) (uint64, error) {
	tidstr, _ := instance.GetParam(opent.ParamTenantID)
	if tidstr == "" {
		return 0, fmt.Errorf("tenant_id is required")
	}

	return strconv.ParseUint(tidstr, 10, 64)
}

func GetClusterID(instance *opent.Instance) (uint64, error) {
	cidstr, _ := instance.GetParam(opent.ParamClusterID)
	if cidstr == "" {
		return 0, fmt.Errorf("cluster_id is required")
	}

	return strconv.ParseUint(cidstr, 10, 64)
}

func GetClusterIDStr(instance *opent.Instance) (string, error) {
	cid, _ := instance.GetParam(opent.ParamClusterID)
	if cid == "" {
		return "", fmt.Errorf("cluster_id is required")
	}

	return cid, nil
}

func GetResourcePoolID(instance *opent.Instance) (string, error) {
	spid, _ := instance.GetParam(opent.ParamResourcePoolID)
	if spid == "" {
		return "", fmt.Errorf("resource_pool_id is required")
	}

	return spid, nil
}

func GetTenantIDStr(instance *opent.Instance) (string, error) {
	tid, _ := instance.GetParam(opent.ParamTenantID)
	if tid == "" {
		return "", fmt.Errorf("tenant_id is required")
	}
	return tid, nil
}

func GetProjectID(instance *opent.Instance) (uint64, error) {
	uidstr, _ := instance.GetParam(opent.ParamProjectID)
	if uidstr == "" {
		return 0, fmt.Errorf("project_id is required")
	}

	return strconv.ParseUint(uidstr, 10, 64)
}

func GetProjectIDStr(instance *opent.Instance) (string, error) {
	uidstr, _ := instance.GetParam(opent.ParamProjectID)
	if uidstr == "" {
		return "", fmt.Errorf("project_id is required")
	}

	return uidstr, nil
}

func GetUserID(instance *opent.Instance) (uint64, error) {
	uidstr, _ := instance.GetParam(opent.ParamUserID)
	if uidstr == "" {
		return 0, fmt.Errorf("user_id is required")
	}

	return strconv.ParseUint(uidstr, 10, 64)
}

func GetUserIDStr(instance *opent.Instance) (string, error) {
	uidstr, _ := instance.GetParam(opent.ParamUserID)
	if uidstr == "" {
		return "", fmt.Errorf("user_id is required")
	}

	return uidstr, nil
}

func GetUserEmail(instance *opent.Instance) (string, error) {
	email, _ := instance.GetParam(opent.ParamUserEmail)
	if email == "" {
		return "", fmt.Errorf("email is required")
	}

	return email, nil
}

func CheckClusterExistence(ctx context.Context, cli *coresvccli.CoreSvcCli, instance *opent.Instance) (*mgmtv1.Cluster, error) {
	cid, err := GetClusterID(instance)
	if err != nil {
		return nil, err
	}

	return cli.Mgmt.GetCluster(ctx, cid)
}
