/******************************************************************************
 * Copyright (c)  2022 PingCAP, Inc.                                          *
 * Licensed under the Apache License, Version 2.0 (the "License");            *
 * you may not use this file except in compliance with the License.           *
 * You may obtain a copy of the License at                                    *
 *                                                                            *
 * http://www.apache.org/licenses/LICENSE-2.0                                 *
 *                                                                            *
 * Unless required by applicable law or agreed to in writing, software        *
 * distributed under the License is distributed on an "AS IS" BASIS,          *
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   *
 * See the License for the specific language governing permissions and        *
 * limitations under the License.                                             *
 ******************************************************************************/

/*******************************************************************************
 * @File: common
 * @Description:
 * @Author: duanbing@pingcap.com
 * @Version: 1.0.0
 * @Date: 2022/5/26
*******************************************************************************/

package constants

import "time"

const (
	ObservabilityGlobalServer       string = "observability_global_server"
	ObservabilityRegionalServer     string = "observability_regional_server"
	ObservabilityRegionalDataServer string = "observability_regional_data_server"
	ObservabilityOpsServer          string = "observability_ops_server"
	ObservabilityBaseServiceName    string = "observability"
)

// service default port
const (
	DefaultObservabilityGlobalServerPort   int = 8080
	DefaultObservabilityRegionalServerPort int = 8081
)

// metric default port
const (
	DefaultObservabilityGlobalServerMetricsPort       int = 8082
	DefaultObservabilityGlobalServerHealthPort        int = 8081
	DefaultObservabilityRegionalServerMetricsPort     int = 8083
	DefaultObservabilityRegionalDataServerMetricsPort int = 8084
)

type ProvidedVendor string

// AWS @ Definition of vendors provided by server
const (
	AWS      ProvidedVendor = "aws"
	GCP      ProvidedVendor = "gcp"
	Azure    ProvidedVendor = "azure"
	AliCloud ProvidedVendor = "alicloud"
)

var VendorProviderMap map[ProvidedVendor]string = map[ProvidedVendor]string{
	AWS:      "eks",
	GCP:      "gke",
	Azure:    "aks",
	AliCloud: "ack",
}

// MaxBatchQuery Batch querying data from an array with maximum conditions
const (
	MaxBatchQuery int = 512
)

const DefaultTokenValidPeriod time.Duration = 4 * time.Hour

const DefaultServerCmMetaFileName = "meta.json"

const (
	EnvDev     = "dev"
	EnvStaging = "staging"
	EnvProd    = "prod"
)

const (
	// AuthorizationHeader API request headers
	AuthorizationHeader = "Authorization"
	BearerPrefix        = "Bearer"
	DefaultCacheTimeout = 5 * time.Minute
)

const (
	//Setup gin ReadHeaderTimeout
	GinReadHeaderTimeout = 5 * time.Second
	GinIdleTimeout       = 5 * time.Minute
	GracefulShutDownWait = 5 * time.Second
	ResourceWorkerGC     = 5 * time.Minute
	GlobalCacheGC        = 10 * time.Minute
)

// IAMDefaultRegion IAM default region
const IAMDefaultRegion = "us-west-2"

type ctxKey struct{}

var (
	RequestResultCtxKey = ctxKey{}
)

type Auth0ConnectionType string

// cloud auth0
const (
	Auth0DatabaseConnection     Auth0ConnectionType = "custom-email"
	Auth0SocialConnectionGoogle Auth0ConnectionType = "google-oauth2"
	Auth0SocialConnectionGithub Auth0ConnectionType = "github"
)

// dataplane role name
const (
	ObservabilityManagementRoleName = "o11y_management_role"
)

// privatelnk endpoint name anaotation when merge
const (
	AnnotationPrivateLinkEndpointName = "observability.pingcap.com/endpoint-name"

	AnnotationKeyPauseReconcile = "observability.pingcap.com/pause-reconciliation"
)

type DomainPostfix string

const DefaultDomainPostfix DomainPostfix = "observability.tidbcloud.com"
const DevDomainPostfix DomainPostfix = "observability-dev.pingcap.cloud"
const StagingDomainPostfix DomainPostfix = "observability-staging.pingcap.cloud"
const ProdDomainPostfix DomainPostfix = "observability.tidbcloud.com"

func GetDomainPostfix(env string, customerPostfix string) DomainPostfix {
	if customerPostfix != "" {
		return DomainPostfix(customerPostfix)
	}
	switch env {
	case EnvDev:
		return DevDomainPostfix
	case EnvStaging:
		return StagingDomainPostfix
	case EnvProd:
		return ProdDomainPostfix
	}
	return DefaultDomainPostfix
}
