package region

import "github.com/tidbcloud/devops/api"

type Region struct {
	Region                    *RegionSpec                `json:"region,omitempty"`
	DeployType                string                     `json:"deploy_type,omitempty"`
	RegionProviderIdentities  []*RegionProviderIdentity  `json:"region_provider_identities,omitempty"`
	DefaultProviderIdentities []*DefaultProviderIdentity `json:"default_provider_identities,omitempty"`
}

type RegionSpec struct {
	Id                 string                    `json:"id,omitempty"`
	CloudProviderId    string                    `json:"cloud_provider_id,omitempty"`
	DisplayName        string                    `json:"display_name,omitempty"`
	OpenedTenantIds    []string                  `json:"opened_tenant_ids,omitempty"`
	RegionWhiteLists   []*RegionWhiteList        `json:"region_white_lists,omitempty"`
	SortPriority       int32                     `json:"sort_priority,omitempty"`
	Area               string                    `json:"area,omitempty"`
	CountryCode        string                    `json:"country_code,omitempty"`
	State              string                    `json:"state,omitempty"`
	IsPublic           bool                      `json:"is_public,omitempty"`
	DefaultBackupTime  string                    `json:"default_backup_time,omitempty"`
	ServiceAddress     string                    `json:"service_address,omitempty"`
	LogicalName        string                    `json:"logical_name,omitempty"`
	ServicePlan        string                    `json:"service_plan,omitempty"`
	SharedBucketUrl    *string                   `json:"shared_bucket_url,omitempty"`
	OpsAuditLogSetting *RegionOpsAuditLogSetting `json:"ops_audit_log_setting,omitempty"`
}

type RegionWhiteList struct {
	ServicePlan     string   `json:"service_plan,omitempty"`
	IsPublic        bool     `json:"is_public,omitempty"`
	OpenedTenantIds []string `json:"opened_tenant_ids,omitempty"`
}

type RegionProviderIdentity struct {
	Id        uint64 `json:"id,omitempty"`
	Identity  string `json:"identity,omitempty"`
	IsDefault bool   `json:"is_default,omitempty"`
}

type DefaultProviderIdentity struct {
	Id          uint64 `json:"id,omitempty"`
	TenantID    string `json:"tenant_id,omitempty"`
	Identity    string `json:"identity,omitempty"`
	ServicePlan string `json:"service_plan,omitempty"`
}

type RegionOpsAuditLogSetting struct {
	Enabled     bool                                 `json:"enabled,omitempty"`
	LogLocation *RegionOpsAuditLogSettingLogLocation `json:"log_location,omitempty"`
	LogRotation *RegionOpsAuditLogSettingLogRotation `json:"log_rotation,omitempty"`
}

type RegionOpsAuditLogSettingLogLocation struct {
	Type       string `json:"type,omitempty"`
	BucketUri  string `json:"bucket_uri,omitempty"`
	RoleArn    string `json:"role_arn,omitempty"`
	ExternalId string `json:"external_id,omitempty"`
	AccountId  string `json:"account_id,omitempty"`
}

type RegionOpsAuditLogSettingLogRotation struct {
	FileSizeLimitInMb     uint64 `json:"file_size_limit_in_mb,omitempty"`
	RotationIntervalInMin uint64 `json:"rotation_interval_in_min,omitempty"`
}

type ListRegionsRequest struct {
	DeployType  *string `form:"deploy_type" json:"deploy_type"`
	ServicePlan *string `form:"service_plan" json:"service_plan"`
	TenantID    *string `form:"tenant_id" json:"tenant_id"`
}

type ListRegionsResponse struct {
	api.BaseResp `json:",inline"`

	Regions []*Region `json:"regions,omitempty"`
}

type GetRegionRequest struct {
	DeployType    string `form:"deploy_type" json:"deploy_type"`
	CloudProvider string `form:"cloud_provider" json:"cloud_provider"`
	LogicalName   string `form:"logical_name" json:"logical_name"`
	ServicePlan   string `form:"service_plan" json:"service_plan"`
}

type GetRegionResponse struct {
	api.BaseResp `json:",inline"`

	Region *Region `json:"region,omitempty"`
}

type RegisterRegionRequest struct {
	DeployType        string    `json:"deploy_type,omitempty" binding:"required"`
	RegionName        string    `json:"region_name,omitempty" binding:"required"`
	LogicalRegionName string    `json:"logical_region_name,omitempty" binding:"required"`
	CloudProvider     string    `json:"cloud_provider,omitempty" binding:"required"`
	DisplayName       string    `json:"display_name,omitempty" binding:"required"`
	OpenedTenantIDs   *[]string `json:"opened_tenant_ids,omitempty"`
	RegionState       string    `json:"region_state,omitempty" binding:"required"`
	IsPublic          bool      `json:"is_public,omitempty"`
	DefaultBackupTime *string   `json:"default_backup_time,omitempty"`
	ServiceAddress    string    `json:"service_address,omitempty" binding:"required"`
	ServicePlan       string    `json:"service_plan,omitempty" binding:"required"`
	Reason            string    `json:"reason,omitempty"`
}

type RegisterRegionResponse struct {
	api.BaseResp `json:",inline"`

	InstanceID uint64 `json:"instance_id"`
}

type RegisterRegionProviderIdentityRequest struct {
	RegionLogicalName string `json:"region_logical_name" binding:"required"`
	Identity          string `json:"identity" binding:"required,max=255"`
	IsDefault         bool   `json:"is_default"`
}

type RegisterRegionProviderIdentityResponse struct {
	api.BaseResp `json:",inline"`

	RegionProviderIdentity *RegionProviderIdentity `json:"region_provider_identity"`
}

type UpdateRegionRequest struct {
	GetRegionRequest `json:",inline"`

	OpenedTenantIDs           []string                    `json:"opened_tenant_ids,omitempty"`
	RegionWhiteLists          []*RegionWhiteList          `json:"region_white_lists,omitempty"`
	DefaultProviderIdentities *[]*DefaultProviderIdentity `json:"default_provider_identities,omitempty"`
	RegionState               string                      `json:"region_state,omitempty"`
	IsPublic                  bool                        `json:"is_public,omitempty"`
	ServiceAddress            string                      `json:"service_address,omitempty"`
	Reason                    string                      `json:"reason,omitempty"`

	Changed string `json:"changed,omitempty"`
}

type UpdateRegionResponse struct {
	api.BaseResp `json:",inline"`

	InstanceID uint64 `json:"instance_id"`
}
