package utils

import (
	"github.com/tidbcloud/account/internel/dao/entity"
	"github.com/tidbcloud/tiinf/monitor/tilog"
)

type SimpleMap[KEY int | string, VALUE entity.AuthMethodName | entity.AuthMethodType | entity.EntityStatus | entity.PartnerType] map[KEY]VALUE

var AuthMethodTypeMap = SimpleMap[string, entity.AuthMethodType]{
	string(entity.AuthMethodTypePassword): entity.AuthMethodTypePassword,
	string(entity.AuthMethodTypeSocial):   entity.AuthMethodTypeSocial,
	string(entity.AuthMethodTypeOIDC):     entity.AuthMethodTypeOIDC,
	string(entity.AuthMethodTypeSAML):     entity.AuthMethodTypeSAML,
}

var EntityStatusMap = SimpleMap[string, entity.EntityStatus]{
	string(entity.Enable):  entity.Enable,
	string(entity.Disable): entity.Disable,
	string(entity.Active):  entity.Active,
	string(entity.Delete):  entity.Delete,
	string(entity.Pending): entity.Pending,
}

var AuthMethodNameMap = SimpleMap[string, entity.AuthMethodName]{
	string(entity.AuthMethodNameEmail):     entity.AuthMethodNameEmail,
	string(entity.AuthMethodNameGoogle):    entity.AuthMethodNameGoogle,
	string(entity.AuthMethodNameGitHub):    entity.AuthMethodNameGitHub,
	string(entity.AuthMethodNameMicrosoft): entity.AuthMethodNameMicrosoft,
}

var AuthMethodNameToTypeMap = map[string]entity.AuthMethodType{
	string(entity.AuthMethodNameEmail):     entity.AuthMethodTypePassword,
	string(entity.AuthMethodNameGoogle):    entity.AuthMethodTypeSocial,
	string(entity.AuthMethodNameGitHub):    entity.AuthMethodTypeSocial,
	string(entity.AuthMethodNameMicrosoft): entity.AuthMethodTypeSocial,
}

var AuthMethodDisplayNameMap = map[string]string{
	string(entity.AuthMethodNameEmail):     "Username and Password",
	string(entity.AuthMethodNameGoogle):    "Google",
	string(entity.AuthMethodNameGitHub):    "GitHub",
	string(entity.AuthMethodNameMicrosoft): "Microsoft",
}

var PartnerTypesMap = SimpleMap[string, entity.PartnerType]{
	string(entity.PartnerTypeCppo):   entity.PartnerTypeCppo,
	string(entity.PartnerTypeMsp):    entity.PartnerTypeMsp,
	string(entity.PartnerTypeMCPO):   entity.PartnerTypeMCPO,
	string(entity.PartnerTypeResale): entity.PartnerTypeResale,
}

//var sqlUserAuthMethodMap = map[string]core.DBUser_AuthMethod{
//	string(entity.AuthMethodPassword): core.DBUser_AUTH_METHOD_PASSWORD,
//}

func GetEntityStatus(statusStr string) entity.EntityStatus {
	return getEumFormMap[entity.EntityStatus](statusStr, EntityStatusMap)
}

func GetAuthMethodDisplayName(authMethodName string) string {
	displayName := getEumFormMap[string](authMethodName, AuthMethodDisplayNameMap)
	if displayName == "" {
		// use name to display
		displayName = authMethodName
	}
	return displayName
}
func GetAuthMethodName(authMethodName string) entity.AuthMethodName {
	return getEumFormMap[entity.AuthMethodName](authMethodName, AuthMethodNameMap)
}

func GetAuthMethodType(authMethodType string) entity.AuthMethodType {
	return getEumFormMap[entity.AuthMethodType](authMethodType, AuthMethodTypeMap)
}

func GetAuthMethodTypeByName(authMethodName string) entity.AuthMethodType {
	value, ok := AuthMethodNameToTypeMap[authMethodName]
	if ok {
		return value
	}
	if authMethodName == entity.DefaultSamlAuthMethodName {
		return entity.AuthMethodTypeSAML
	}
	return entity.AuthMethodTypeOIDC

}
func GetPartnerType(partnerTypeStr string) entity.PartnerType {
	return getEumFormMap[entity.PartnerType](partnerTypeStr, PartnerTypesMap)
}

func getEumFormMap[T entity.AuthMethodName | entity.AuthMethodType | entity.EntityStatus | entity.PartnerType | string](keyStr string, paramMap map[string]T) T {
	value, ok := paramMap[keyStr]
	if ok {
		return value
	}
	tilog.PlainInfo("invalid " + keyStr)
	return ""
}

/*
func GetCMAuthMethod(authMethod string) *core.DBUser_AuthMethod {
	value, ok := sqlUserAuthMethodMap[authMethod]
	if ok {
		return &value
	}
	return nil

}

func GetAuthMethodTypeByName(authMethodName entity.AuthMethodName) (entity.AuthMethodType, error) {

	if authMethodName == entity.AuthMethodNameEmail {
		return entity.AuthMethodTypePassword, nil
	} else if authMethodName == entity.AuthMethodNameGoogle || authMethodName == entity.AuthMethodNameGitHub ||
		authMethodName == entity.AuthMethodNameMicrosoft {
		return entity.AuthMethodTypeSocial, nil
	} else if authMethodName == entity.AuthMethodNameOIDC {
		return entity.AuthMethodTypeOIDC, nil
	}
	tilog.PlainInfo("invalid authMethodName  :" + string(authMethodName))
	return "", errors.BadRequestf("invalid authMethodName  ", authMethodName)
}


	func getEumFormMap(keyStr string) (entity.AuthMethodName, error) {
		value, ok := AuthMethodNameMap[keyStr]
		if ok {
			return value, nil
		}
		tilog.PlainInfo("invalid " + keyStr)
		return "", errors.BadRequestf("invalid   ", keyStr)
	}
*/
