/*


* Copyright 2022-present Open Networking Foundation
* 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.
 */

// Package envutils provides the env parsing utility functions
package envutils

import (
	"fmt"
	"os"
	"strconv"
)

// common constants
const (
	// common environment variables

	KafkaAdapterHost     = "KAFKA_ADAPTER_HOST"
	KafkaAdapterPort     = "KAFKA_ADAPTER_PORT"
	KafkaClusterHost     = "KAFKA_CLUSTER_HOST"
	KafkaClusterPort     = "KAFKA_CLUSTER_PORT"
	KvStoreType          = "KV_STORE_TYPE"
	KvStoreTimeout       = "KV_STORE_TIMEOUT"
	KvStoreHost          = "KV_STORE_HOST"
	KvStorePort          = "KV_STORE_PORT"
	AdapterTopic         = "ADAPTER_TOPIC"
	CoreTopic            = "CORE_TOPIC"
	EventTopic           = "EVENT_TOPIC"
	LogLevel             = "LOG_LEVEL"
	OnuNumber            = "ONU_NUMBER"
	Banner               = "BANNER"
	DisplayVersionOnly   = "DISPLAY_VERSION_ONLY"
	ProbeHost            = "PROBE_HOST"
	ProbePort            = "PROBE_PORT"
	LiveProbeInterval    = "LIVE_PROBE_INTERVAL"
	NotLiveProbeInterval = "NOT_LIVE_PROBE_INTERVAL"
	VolthaHost           = "VOLTHA_HOST"
	VolthaPort           = "VOLTHA_PORT"
	HostName             = "HOST_NAME"

	// openolt adapter environment variables

	HeartbeatCheckInterval      = "HEARTBEAT_CHECK_INTERVAL"
	HeartbeatFailReportInterval = "HEARTBEAT_FAIL_REPORT_INTERVAL"
	GrpcTimeoutInterval         = "GRPC_TIMEOUT_INTERVAL"

	// rwcore environment variables

	RWCoreEndpoint            = "RW_CORE_ENDPOINT"
	GrpcHost                  = "GRPC_HOST"
	GrpcPort                  = "GRPC_PORT"
	AffinityRouterTopic       = "AFFINITY_ROUTER_TOPIC"
	InCompetingMode           = "IN_COMPETING_MODE"
	KVTxnKeyDelTime           = "KV_TXN_KEY_DEL_TIME"
	KVStoreDataPrefix         = "KV_STORE_DATA_PREFIX"
	LongRunningRequestTimeout = "LONG_RUNNING_REQ_TIMEOUT"
	DefaultRequestTimeout     = "DEFAULT_REQ_TIMEOUT"
	DefaultCoreTimeout        = "DEFAULT_CORE_TIMEOUT"
	CoreBindingKey            = "CORE_BINDING_KEY"
	CorePairTopic             = "CORE_PAIR_TOPIC"
	MaxConnectionRetries      = "MAX_CONNECTION_RETRIES"
	ConnectionRetryInterval   = "CONNECTION_RETRY_INTERVAL"

	// vgc environment variables

	DeviceListRefreshInterval = "DEVICE_LIST_REFRESH_INTERVAL" // in seconds
	CPUProfile                = "CPU_PROFILE"
	MemProfile                = "MEM_PROFILE"
	VendorID                  = "VENDOR_ID"
	DeviceSyncDuration        = "DEVICE_SYNC_DURATION"
	// openonu environment variables

	OmciPacketCapture = "SAVE_OMCI_PACKET_CAPTURE"
)

// ParseStringEnvVariable reads the environment variable and returns env as string
func ParseStringEnvVariable(envVarName string, defaultVal string) string {
	envValue := os.Getenv(envVarName)
	if envValue == "" {
		fmt.Println("Environment variable " + envVarName + " undefined")
		return defaultVal
	}
	return envValue
}

// ParseIntEnvVariable reads the environment variable and returns env as int64
func ParseIntEnvVariable(envVarName string, defaultVal int64) int64 {
	envValue := os.Getenv(envVarName)
	if envValue == "" {
		fmt.Println("Environment variable "+envVarName+" undefined", envVarName)
		return defaultVal
	}
	returnVal, err := strconv.Atoi(envValue)
	if err != nil {
		fmt.Println("Unable to convert string to integer environment variable")
		return defaultVal
	}
	return int64(returnVal)
}

// ParseBoolEnvVariable reads the environment variable and returns env as boolean
func ParseBoolEnvVariable(envVarName string, defaultVal bool) bool {
	envValue := os.Getenv(envVarName)
	if envValue == "" {
		fmt.Println("Environment variable " + envVarName + " undefined")
		return defaultVal
	}
	if envValue == "true" || envValue == "True" {
		return true
	}
	return false
}
