package facade

import (
	"context"

	"github.com/tidbcloud/chaos-svc/pkg/domain/entity"
	cloudv1alpha1 "github.com/tidbcloud/eks-provider/api/v1alpha1"
	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
	"github.com/tidbcloud/pkgv2/bizerr"
)

const (
	LabelKeyRegion       = "cloud.pingcap.com/region"
	LabelKeyProviderType = "cloud.pingcap.com/provider-type"
)

type TiDBCluster struct {
	ProjectID    uint64
	ClusterID    uint64
	NetworkName  string
	Region       string
	ProviderType string
	Namespace    string
}

type TiDBClusterFilter struct {
	Region string
}

type Infra interface {
	Namespace(projectID uint64) string

	ChaosServerName(projectID uint64, networkName string) string
	GetChaosServer(ctx context.Context, projectID uint64, networkName string) (*cloudv1alpha1.ChaosServer, bizerr.BizError)
	CreateChaosServerIgnoreExist(ctx context.Context, server *cloudv1alpha1.ChaosServer) bizerr.BizError
	DeleteChaosServerIgnoreNotFound(ctx context.Context, projectID uint64, networkName string) bizerr.BizError

	WorkflowName(workflowID uint64) string
	GetWorkflow(ctx context.Context, projectID uint64, workflowID uint64) (*cloudv1alpha1.ChaosWorkflow, bizerr.BizError)
	CreateWorkflowIgnoreExist(ctx context.Context, workflow *entity.Workflow) bizerr.BizError
	DeleteWorkflowIgnoreNotFound(ctx context.Context, projectID uint64, workflowID uint64) bizerr.BizError
	ListWorkflowNodes(ctx context.Context, projectID uint64, workflowID uint64) ([]cloudv1alpha1.ChaosWorkflowNode, bizerr.BizError)

	GetTiDBCluster(ctx context.Context, projectID uint64, clusterID uint64) (*TiDBCluster, bizerr.BizError)
	GetTiDBClusterCloudObj(ctx context.Context, projectID uint64, clusterID uint64) (*cloudv1.Cluster, bizerr.BizError)
	ListTiDBClusters(ctx context.Context, projectID uint64, filter *TiDBClusterFilter) ([]*TiDBCluster, bizerr.BizError)
}
