/*
 *
 * Copyright 2018 gRPC authors.
 *
 * 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 envconfig contains grpc settings configured by environment variables.
package envconfig

import (
	"os"
	"strings"
)

const (
	prefix              = "GRPC_GO_"
	retryStr            = prefix + "RETRY"
	requireHandshakeStr = prefix + "REQUIRE_HANDSHAKE"
)

// RequireHandshakeSetting describes the settings for handshaking.
type RequireHandshakeSetting int

const (
	// RequireHandshakeHybrid (default, deprecated) indicates to wait for
	// handshake before considering a connection ready, but wait before
	// considering successful.
	RequireHandshakeHybrid RequireHandshakeSetting = iota
	// RequireHandshakeOn (default after the 1.17 release) indicates to wait
	// for handshake before considering a connection ready/successful.
	RequireHandshakeOn
	// RequireHandshakeOff indicates to not wait for handshake before
	// considering a connection ready/successful.
	RequireHandshakeOff
)

var (
	// Retry is set if retry is explicitly enabled via "GRPC_GO_RETRY=on".
	Retry = strings.EqualFold(os.Getenv(retryStr), "on")
	// RequireHandshake is set based upon the GRPC_GO_REQUIRE_HANDSHAKE
	// environment variable.
	//
	// Will be removed after the 1.18 release.
	RequireHandshake RequireHandshakeSetting
)

func init() {
	switch strings.ToLower(os.Getenv(requireHandshakeStr)) {
	case "on":
		RequireHandshake = RequireHandshakeOn
	case "off":
		RequireHandshake = RequireHandshakeOff
	case "hybrid":
		// Will be removed after the 1.17 release.
		RequireHandshake = RequireHandshakeHybrid
	}
}
