package grpcli

import (
	"context"
	"fmt"

	"github.com/tidbcloud/pkgv2/bizerr"
	v1beta1 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_cloud_open_api/common/v1beta1"
	mgmt "github.com/tidbcloud/tidb-management-service/api/spec/tidb_mgmt_service/v1"
	tigrpc "github.com/tidbcloud/tiinf/transport/tigrpc/client"
)

var MgntDeletedClusterStatus = []v1beta1.ClusterState{
	v1beta1.ClusterState_DELETED, v1beta1.ClusterState_DELETING,
}

type MgmtSvcGrpcClient interface {
	GetClusterByID(ctx context.Context, clusterID uint64) (*mgmt.Cluster, bizerr.BizError)
}

type mgmtSvcGrpcClient struct {
	addr   string
	client mgmt.ClusterServiceClient
}

func NewMgmtSvcGrpcClient(ctx context.Context, addr string) MgmtSvcGrpcClient {
	conn, err := tigrpc.NewClientConn(addr, tigrpc.WithDefault())
	if err != nil {
		fmt.Println("error when initialize mgmt service client", err)
		panic(err)

	}
	// logger.Info("Initializing mgmt service client", zap.Any("err", err), zap.String("addr", addr))
	// if err != nil {
	// 	logger.Fatal("initialize client failed", zap.String("addr", addr), zap.Error(err))
	// }
	return &mgmtSvcGrpcClient{
		addr:   addr,
		client: mgmt.NewClusterServiceClient(conn),
	}
}

func (m *mgmtSvcGrpcClient) GetClusterByID(ctx context.Context, clusterID uint64) (*mgmt.Cluster, bizerr.BizError) {
	req := &mgmt.ListClustersRequest{
		Filter: &mgmt.ClusterFilter{
			ClusterIds:    []uint64{clusterID},
			ExcludeStates: MgntDeletedClusterStatus,
			View:          mgmt.ClusterFilter_CLUSTER_VIEW_LOCAL,
		},
	}
	listResp, err := m.client.ListClusters(ctx, req)
	if err != nil {
		return nil, bizerr.WrapError(err, "GetServerlessClusterFullView failed")
	}
	if len(listResp.Clusters) == 0 {
		return nil, bizerr.New(bizerr.ErrCodeRecordNotFound, "cluster %d is not found", clusterID)
	}
	return listResp.Clusters[0], nil
}
