package cluster

import (
	"fmt"

	cloudv1 "github.com/tidbcloud/infra-api/api/v1"

	"github.com/pingcap/tidb-operator/pkg/apis/pingcap/v1alpha1"
	corev1 "k8s.io/api/core/v1"
)

func (r *reconcileContext) scaleStorage(tc *v1alpha1.TidbCluster) error {
	components := r.Target.GetComponents()
	for _, comp := range components {
		if comp.GetUseLocalStorage() {
			continue
		}

		desiredQuantityPtr, use := comp.GetStorageSize()
		if !use {
			continue
		}
		desiredQuantity := *desiredQuantityPtr

		var request corev1.ResourceList
		switch comp.GetComponentType() {
		case cloudv1.ComponentPD:
			if tc.Spec.PD != nil {
				request = tc.Spec.PD.ResourceRequirements.Requests
			}
		case cloudv1.ComponentTiKV:
			if tc.Spec.TiKV != nil {
				request = tc.Spec.TiKV.ResourceRequirements.Requests
			}
		case cloudv1.ComponentTiFlash:
			if tc.Spec.TiFlash != nil {
				request = tc.Spec.TiFlash.StorageClaims[0].Resources.Requests
			}
		}
		actualQuantity, exist := request[corev1.ResourceStorage]
		if !exist {
			return fmt.Errorf("component %s has no storage size in tc", comp.GetComponentType())
		}

		cmpVal := desiredQuantity.Cmp(actualQuantity)
		if cmpVal > 0 { // scale up
			request[corev1.ResourceStorage] = desiredQuantity
		} else if cmpVal < 0 { // scale down
			return fmt.Errorf("component %s not support to scale down storage size now", comp.GetComponentType())
		} else {
			r.Log.V(4).Info("storage size is already desired", "component", comp.GetComponentType(), "desired", desiredQuantity.String(), "actual", actualQuantity.String())
		}
	}

	return nil
}
