// Copyright 2019 Yunion
//
// 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 compute

import (
	"yunion.io/x/onecloud/pkg/apis"
	billing_api "yunion.io/x/onecloud/pkg/apis/billing"
)

type SElasticipCreateInput struct {
	apis.VirtualResourceCreateInput

	// 区域名称或Id, 建议使用Id
	// 在指定区域内创建弹性公网ip
	CloudregionId string `json:"cloudregion_id"`
	// swagger:ignore
	Cloudregion string `json:"cloudregion" yunion-deprecated-by:"cloudregion_id"`
	// swagger:ignore
	Region string `json:"region" yunion-deprecated-by:"cloudregion_id"`
	// swagger:ignore
	RegionId string `json:"region_id" yunion-deprecated-by:"cloudregion_id"`

	// swagger:ignore
	Cloudprovider string `json:"cloudprovider" yunion-deprecated-by:"manager_id"`
	// swagger:ignore
	Manager string `json:"manager" yunion-deprecated-by:"manager_id"`
	// 子订阅Id, 建议使用Id
	// 使用指定子订阅创建弹性公网ip
	// 弹性公网ip和虚拟机在同一区域同一子订阅底下，才可以进行绑定操作
	ManagerId string `json:"manager_id"`

	// 计费类型: 流量或带宽
	//
	//
	//
	// | 平台       |    支持类型            |
	// | ---        |    --------            |
	// |Aliyun      | traffic, bandwidth    |
	// |腾讯云      | traffic                |
	// |Azure       | traffic                |
	// |Google      | traffic, bandwidth    |
	// |Ucloud      | traffic                |
	// |Aws         | traffic                |
	// |华为云      | traffic, bandwidth    |
	// |天翼云      | traffic, bandwidth    |
	// |KVM         | 不支持创建            |
	// |VMware      | 不支持创建            |
	// |ZStack      | traffic                |
	// |OpenStack   | traffic                |
	// default: traffic
	// enum: ["traffic", "bandwidth"]
	ChargeType billing_api.TNetChargeType `json:"charge_type"`

	Mode string `json:"mode"`

	// swagger:ignore
	Network string `json:"network" yunion-deprecated-by:"network_id"`
	// 子网Id
	// 私有云创建此参数必传,例如Openstack, ZStack
	NetworkId string `json:"network_id"`
	// 指定新建EIP的地址
	IpAddr string `json:"ip_addr"`

	// 线路类型
	//
	//
	//
	// | 平台       |    支持类型            |  说明 |
	// | ---        |    --------            | ---   |
	// |Aliyun      | BGP, BGP_PRO(精品线路)           | 部分区域不支持BGP_PRO|
	// default: BGP
	BgpType string `json:"bgp_type"`

	BandwidthMb int `json:"bandwidth"`
}

type ElasticipDetails struct {
	apis.VirtualResourceDetails
	ManagedResourceInfo
	CloudregionResourceInfo

	SElasticip

	// 绑定资源名称
	AssociateName string `json:"associate_name"`

	// 虚拟机内网IP
	ServerPrivateIp string `json:"server_private_ip"`
}

func (self ElasticipDetails) GetMetricTags() map[string]string {
	ret := map[string]string{
		"id":             self.Id,
		"name":           self.Name,
		"status":         self.Status,
		"mode":           self.Mode,
		"cloudregion":    self.Cloudregion,
		"cloudregion_id": self.CloudregionId,
		"region_ext_id":  self.RegionExtId,
		"tenant":         self.Project,
		"tenant_id":      self.ProjectId,
		"brand":          self.Brand,
		"domain_id":      self.DomainId,
		"project_domain": self.ProjectDomain,
		"ip_addr":        self.IpAddr,
		"external_id":    self.ExternalId,
	}
	return AppendMetricTags(ret, self.MetadataResourceInfo, self.ProjectizedResourceInfo)
}

type ElasticipSyncstatusInput struct {
}

type ElasticipAssociateInput struct {
	// 待绑定实例Id
	InstanceId string `json:"instance_id"`
	// swagger:ignore
	InstanceExternalId string `json:"instance_external_id"`

	// swagger:ignore
	Instance string `json:"instance" yunion-deprecated-by:"instance_id"`

	// 实例类型
	// enmu: server, natgateway
	// default: server
	InstanceType string `json:"instance_type"`

	// EIP映射的内网IP地址，可选
	IpAddr string `json:"ip_addr"`
}

type ElasticDissociateInput struct {
	// 注意: 若关联到aws NAT网关后，目前没办法解除关联关系
	// 是否解绑后自动删除弹性公网IP
	// default: false
	AutoDelete bool `json:"auto_delete"`
}

type ElasticipRemoteUpdateInput struct {
	// 是否覆盖替换所有标签
	ReplaceTags *bool `json:"replace_tags" help:"replace all remote tags"`
}
