// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0

package configutil

func (c *SharedConfig) Merge(c2 *SharedConfig) *SharedConfig {
	if c2 == nil {
		return c
	}

	result := new(SharedConfig)

	for _, l := range c.Listeners {
		result.Listeners = append(result.Listeners, l)
	}
	for _, l := range c2.Listeners {
		result.Listeners = append(result.Listeners, l)
	}

	for _, userlockout := range c.UserLockouts {
		result.UserLockouts = append(result.UserLockouts, userlockout)
	}
	for _, userlockout := range c2.UserLockouts {
		result.UserLockouts = append(result.UserLockouts, userlockout)
	}

	result.HCPLinkConf = c.HCPLinkConf
	if c2.HCPLinkConf != nil {
		result.HCPLinkConf = c2.HCPLinkConf
	}

	result.Entropy = c.Entropy
	if c2.Entropy != nil {
		result.Entropy = c2.Entropy
	}

	for _, s := range c.Seals {
		result.Seals = append(result.Seals, s)
	}
	for _, s := range c2.Seals {
		result.Seals = append(result.Seals, s)
	}

	result.Telemetry = c.Telemetry
	if c2.Telemetry != nil {
		result.Telemetry = c2.Telemetry
	}

	result.DisableMlock = c.DisableMlock
	if c2.DisableMlock {
		result.DisableMlock = c2.DisableMlock
	}

	result.DefaultMaxRequestDuration = c.DefaultMaxRequestDuration
	if c2.DefaultMaxRequestDuration > result.DefaultMaxRequestDuration {
		result.DefaultMaxRequestDuration = c2.DefaultMaxRequestDuration
	}

	result.LogLevel = c.LogLevel
	if c2.LogLevel != "" {
		result.LogLevel = c2.LogLevel
	}

	result.LogFormat = c.LogFormat
	if c2.LogFormat != "" {
		result.LogFormat = c2.LogFormat
	}

	result.LogFile = c.LogFile
	if c2.LogFile != "" {
		result.LogFile = c2.LogFile
	}

	result.LogRotateBytes = c.LogRotateBytes
	if c2.LogRotateBytesRaw != nil {
		result.LogRotateBytes = c2.LogRotateBytes
		result.LogRotateBytesRaw = c2.LogRotateBytesRaw
	}

	result.LogRotateMaxFiles = c.LogRotateMaxFiles
	if c2.LogRotateMaxFilesRaw != nil {
		result.LogRotateMaxFiles = c2.LogRotateMaxFiles
		result.LogRotateMaxFilesRaw = c2.LogRotateMaxFilesRaw
	}

	result.LogRotateDuration = c.LogRotateDuration
	if c2.LogRotateDuration != "" {
		result.LogRotateDuration = c2.LogRotateDuration
	}

	result.PidFile = c.PidFile
	if c2.PidFile != "" {
		result.PidFile = c2.PidFile
	}

	result.ClusterName = c.ClusterName
	if c2.ClusterName != "" {
		result.ClusterName = c2.ClusterName
	}

	return result
}
