/*
 * Copyright 2018-2023 Open Networking Foundation (ONF) and the ONF Contributors

 * 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 config

import (
	"flag"
	"os"
	"time"
)

// RW Core service default constants
const (
	EtcdStoreName = "etcd"
)

// RWCoreFlags represents the set of configurations used by the read-write core service
type RWCoreFlags struct {
	// Command line parameters
	GrpcNBIAddress              string
	GrpcSBIAddress              string
	KafkaClusterAddress         string
	KVStoreType                 string
	KVStoreTimeout              time.Duration
	KVStoreAddress              string
	EventTopic                  string
	EventTopicPartitions        int
	EventTopicReplicas          int
	LogLevel                    string
	Banner                      bool
	DisplayVersionOnly          bool
	RWCoreKey                   string
	RWCoreCert                  string
	RWCoreCA                    string
	InternalTimeout             time.Duration
	RPCTimeout                  time.Duration
	FlowTimeout                 time.Duration
	MaxConnectionRetries        int
	ConnectionRetryInterval     time.Duration
	LiveProbeInterval           time.Duration
	NotLiveProbeInterval        time.Duration
	ProbeAddress                string
	TraceEnabled                bool
	TraceAgentAddress           string
	LogCorrelationEnabled       bool
	VolthaStackID               string
	BackoffRetryInitialInterval time.Duration
	BackoffRetryMaxElapsedTime  time.Duration
	BackoffRetryMaxInterval     time.Duration
}

// ParseCommandArguments parses the arguments when running read-write core service
func (cf *RWCoreFlags) ParseCommandArguments(args []string) {

	fs := flag.NewFlagSet(os.Args[0], flag.ExitOnError)

	fs.StringVar(&cf.GrpcNBIAddress,
		"grpc_nbi_address",
		":50057",
		"GRPC NBI server - address")

	fs.StringVar(&cf.GrpcSBIAddress,
		"grpc_sbi_address",
		":50058",
		"GRPC SBI server - address")

	fs.StringVar(&cf.KafkaClusterAddress,
		"kafka_cluster_address",
		"127.0.0.1:9092",
		"Kafka - Cluster messaging address")

	fs.StringVar(&cf.EventTopic,
		"event_topic",
		"voltha.events",
		"RW Core Event topic")

	fs.IntVar(&cf.EventTopicPartitions,
		"EventTopicPartitions",
		1,
		"RW Core Event topic partitions")

	fs.IntVar(&cf.EventTopicReplicas,
		"EventTopicReplicas",
		1,
		"RW Core Event topic replicas")

	fs.StringVar(&cf.KVStoreType,
		"kv_store_type",
		EtcdStoreName,
		"KV store type")

	fs.DurationVar(&cf.KVStoreTimeout,
		"kv_store_request_timeout",
		5*time.Second,
		"The default timeout when making a kv store request")

	fs.StringVar(&cf.KVStoreAddress,
		"kv_store_address",
		"127.0.0.1:2379",
		"KV store address")

	fs.StringVar(&cf.LogLevel,
		"log_level",
		"warn",
		"Log level")

	fs.DurationVar(&(cf.InternalTimeout),
		"internal_timeout",
		5*time.Second,
		"Core internal timeout")

	fs.DurationVar(&(cf.RPCTimeout),
		"rpc_timeout",
		5*time.Second,
		"RPC timeout")

	fs.DurationVar(&(cf.FlowTimeout), //Note flow time out will be considered for flows related rpc's not rpc timeout
		"flow_timeout",
		30*time.Second,
		"Flow timeout")

	fs.BoolVar(&cf.Banner,
		"banner",
		false,
		"Show startup banner log lines")

	fs.BoolVar(&cf.DisplayVersionOnly,
		"version",
		false,
		"Show version information and exit")

	fs.IntVar(&cf.MaxConnectionRetries,
		"max_connection_retries",
		-1,
		"The number of retries to connect to a dependent component")

	fs.DurationVar(&cf.ConnectionRetryInterval,
		"connection_retry_interval",
		2*time.Second,
		"The number of seconds between each connection retry attempt")

	fs.DurationVar(&cf.LiveProbeInterval,
		"live_probe_interval",
		60*time.Second,
		"The number of seconds between liveness probes while in a live state")

	fs.DurationVar(&cf.NotLiveProbeInterval,
		"not_live_probe_interval",
		5*time.Second,
		"The number of seconds between liveness probes while in a not live state")

	fs.StringVar(&cf.ProbeAddress,
		"probe_address",
		":8080",
		"The address on which to listen to answer liveness and readiness probe queries over HTTP")

	fs.BoolVar(&(cf.TraceEnabled),
		"trace_enabled",
		false,
		"Whether to send logs to tracing agent?")

	fs.StringVar(&cf.TraceAgentAddress,
		"trace_agent_address",
		"127.0.0.1:6831",
		"The address of tracing agent to which span info should be sent")

	fs.BoolVar(&cf.LogCorrelationEnabled,
		"log_correlation_enabled",
		true,
		"Whether to enrich log statements with fields denoting operation being executed for achieving correlation?")

	fs.StringVar(&cf.VolthaStackID,
		"stack_id",
		"voltha",
		"ID for the current voltha stack")

	fs.DurationVar(&cf.BackoffRetryInitialInterval,
		"backoff_retry_initial_interval",
		500*time.Millisecond,
		"The initial number of milliseconds an exponential backoff will wait before a retry")

	fs.DurationVar(&cf.BackoffRetryMaxElapsedTime,
		"backoff_retry_max_elapsed_time",
		0*time.Second,
		"The maximum number of milliseconds an exponential backoff can elasped")

	fs.DurationVar(&cf.BackoffRetryMaxInterval,
		"backoff_retry_max_interval",
		1*time.Minute,
		"The maximum number of milliseconds of an exponential backoff interval")

	_ = fs.Parse(args)
}
