// 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"

type ScalingGroupCreateInput struct {
	apis.VirtualResourceCreateInput
	apis.EnabledBaseResourceCreateInput
	VpcResourceInput

	// description: cloud region id or name
	// required: true
	// example: cr-test-one
	Cloudregion string `json:"cloudregion"`

	//swagger:ignore
	CloudregionId string `json:"cloudregion_id"`

	// description: hypervisor
	// example: kvm
	Hypervisor string `json:"hypervisor"`

	// description: 多个网络(ID或者Name),
	// example: n-test-one
	Networks []string `json:"networks"`

	// description: 最小实例数
	// example: 0
	MinInstanceNumber int `json:"min_instance_number"`

	// description: 最大实例数
	// example: 10
	MaxInstanceNumber int `json:"max_instance_number"`

	// description: 期望实例数
	// example: 1
	DesireInstanceNumber int `json:"desire_instance_number"`

	// description: 主机模板 id or name
	// example: gt-test-one
	GuestTemplate string `json:"guest_template"`

	// swagger:ignore
	GuestTemplateId string `json:"guest_template_id"`

	// description: 扩容策略
	// enum: ["balanced"]
	// required: false
	// example: balanced
	ExpansionPrinciple string `json:"expansion_principle"`

	// description: 缩容策略
	// enum: ["earliest","latest","config_earliest","config_latest"]
	// example: latest
	ShrinkPrinciple string `json:"shrink_principle"`

	// description: 检查健康模式
	// enum: ["normal","loadbalancer"]
	// example: normal
	HealthCheckMode string `json:"health_check_mode"`

	// description: 健康检查周期
	// example: 300
	HealthCheckCycle int `json:"health_check_cycle"`

	// description: 健康检查缓冲时间
	// example: 180
	HealthCheckGov int `json:"health_check_gov"`

	// description: 负载均衡后端服务器组
	// example: lbg-nihao
	LbBackendGroup string `json:"lb_backend_group"`

	// swagger:ignore
	BackendGroupId string `json:"backend_group_id"`

	// description: 负载均衡后端服务器统一端口
	// example: 8080
	LoadbalancerBackendPort int `json:"loadbalancer_backend_port"`

	// description: 负载均衡后端服务器的weight
	// example: 10
	LoadbalancerBackendWeight int `json:"loadbalancer_backend_weight"`
}

type ScalingGroupListInput struct {
	apis.VirtualResourceListInput
	RegionalFilterListInput
	LoadbalancerBackendGroupFilterListInput
	VpcFilterListInput
	GroupFilterListInput
	GuestTemplateFilterListInput
	apis.EnabledResourceBaseListInput
	// description: hypervisor
	// example: kvm
	Hypervisor string `json:"hypervisor"`

	// desription: 平台
	// example: OneCloud
	Brand string `json:"brand"`
}

type ScalingGroupDetails struct {
	apis.VirtualResourceDetails
	CloudregionResourceInfo
	LoadbalancerBackendGroupResourceInfo
	VpcResourceInfo
	GroupResourceInfo
	GuestTemplateResourceInfo
	SScalingGroup

	// description: 实例数
	// example: 0
	InstanceNumber int `json:"instance_number"`

	// description: 伸缩策略的数量
	// example: 3
	ScalingPolicyNumber int `json:"scaling_policy_number"`

	// description: 平台
	// example: OneCloud
	Brand string `json:"brand"`

	// description: 网络信息
	Networks []ScalingGroupNetwork `json:"networks"`
}

type ScalingGroupNetwork struct {
	Id           string `json:"id"`
	Name         string `json:"name"`
	GuestIpStart string `json:"guest_ip_start"`
	GuestIpEnd   string `json:"guest_ip_end"`
}

type ScalingGroupResourceInfo struct {
	// description: 伸缩组名称
	// example: sg-nihao
	ScalingGroup string `json:"scaling_group"`

	// description: 伸缩组ID
	// example: sg-1234
	ScalingGroupId string `json:"scaling_group_id"`
}

type ScalingGroupFilterListInput struct {
	// description: 伸缩组 Id or Name
	// example: sg-1234
	ScalingGroup string `json:"scaling_group"`
}

type SGPerformDetachScalingGroupInput struct {
	// description: 伸缩组 Id or Name
	// example: sg-1234
	ScalingGroup string `json:"scaling_group"`

	// description: 是否删除机器
	// example: false
	DeleteServer bool `json:"delete_server"`

	// description: 自动行为
	// example: true
	Auto bool `json:"auto"`
}
