package common

import (
	"fmt"
	"net/mail"
	"slices"
	"strings"

	globalcommonv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/common/v1"
	openapicommonv1beta1 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_cloud_open_api/common/v1beta1"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/domain/entity"
)

func BuildClusterState(
	state openapicommonv1beta1.ClusterState,
	customStatuses []*entity.ClusterCustomStatus,
) openapicommonv1beta1.ClusterState {
	// if cluster is creating, not override custom status
	if state == openapicommonv1beta1.ClusterState_CREATING {
		return state
	}

	// use custom status to override state
	// if there are multiple custom status, use the lastest one
	slices.SortFunc(customStatuses, func(a, b *entity.ClusterCustomStatus) int {
		if a.CreatedAt.After(b.CreatedAt) {
			return -1
		}
		if a.CreatedAt.Before(b.CreatedAt) {
			return 1
		}
		return 0
	})

	for _, status := range customStatuses {
		if status.IsExpired() {
			continue
		}
		if status.OverrideState != nil {
			return *status.OverrideState
		}
	}
	return state
}

func BuildCreatedBy(userEmail, apiKey string) string {
	switch {
	case apiKey != "":
		return fmt.Sprintf("apikey-%s", apiKey)
	case userEmail != "":
		return userEmail
	default:
		return "unknown"
	}
}

func ConvCreatedBy(createBy string) string {
	if ValidMailAddress(createBy) {
		return createBy
	}

	if strings.HasPrefix(createBy, "apikey-") || strings.HasPrefix(createBy, "token-") {
		return createBy
	}

	return "apikey-" + createBy
}

func ValidMailAddress(address string) bool {
	_, err := mail.ParseAddress(address)
	return err == nil
}

func CvtAvailableFeature(in []globalcommonv1.AvailableFeature) string {
	availableFeatures := make([]string, 0, len(in))

	for _, f := range in {
		availableFeatures = append(availableFeatures, f.String())
	}
	return strings.Join(availableFeatures, ",")
}
