package cluster

import (
	"github.com/samber/lo"

	bffclusterv1beta1 "github.com/tidbcloud/tidb-management-service/api/spec/bff/cluster_management/v1beta1"
	openapidedicatedv1beta1 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_cloud_open_api/dedicated/v1beta1"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/app/bff/orchestrator"
)

func advancedRequestTransform(
	request *bffclusterv1beta1.AdvancedModifyDedicatedClusterRequest,
) []*orchestrator.OpenAPIRequest {
	if request.Cluster == nil {
		return nil
	}

	var out []*orchestrator.OpenAPIRequest

	// Handle Delete group Requests
	for _, id := range request.GetCluster().GetTidbNodeSetting().GetDeleteTidbNodeGroupIds() {
		out = append(out, &orchestrator.OpenAPIRequest{
			Message: &openapidedicatedv1beta1.DeleteTidbNodeGroupRequest{
				ClusterId:       request.Cluster.ClusterId,
				TidbNodeGroupId: id,
			},
			ActionName: OpenAPIDeleteTiDBGroupAction,
		})
	}

	// Handle Update group Requests
	for _, group := range request.GetCluster().GetTidbNodeSetting().GetUpdateTidbNodeGroups() {
		out = append(out, &orchestrator.OpenAPIRequest{
			Message: &openapidedicatedv1beta1.UpdateTidbNodeGroupRequest{
				TidbNodeGroup: &openapidedicatedv1beta1.UpdateTidbNodeGroupRequest_TidbNodeGroup{
					ClusterId:       request.Cluster.ClusterId,
					TidbNodeGroupId: group.TidbNodeGroupId,
					NodeCount:       lo.ToPtr(group.NodeCount),
					TiproxySetting:  group.GetTiproxySetting(),
				},
			},
			ActionName: OpenAPIUpdateTiDBGroupAction,
		})
	}

	// Handle Create group Requests
	for _, group := range request.GetCluster().GetTidbNodeSetting().GetCreateTidbNodeGroups() {
		out = append(out, &orchestrator.OpenAPIRequest{
			Message: &openapidedicatedv1beta1.CreateTidbNodeGroupRequest{
				TidbNodeGroup: &openapidedicatedv1beta1.TidbNodeGroup{
					ClusterId:      request.Cluster.ClusterId,
					DisplayName:    group.DisplayName,
					NodeCount:      group.NodeCount,
					TiproxySetting: group.GetTiproxySetting(),
				},
			},
			ActionName: OpenAPICreateTiDBGroupAction,
		})
	}

	// Handle Scale Requests
	scaleRequest := &openapidedicatedv1beta1.UpdateClusterRequest{
		Cluster: &openapidedicatedv1beta1.UpdateClusterRequest_Cluster{
			ClusterId:          request.Cluster.ClusterId,
			DisplayName:        request.Cluster.DisplayName,
			TikvNodeSetting:    request.Cluster.TikvNodeSetting,
			TiflashNodeSetting: request.Cluster.TiflashNodeSetting,
		},
	}

	if request.Cluster.GetTidbNodeSetting().GetNodeSpecKey() != "" {
		scaleRequest.Cluster.TidbNodeSetting = &openapidedicatedv1beta1.UpdateClusterRequest_TidbNodeSetting{
			NodeSpecKey: request.Cluster.GetTidbNodeSetting().GetNodeSpecKey(),
		}
	}

	if scaleRequest.Cluster.TidbNodeSetting != nil || scaleRequest.Cluster.TikvNodeSetting != nil ||
		scaleRequest.Cluster.TiflashNodeSetting != nil {
		out = append(out, &orchestrator.OpenAPIRequest{
			Message:    scaleRequest,
			ActionName: OpenAPIScaleAction,
		})
	}

	return out
}
