package util

import (
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
	"github.com/tidbcloud/infra-provider/pkg/consts"
)

const (
	defaultLoadBalancerID = "000"
)

func BuildTestClusterCR(clusterId, ns string, apply func(*cloudv1.Cluster)) *cloudv1.Cluster {
	cr := &cloudv1.Cluster{
		ObjectMeta: metav1.ObjectMeta{
			Name:      clusterId,
			Namespace: ns,
			Labels: map[string]string{
				cloudv1.ClusterTagKey: clusterId,
			},
			Annotations: map[string]string{
				consts.DefaultLoadBalancerIDAnnotationKey: defaultLoadBalancerID,
			},
		},
		Status: cloudv1.ClusterStatus{
			Phase: cloudv1.ClusterPhaseRunning,
			DB:    &cloudv1.DBStatus{},
		},
	}

	if apply != nil {
		apply(cr)
	}

	// To make `cluster.Synced()` return `true`
	if cr.Spec.Cluster.TiDB.Replicas != 0 {
		members := make([]cloudv1.TiDBMember, cr.Spec.Cluster.TiDB.Replicas)
		if cr.Spec.Cluster.TiDB.InstanceType != "" {
			for i := range members {
				members[i].InstanceType = cr.Spec.Cluster.TiDB.InstanceType
			}
		}
		cr.Status.DB.TiDB = &cloudv1.TiDBStatus{
			Status:  cloudv1.ComponentNormal,
			Members: members,
		}
	}

	if cr.Spec.Cluster.TiKV.Replicas != 0 {
		members := make([]cloudv1.StoreMember, cr.Spec.Cluster.TiKV.Replicas)
		if cr.Spec.Cluster.TiKV.InstanceType != "" {
			for i := range members {
				members[i].InstanceType = cr.Spec.Cluster.TiKV.InstanceType
			}
		}
		cr.Status.DB.TiKV = &cloudv1.TiKVStatus{
			Status:  cloudv1.ComponentNormal,
			Members: members,
		}
	}

	// Make all extra groups synced
	cr.Status.ExtraEndpoints = make([]cloudv1.ExtraGroupStatus, 0, len(cr.Spec.ExtraGroups))
	for _, extraGroup := range cr.GetExtraGroups() {
		if extraGroup.Spec.TiDB.Replicas != 0 {
			members := make([]cloudv1.TiDBMember, extraGroup.Spec.TiDB.Replicas)
			if extraGroup.Spec.TiDB.InstanceType != "" {
				for i := range members {
					members[i].InstanceType = extraGroup.Spec.TiDB.InstanceType
				}
			}
			extraGroup.Status.TiDB = &cloudv1.TiDBStatus{
				Status:  cloudv1.ComponentNormal,
				Members: members,
			}
			cr.Status.ExtraEndpoints = append(cr.Status.ExtraEndpoints, *extraGroup.Status)
		}
	}

	return cr
}
