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

import (
	"context"
	"flag"
	"time"
)

type BBFAdapterConfig struct {
	PrintVersion          bool
	PrintBanner           bool
	LogLevel              string
	ProbeAddress          string
	TraceEnabled          bool
	TraceAgentAddress     string
	LogCorrelationEnabled bool
	VolthaNbiEndpoint     string
	TlsEnabled            bool
	TlsVerify             bool
	OnosRestEndpoint      string
	OnosUser              string
	OnosPassword          string
	SchemaMountFilePath   string
	KafkaClusterAddress   string
	KvStoreType           string
	KvStoreAddress        string
	KvStoreTimeout        time.Duration
	KvStorePrefix         string
}

// LoadConfig loads the BBF adapter configuration through
// default values and CLI arguments
func LoadConfig(ctx context.Context) *BBFAdapterConfig {
	conf := getDefaultConfig()

	flag.StringVar(&conf.LogLevel, "log_level", conf.LogLevel, "Log level (DEBUG, INFO, WARN, ERROR)")
	flag.BoolVar(&conf.PrintVersion, "version", conf.PrintVersion, "Print the version and exit")
	flag.BoolVar(&conf.PrintBanner, "banner", conf.PrintBanner, "Print the banner at startup")
	flag.StringVar(&conf.ProbeAddress, "probe_address", conf.ProbeAddress, "The address on which to listen to answer liveness and readiness probe queries over HTTP")
	flag.BoolVar(&conf.TraceEnabled, "trace_enabled", conf.TraceEnabled, "Whether to send logs to tracing agent")
	flag.StringVar(&conf.TraceAgentAddress, "trace_agent_address", conf.TraceAgentAddress, "The address of tracing agent to which span info should be sent")
	flag.BoolVar(&conf.LogCorrelationEnabled, "log_correlation_enabled", conf.LogCorrelationEnabled, "Whether to enrich log statements with fields denoting operation being executed for achieving correlation")
	flag.StringVar(&conf.VolthaNbiEndpoint, "voltha_nbi_endpoint", conf.VolthaNbiEndpoint, "Endpoint of the VOLTHA northbound interface")
	flag.BoolVar(&conf.TlsEnabled, "tls_enabled", conf.TlsEnabled, "Whether to use TLS when connecting to VOLTHA's northbound grpc server")
	flag.BoolVar(&conf.TlsVerify, "tls_verify", conf.TlsVerify, "Whether to verify the server's certificate when connecting to VOLTHA's northbound grpc server. To be used with 'tls_enabled'.")
	flag.StringVar(&conf.OnosRestEndpoint, "onos_rest_endpoint", conf.OnosRestEndpoint, "Endpoint of ONOS REST APIs")
	flag.StringVar(&conf.OnosUser, "onos_user", conf.OnosUser, "Username for ONOS REST APIs")
	flag.StringVar(&conf.OnosPassword, "onos_pass", conf.OnosPassword, "Password for ONOS REST APIs")
	flag.StringVar(&conf.SchemaMountFilePath, "schema_mount_path", conf.SchemaMountFilePath, "Path to the XML file that defines schema-mounts for libyang")
	flag.StringVar(&conf.KafkaClusterAddress, "kafka_cluster_address", conf.KafkaClusterAddress, "Kafka cluster messaging address")
	flag.StringVar(&conf.KvStoreType, "kv_store_type", conf.KvStoreType, "KV store type (etcd, redis)")
	flag.StringVar(&conf.KvStoreAddress, "kv_store_address", conf.KvStoreAddress, "KV store address")
	flag.DurationVar(&conf.KvStoreTimeout, "kv_store_request_timeout", conf.KvStoreTimeout, "The default timeout when making a KV store request")
	flag.StringVar(&conf.KvStorePrefix, "kv_store_prefix", conf.KvStorePrefix, "Prefix used in KV store paths")

	flag.Parse()

	return conf
}

// getDefaultConfig returns a BBF Adapter configuration with default values
func getDefaultConfig() *BBFAdapterConfig {
	return &BBFAdapterConfig{
		LogLevel:              "ERROR",
		PrintVersion:          false,
		PrintBanner:           false,
		ProbeAddress:          ":8080",
		TraceEnabled:          false,
		TraceAgentAddress:     "127.0.0.1:6831",
		LogCorrelationEnabled: true,
		VolthaNbiEndpoint:     "voltha-voltha-api.voltha.svc:55555",
		TlsEnabled:            false,
		TlsVerify:             false,
		OnosRestEndpoint:      "voltha-infra-onos-classic-hs.infra.svc:8181",
		OnosUser:              "onos",
		OnosPassword:          "rocks",
		SchemaMountFilePath:   "/schema-mount.xml",
		KafkaClusterAddress:   "127.0.0.1:9092",
		KvStoreType:           "etcd",
		KvStoreAddress:        "etcd:2379",
		KvStoreTimeout:        time.Second * 5,
		KvStorePrefix:         "service/voltha_voltha",
	}
}
