package tidbxregion

import (
	"context"

	"github.com/samber/lo"

	bffv1beta2 "github.com/tidbcloud/tidb-management-service/api/spec/bff/cluster_management/v1beta2"
	openapicommonv1beta1 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_cloud_open_api/common/v1beta1"
)

func (s *RegionServer) ListCloudProviders(
	ctx context.Context,
	request *bffv1beta2.ListCloudProvidersRequest,
) (*bffv1beta2.ListCloudProvidersResponse, error) {
	regions, err := s.ListRegions(ctx, &bffv1beta2.ListRegionsRequest{
		ServicePlans:   request.ServicePlans,
		CloudProviders: request.CloudProviders,
		ViewMode:       bffv1beta2.ListRegionsRequest_FLAT,
	})

	if err != nil {
		return nil, err
	}

	cloudProviderSet := make(map[openapicommonv1beta1.ServicePlan][]openapicommonv1beta1.Region_CloudProvider)
	for _, region := range regions.GetFlatView().Regions {
		for _, servicePlan := range region.GetServicePlans() {
			if _, ok := cloudProviderSet[servicePlan]; !ok {
				cloudProviderSet[servicePlan] = []openapicommonv1beta1.Region_CloudProvider{}
			}
			cloudProviderSet[servicePlan] = append(
				cloudProviderSet[servicePlan],
				region.CloudProvider,
			)
		}
	}
	resp := &bffv1beta2.ListCloudProvidersResponse{
		CloudProviders: make([]*bffv1beta2.ListCloudProvidersResponse_GroupedCloudProvider, 0),
	}

	for k, v := range cloudProviderSet {
		resp.CloudProviders = append(resp.CloudProviders, &bffv1beta2.ListCloudProvidersResponse_GroupedCloudProvider{
			ServicePlan:    k,
			CloudProviders: lo.Uniq(v),
		})
	}

	return resp, nil
}
