package config

import (
	"time"
)

type (
	Auth0ConnectionType string
)

const (
	Auth0DatabaseConnection        Auth0ConnectionType = "custom-email"
	Auth0SocialConnectionGoogle    Auth0ConnectionType = "google-oauth2"
	Auth0SocialConnectionGithub    Auth0ConnectionType = "github"
	Auth0SocialConnectionMicrosoft Auth0ConnectionType = "windowslive"
)

const (
	// TimeFormat is the time format for generate backup name
	TimeFormat = "2006-01-02t15-04-05"

	TimeFmtDTM = "2006-01-02 15:04:05"

	// SystemEmail is the email used for autonomous operations
	SystemEmail = "system@pingcap.com"
	// TestEmail for test
	TestEmail = "test@pingcap.com"

	DefaultUtcOffset = "0"
	//DefaultTidbQuota    = 10
	//DefaultTikvQuota    = 15
	//DefaultTiflashQuota = 5
	DefaultProjectName        = "default project"
	DefaultVirtualProjectName = "default virtual project"

	PortalAuthorizationHeader = "Portal-Authorization"

	RegistrationSourceEmail = "custom-email"
	SalesforceApiKeyName    = "salesforce"

	DefaultDBOperationTimeout = 30 * time.Second

	Duration4DevTierTrialStageNormal = Duration4DevTierTrialTotal - Duration4DevTierCloseToEndStage1
	Duration4DevTierCloseToEndStage1 = 14 * time.Hour * 24  // two week before trial end
	Duration4DevTierCloseToEndStage2 = 2 * time.Hour * 24   // two day before trial end
	Duration4DevTierTrialTotal       = 365 * time.Hour * 24 // total duration of dev tier trial
	MspCreateApiKeyTokenPeriod       = 7 * time.Hour * 24

	GatewayAPIKeyRedisKeyFormat = "dbaas:account:api_keys:%s"
)

const (
	ErrAtLeastOneOwner  = "The organization needs to have at least one owner."
	ErrDeleteProject    = "The project has a running cluster. Before deleting the project, all clusters need to be deleted."
	ErrImpersonatedUser = "impersonated user is a read only user"
)

// dbUser
const (
	JwtTokenExpiredTime   = 15 * time.Minute
	ShareKeyOrg           = 0
	Iss                   = "pingcap.com"
	EventType             = "ClusterEvent"
	Group                 = "Account"
	ProviderGroup         = "Account-Provider"
	WorkerGroup           = "Account-Worker"
	CentralGroup          = "Account-Central"
	CommandIgnoreTime     = 1  // hour
	FailCommandIgnoreTime = 60 // second
)

const (
	// create cluster in register
	EventTypeRegister                               = "RegisterEvent"
	EventTypeCreateTenant                           = "CreateTenantEvent"
	EventTypeOrg                                    = "OrgEvent"
	EventTypeDataAppBindCluster                     = "DataAppBindCluster"
	EventTypeMsp                                    = "MspEvent"
	EventTypeRemoveUserFromOrg                      = "RemoveUserFromOrgEvent"
	EventTypeAddUserToOrg                           = "AddUserToOrgEvent"
	EventTypeChangeUserOrgRole                      = "ChangeUserOrgRoleEvent"
	EventTypeEventTypeOrgRegistrationProviderSource = "OrgRegistrationProviderSourceEvent"
	EventTypeOperateClusterDbUser                   = "OperateClusterDbUser"
	EventTypeAccountDataChangeEvent                 = "AccountDataChangeEvent"
)

// worker trace ComponentName
const (
	TraceComponentNameWorker = "account-worker"
	//TraceComponentNameWorker  = "account-worker"
	TraceComponentNameCentral = "account-central"
)

const (
	PartnerDomainPrefix = "partner-console"
)

const (
	JsmRequestFieldIdMapping   = "id_mapping"
	JsmRequestFieldTypeMapping = "type_mapping"
	JsmRequestFieldServerity   = "serverity"
	JsmRequestFieldComponent   = "component"
	JsmRequestFieldClusterType = "clusterType"
)

// msp
const (
	MspDisclaimers = "I agree that my TiDB Cloud account is through a managed service provider and is solely subject to the terms and conditions between my organization and the managed service provider."
)

func (c Auth0ConnectionType) String() string {
	return string(c)
}

func (c Auth0ConnectionType) IsAuth0SocialConnection() bool {
	if c == Auth0SocialConnectionGoogle || c == Auth0SocialConnectionGithub || c == Auth0SocialConnectionMicrosoft {
		return true
	}

	if globalConf.OktaMapperConfig[c.String()] != 0 {
		return true
	}

	return false
}

func (c Auth0ConnectionType) IsOKTAConnection() bool {
	return globalConf.OktaMapperConfig[c.String()] != 0
}
