package cluster

import (
	"github.com/pingcap/errors"
	"github.com/tidbcloud/aws-shared-provider/pkg/utils/etcdlease"
	infra "github.com/tidbcloud/tidb-management-service/api/serverless_infra"
)

func (r *reconcileContext) ensureResourceGroup() error {
	leaseID, err := etcdlease.GetLease30d(r.ctx, r.EtcdLease)
	if err != nil {
		return errors.Annotate(err, "failed to get etcd lease 30d")
	}

	return errors.Annotate(r.ensureStatus(func(status *infra.ClusterStatus) error {
		for rgName, rgSpec := range r.specResourceGroups {
			if _, ok := status.ResourceGroups[rgName]; ok {
				continue
			}
			// create etcd token for new resource group
			pool := rgSpec.Pool
			if pool == "" {
				pool = r.specTidbPool
			}
			etcdTokenPrefix := r.EtcdTokenPrefixMap[pool]
			if etcdTokenPrefix == "" {
				return errors.Errorf("etcdTokenPrefix not found in pool %s", pool)
			}
			if err := r.resetToken(etcdTokenPrefix, r.keyspaceToken+"/"+rgName, rgSpec.Replicas, leaseID); err != nil {
				return err
			}
			status.ResourceGroups[rgName] = infra.ResourceGroup{Pool: pool, Replicas: rgSpec.Replicas}
		}

		if len(status.ResourceGroups) > len(r.specResourceGroups) {
			for rgName, rgStatus := range status.ResourceGroups {
				if _, ok := r.specResourceGroups[rgName]; !ok {
					if err := r.setTidbPoolReplicas(rgStatus.Pool, rgName, 0); err != nil {
						return err
					}
					delete(status.ResourceGroups, rgName)
				}
			}
		}
		return nil
	}), "failed to ensureStatus in ensureResourceGroup")
}
