/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 global

// ApplicationConfig is a configuration for current applicationConfig, whether the applicationConfig is a provider or a consumer
type ApplicationConfig struct {
	Organization string `default:"dubbo-go" yaml:"organization" json:"organization,omitempty" property:"organization"`
	Name         string `default:"dubbo.io" yaml:"name" json:"name,omitempty" property:"name"`
	Module       string `default:"sample" yaml:"module" json:"module,omitempty" property:"module"`
	Group        string `yaml:"group" json:"group,omitempty" property:"module"`
	Version      string `yaml:"version" json:"version,omitempty" property:"version"`
	Owner        string `default:"dubbo-go" yaml:"owner" json:"owner,omitempty" property:"owner"`
	Environment  string `yaml:"environment" json:"environment,omitempty" property:"environment"`
	// the metadata type. remote or local
	MetadataType            string `default:"local" yaml:"metadata-type" json:"metadataType,omitempty" property:"metadataType"`
	Tag                     string `yaml:"tag" json:"tag,omitempty" property:"tag"`
	MetadataServicePort     string `yaml:"metadata-service-port" json:"metadata-service-port,omitempty" property:"metadata-service-port"`
	MetadataServiceProtocol string `default:"dubbo" yaml:"metadata-service-protocol" json:"metadata-service-protocol,omitempty" property:"metadata-service-protocol"`
}

func DefaultApplicationConfig() *ApplicationConfig {
	// return a new config without setting any field means there is not any default value for initialization
	return &ApplicationConfig{}
}

// Clone a new ApplicationConfig
func (c *ApplicationConfig) Clone() *ApplicationConfig {
	if c == nil {
		return nil
	}

	return &ApplicationConfig{
		Organization:            c.Organization,
		Name:                    c.Name,
		Module:                  c.Module,
		Group:                   c.Group,
		Version:                 c.Version,
		Owner:                   c.Owner,
		Environment:             c.Environment,
		MetadataType:            c.MetadataType,
		Tag:                     c.Tag,
		MetadataServicePort:     c.MetadataServicePort,
		MetadataServiceProtocol: c.MetadataServiceProtocol,
	}
}
