// Package service add by blacknc <blacknc@163.com> at 2023/04/20 15:49:02
package service

import (
	"context"
	"dataapps/commons/grpc"
	dto "dataapps/internal/dto/sqleditor"
	"strings"

	"github.com/tidbcloud/core-svc/idl/pbgen/proto/core"
	"github.com/tidbcloud/tiinf/monitor/tilog"
	"go.uber.org/zap"

	"github.com/tidbcloud/dataservices/idl/pbgen/proto/dataapi"
)

func GetClusterStatus(ctx context.Context, clusterIDs []uint64) ([]dto.ClusterStatus, error) {
	res, err := grpc.GetClusterStatus(ctx, &dataapi.GetClusterStatusReq{
		ClusterIds: clusterIDs,
	})
	if err != nil {
		return nil, err
	}
	result := make([]dto.ClusterStatus, 0, len(res.Status))
	for _, clusterStatus := range res.Status {
		result = append(result, dto.ClusterStatus{
			ClusterID:   clusterStatus.ClusterId,
			LinkStatus:  int(clusterStatus.Status),
			IsDedicated: clusterStatus.IsDedicated,
		})
	}
	return result, nil
}

func ServerlessPermission2Entry(ctx context.Context, clusterIds []uint64) ([]dto.ClusterSupport, error) {
	res, err := grpc.GetClusterByIds(ctx, clusterIds)
	if res == nil || err != nil {
		tilog.Error(ctx, "List clusters failed!", zap.Any("clusterId", clusterIds))
		return nil, err
	}
	cols := make([]dto.ClusterSupport, 0, len(clusterIds))
	for clusterId, clusterInfo := range res {
		item := dto.ClusterSupport{
			ClusterID: clusterId,
			IsSupport: false,
		}
		for _, f := range clusterInfo.Features {
			if f == core.AvailableFeature_DELEGATE_USER {
				item.IsSupport = true
				break
			}
		}
		cols = append(cols, item)
	}

	return cols, nil
}

func IsDedicatedCluster(clusterInfo *core.Cluster) bool {
	return clusterInfo.GetDeployType() == core.DeployType_DEPLOY_TYPE_DEDICATED
}

func IsAWSDedicatedCluster(clusterInfo *core.Cluster) bool {
	return IsDedicatedCluster(clusterInfo) && clusterInfo.GetCloudProviderName() == "aws"
}

func SampleDataInitialize(ctx context.Context, projectId, clusterId uint64, createdBy, auth0Token string) (string, error) {
	res := "Import fortune500 success!"
	_, err := grpc.ExecSqlWithSession(ctx, &dataapi.BasicEndpointReq{
		ProjectId: projectId,
		ClusterId: clusterId,
		Sql:       "create database fortune500;use fortune500;" + Fortune500DDL + Fortune500Data,
		SessionId: "",
		LimitRows: LIMIT,
		Credential: &dataapi.Credential{
			Type: dataapi.CrtType_AUTH0,
			Key:  auth0Token,
		},
	})
	if err != nil {
		if strings.Contains(err.Error(), "database exists") {
			res = "DB fortune500 exist! No need to import!"
			return res, nil
		}
		res = "Import fortune500 failed!"
		return res, err
	}
	return res, nil

}
