package gkeheterogeneous

import (
	"context"

	regionaldedicatedv1 "github.com/tidbcloud/infra-provider/api/tidbcloud/regional-server/v1"

	"github.com/tidbcloud/tidb-management-service/dedicated-global-service/domain/adapter/regionserver"
	"github.com/tidbcloud/tidb-management-service/dedicated-global-service/domain/entity"
	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
)

func SupportedRegionalHeterogeneousClusterLevelComponentTypes() []regionaldedicatedv1.ComponentType {
	return []regionaldedicatedv1.ComponentType{
		regionaldedicatedv1.ComponentType_TIKV,
	}
}

func SupportedRegionalHeterogeneousGroupLevelComponentTypes() []regionaldedicatedv1.ComponentType {
	return []regionaldedicatedv1.ComponentType{
		regionaldedicatedv1.ComponentType_TIDB,
	}
}

func CleanupGatekeeperAssign(
	ctx context.Context,
	cli regionserver.Client,
	regionEn *entity.Region,
	clusterID string,
	componentType regionaldedicatedv1.ComponentType,
	tidbGroupID string,
) bizerr.BizError {
	assign, berr := cli.GetGKEHeterogeneousGatekeeperAssign(
		ctx,
		regionEn,
		&regionaldedicatedv1.GetGKEHeterogeneousGatekeeperAssignRequest{
			ClusterId:     clusterID,
			ComponentType: componentType,
			TidbGroupId:   tidbGroupID,
		},
	)
	if berr != nil {
		if berr.ErrCode() == bizerr.ErrCodeRecordNotFound {
			return nil
		}
		return berr
	}
	if assign == nil || assign.GetName() == "" {
		return nil
	}
	berr = cli.DeleteGKEHeterogeneousGatekeeperAssign(
		ctx,
		regionEn,
		&regionaldedicatedv1.DeleteGKEHeterogeneousGatekeeperAssignRequest{
			ClusterId: clusterID,
			Name:      assign.GetName(),
		},
	)
	if berr != nil && berr.ErrCode() != bizerr.ErrCodeRecordNotFound {
		return berr
	}
	return nil
}

func CleanupDeployIntent(
	ctx context.Context,
	cli regionserver.Client,
	regionEn *entity.Region,
	clusterID string,
	componentType regionaldedicatedv1.ComponentType,
	tidbGroupID string,
) bizerr.BizError {
	berr := cli.DeleteGKEHeterogeneousDeploy(
		ctx,
		regionEn,
		&regionaldedicatedv1.DeleteGKEHeterogeneousDeployRequest{
			ClusterId:     clusterID,
			ComponentType: componentType,
			TidbGroupId:   tidbGroupID,
		},
	)
	if berr != nil && berr.ErrCode() != bizerr.ErrCodeRecordNotFound {
		return berr
	}
	return nil
}
