package o11y

type BaseRequest struct {
	Vendor string `header:"x-vendor" form:"vendor" json:"vendor"  binding:"required"`
	Region string `header:"x-region" form:"region" json:"region"  binding:"required"`
	OrgID  string `header:"x-org-id" form:"orgID"  json:"orgID" binding:"required"`
}

type BaseResponse struct {
	Code    int    `json:"code"`
	Message string `json:"message"`
}

type ClusterAlert struct {
	Status       string `json:"status"`
	RuleTemplate string `json:"ruleTemplate"`
}

type ClusterLog struct {
	Status        string `json:"status"`
	DataRetention int    `json:"dataRetention"`
}

type ClusterMetrics struct {
	Status        string `json:"status"`
	DataRetention int    `json:"dataRetention"`
	QueryEndpoint string `json:"queryEndpoint"`
}

type Cluster struct {
	ID                  string          `json:"id"`
	Vendor              string          `json:"vendor"`
	Region              string          `json:"region"`
	TenantID            string          `json:"tenantID"`
	ProjectID           string          `json:"projectID"`
	ApplicationID       string          `json:"applicationID"`
	RuleTemplateID      string          `json:"ruleTemplateID"`
	Tags                []string        `json:"tags"`
	ShareMode           string          `json:"share_mode"`
	Note                string          `json:"note"`
	Status              string          `json:"status"`
	EndpointServiceName string          `json:"endpointServiceName"`
	DNSName             string          `json:"dnsName"`
	AgentRoleARN        string          `json:"agentRoleARN"`
	Metrics             *ClusterMetrics `json:"metrics"`
	Logs                *ClusterLog     `json:"logs"`
	Alert               *ClusterAlert   `json:"alert"`
}

type CreateClusterRequest struct {
	BaseRequest `json:",inline"`

	ProjectID       string   `json:"projectID"`
	ApplicationID   string   `json:"applicationID"`
	Note            string   `json:"note,omitempty"`
	Tags            []string `json:"tags,omitempty"`
	AgentAccessARN  string   `json:"agentAccessARN"`
	AgentManagerARN string   `json:"agentManagerARN"`
	RuleTemplateID  string   `json:"ruleTemplateID,omitempty"`
}

type CreateClusterResponse struct {
	BaseResponse `json:",inline"`

	Data Cluster `json:"data"`
}

type DeleteClusterRequest struct {
	BaseRequest `json:",inline"`
}

type DeleteClusterResponse struct {
	BaseResponse `json:",inline"`

	Data Cluster `json:"data"`
}

type ListClustersRequest struct {
	BaseRequest `json:",inline"`

	ProjectID     *string `form:"project_id"`
	ApplicationID *string `form:"application_id"`
}

func (r ListClustersRequest) Inject(param map[string]string) {
	if r.ProjectID != nil {
		param["projectID"] = *r.ProjectID
	}
	if r.ApplicationID != nil {
		param["applicationID"] = *r.ApplicationID
	}
}

type ListClustersResponseData struct {
	Clusters []Cluster `json:"clusters"`
}

type ListClustersResponse struct {
	BaseResponse `json:",inline"`

	Data ListClustersResponseData `json:"data"`
}

type GetClusterRequest struct {
	BaseRequest `json:",inline"`
}

type GetClusterResponse struct {
	BaseResponse `json:",inline"`

	Data Cluster `json:"data"`
}
