package status

import (
	"fmt"
	"strings"

	opv2 "github.com/pingcap/tidb-operator/api/v2/core/v1alpha1"
	"k8s.io/apimachinery/pkg/api/meta"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

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

func computeComponentConditions(conditions []metav1.Condition, groupConditions []metav1.Condition, nodeCount int, needSuspend bool) []metav1.Condition {
	// not suspend
	if !needSuspend {
		meta.RemoveStatusCondition(&conditions, cloudv1.ComponentSuspended)
		return conditions
	}

	var suspendedCond *metav1.Condition
	podSuspended := meta.IsStatusConditionTrue(groupConditions, opv2.CondSuspended)
	if podSuspended && nodeCount == 0 {
		suspendedCond = &metav1.Condition{
			Type:    cloudv1.ComponentSuspended,
			Status:  metav1.ConditionTrue,
			Reason:  "ResourcesSuspended",
			Message: "All Pods and nodes are suspended",
		}
	} else {
		var msg []string
		if !podSuspended {
			msg = append(msg, "Pods not suspended")
		}
		if nodeCount != 0 {
			msg = append(msg, fmt.Sprintf("%d Nodes not suspended", nodeCount))
		}
		suspendedCond = &metav1.Condition{
			Type:    cloudv1.ComponentSuspended,
			Status:  metav1.ConditionFalse,
			Reason:  "ResourcesNotSuspended",
			Message: strings.Join(msg, ";"),
		}
	}

	meta.SetStatusCondition(&conditions, *suspendedCond)
	return conditions
}

func computeMemberStatus(conds []metav1.Condition, isDeleting bool) cloudv1.MemberStatus {
	if isDeleting {
		return cloudv1.MemberStatusTerminating
	}

	cond := meta.FindStatusCondition(conds, opv2.CondReady)
	if cond == nil {
		// not reconciled
		return cloudv1.MemberStatusUnavailable
	}
	if cond.Status == metav1.ConditionTrue {
		return cloudv1.MemberStatusNormal
	}
	switch cond.Reason {
	// TODO(liubo02): support reason to indicate whether pod is deleting or deleted
	case "PodIsTerminating":
		return cloudv1.MemberStatusTerminating
	default:
		return cloudv1.MemberStatusCreating
	}
}

// InstanceNameToPodName will add component fragment before the random suffix
// e.g.
// - tidb instance name: db-xxxxxx
// - pod name: db-tidb-xxxxxx
func InstanceNameToPodName(name, component string) string {
	index := strings.LastIndexByte(name, '-')
	return name[:index] + "-" + component + "-" + name[index+1:]
}
