package message

import "time"

// VM Cluster Request/Response structures based on design document

// CreateVMClusterReq represents the request to deploy a new VM cluster
type CreateVMClusterReq struct {
	Name   string                 `json:"name" validate:"required,max=64"`
	Values map[string]interface{} `json:"values" validate:"required"`
}

// CreateVMClusterResp represents the response after creating a VM cluster
type CreateVMClusterResp struct {
	Name            string                 `json:"name"`
	ID              string                 `json:"id"`
	Status          string                 `json:"status"`
	Endpoints       map[string]string      `json:"endpoints"`
	Values          map[string]interface{} `json:"values"`
	HelmReleaseInfo HelmReleaseInfo        `json:"helm_release_info"`
	CreateTime      time.Time              `json:"create_time"`
}

// GetVMClusterReq represents the request to get a specific VM cluster
type GetVMClusterReq struct {
	ID string `json:"id" validate:"required"`
}

// GetVMClusterResp represents the response with VM cluster details
type GetVMClusterResp struct {
	Name            string                 `json:"name"`
	ID              string                 `json:"id"`
	Status          string                 `json:"status"`
	Endpoints       map[string]string      `json:"endpoints"`
	Values          map[string]interface{} `json:"values"`
	HelmReleaseInfo HelmReleaseInfo        `json:"helm_release_info"`
	CreateTime      time.Time              `json:"create_time"`
	UpdateTime      time.Time              `json:"update_time"`
}

// ListVMClustersReq represents the request to list VM clusters
type ListVMClustersReq struct {
	PageRequest
}

// ListVMClustersResp represents the response with a list of VM clusters
type ListVMClustersResp struct {
	VMClusters []VMClusterSummary `json:"vmclusters"`
	ContinueResponse
}

// VMClusterSummary represents a summary of VM cluster info for listing
type VMClusterSummary struct {
	Name       string            `json:"name"`
	ID         string            `json:"id"`
	Status     string            `json:"status"`
	Endpoints  map[string]string `json:"endpoints"`
	CreateTime time.Time         `json:"create_time"`
	UpdateTime time.Time         `json:"update_time"`
}

// UpdateVMClusterReq represents the request to update an existing VM cluster
type UpdateVMClusterReq struct {
	ID     string                 `json:"id" validate:"required"`
	Values map[string]interface{} `json:"values" validate:"required"`
}

// UpdateVMClusterResp represents the response after updating a VM cluster
type UpdateVMClusterResp struct {
	Name            string                 `json:"name"`
	ID              string                 `json:"id"`
	Status          string                 `json:"status"`
	Endpoints       map[string]string      `json:"endpoints"`
	Values          map[string]interface{} `json:"values"`
	HelmReleaseInfo HelmReleaseInfo        `json:"helm_release_info"`
	UpdateTime      time.Time              `json:"update_time"`
}

// DeleteVMClusterReq represents the request to delete a VM cluster
type DeleteVMClusterReq struct {
	ID string `json:"id" validate:"required"`
}

// DeleteVMClusterResp represents the response after deleting a VM cluster
type DeleteVMClusterResp struct {
	Message string `json:"message"`
}

// HelmReleaseInfo contains information about the underlying Helm release
type HelmReleaseInfo struct {
	ReleaseName      string `json:"release_name"`
	ReleaseNamespace string `json:"release_namespace"`
	Chart            string `json:"chart"`
	Version          string `json:"version"`
}

// VM Cluster status constants
const (
	VMClusterStatusPending   = "PENDING"
	VMClusterStatusDeploying = "DEPLOYING"
	VMClusterStatusRunning   = "RUNNING"
	VMClusterStatusUpdating  = "UPDATING"
	VMClusterStatusFailed    = "FAILED"
	VMClusterStatusDeleting  = "DELETING"
)
