package gardener

import (
	"github.com/pingcap/errors"

	"k8s.io/utils/pointer"

	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
	"github.com/tidbcloud/infra-api/pkg/consts"
	gardencorev1beta1 "github.com/tidbcloud/infra-api/pkg/gardener/core/apis/v1beta1"
)

const (
	// TODO: use more appropriate configuration.
	defaultAWSVolumeType = "gp2"
	defaultGCPVolumeType = "pd-standard"
	defaultVolumeSize    = "50Gi"
	strTrue              = "true"
)

func buildMasterGroup(providerType string, zones []string, labels map[string]string, config *cloudv1.Gardener) (*gardencorev1beta1.Worker, error) {
	switch providerType {
	case consts.ProviderTypeGCP:
		return buildGCPMasterGroup(zones, labels, config), nil
	case consts.ProviderTypeAWS:
		return buildAWSMasterGroup(zones, labels, config), nil
	default:
		return nil, errors.Errorf("unsupported provider %s", providerType)
	}
}

func buildGCPMasterGroup(zones []string, labels map[string]string, gardenCfg *cloudv1.Gardener) *gardencorev1beta1.Worker {
	masterCount := gardenCfg.GcpMasterCount
	// resourceTags := cloudv1.TagsFromLabels(labels)
	return &gardencorev1beta1.Worker{
		Name: MasterWorkerGroup,
		Machine: gardencorev1beta1.Machine{
			Type: gardenCfg.GcpMasterType,
			Image: &gardencorev1beta1.ShootMachineImage{
				Name: gardenCfg.NodeImage,
			},
		},
		Volume: &gardencorev1beta1.Volume{
			Type:       pointer.StringPtr(defaultGCPVolumeType),
			VolumeSize: defaultVolumeSize,
		},
		// HACK: currently master group is not billed, so skip the resource tags
		// TODO: the tags can be added after billing system can distinguish different components
		// Labels:  resourceTags,
		Maximum: masterCount,
		Minimum: masterCount,
		Zones:   zones,
	}
}

func buildAWSMasterGroup(zones []string, labels map[string]string, gardenCfg *cloudv1.Gardener) *gardencorev1beta1.Worker {
	masterCount := gardenCfg.AwsMasterCount
	// resourceTags := cloudv1.TagsFromLabels(labels)
	return &gardencorev1beta1.Worker{
		Name: "master",
		Machine: gardencorev1beta1.Machine{
			Type: gardenCfg.AwsMasterType,
			Image: &gardencorev1beta1.ShootMachineImage{
				Name: gardenCfg.NodeImage,
			},
		},
		Volume: &gardencorev1beta1.Volume{
			Type:       pointer.StringPtr(defaultAWSVolumeType),
			VolumeSize: defaultVolumeSize,
		},

		// HACK: currently master group is not billed, so skip the resource tags
		// TODO: the tags can be added after billing system can distinguish different components
		// Labels:  resourceTags,
		Maximum: masterCount,
		Minimum: masterCount,
		Zones:   zones,
	}
}
