package region

import (
	globalcommonv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/common/v1"
)

func regionWhiteListForLegacyProjection(region *globalcommonv1.Region) *globalcommonv1.RegionWhiteList {
	if region == nil {
		return nil
	}
	regionWhiteLists := region.GetRegionWhiteLists()
	if len(regionWhiteLists) == 0 {
		return nil
	}
	if region.GetServicePlan() != globalcommonv1.ServicePlan_SERVICE_PLAN_UNSPECIFIED {
		for _, wl := range regionWhiteLists {
			if wl.GetServicePlan() == region.GetServicePlan() {
				return wl
			}
		}
	}
	if len(regionWhiteLists) == 1 {
		return regionWhiteLists[0]
	}
	return regionWhiteLists[0]
}

func fillLegacyFieldsFromRegionWhiteList(region *globalcommonv1.Region, wl *globalcommonv1.RegionWhiteList) {
	if region == nil || wl == nil {
		return
	}
	region.ServicePlan = wl.GetServicePlan()
	region.IsPublic = wl.GetIsPublic()
	region.OpenedTenantIds = append([]uint64(nil), wl.GetOpenedTenantIds()...)
}

func ensureRegionWhiteListsFromLegacy(region *globalcommonv1.Region) {
	if region == nil || len(region.GetRegionWhiteLists()) > 0 {
		return
	}
	if region.GetServicePlan() == globalcommonv1.ServicePlan_SERVICE_PLAN_UNSPECIFIED {
		return
	}
	region.RegionWhiteLists = []*globalcommonv1.RegionWhiteList{
		{
			ServicePlan:     region.GetServicePlan(),
			IsPublic:        region.GetIsPublic(),
			OpenedTenantIds: append([]uint64(nil), region.GetOpenedTenantIds()...),
		},
	}
}

func backfillLegacyFieldsFromSingleRegionWhiteList(region *globalcommonv1.Region) {
	if region == nil || len(region.GetRegionWhiteLists()) != 1 {
		return
	}
	fillLegacyFieldsFromRegionWhiteList(region, region.GetRegionWhiteLists()[0])
}

func normalizeRegionForNextgenRequest(region *globalcommonv1.Region) {
	ensureRegionWhiteListsFromLegacy(region)
}

func normalizeRegionForLegacyServiceRequest(region *globalcommonv1.Region) {
	wl := regionWhiteListForLegacyProjection(region)
	if wl != nil {
		fillLegacyFieldsFromRegionWhiteList(region, wl)
	}
}

func normalizeRegionForResponse(region *globalcommonv1.Region) {
	ensureRegionWhiteListsFromLegacy(region)
	backfillLegacyFieldsFromSingleRegionWhiteList(region)
}
