package entity

import (
	"time"
)

// Cluster Kubernetes 集群领域实体
type Cluster struct {
	ID               string
	WorkspaceID      string
	OwnerID          string
	Visibility       string
	Name             string
	Host             string // Kubernetes API Server URL
	CAData           string // Base64 encoded CA certificate
	CertData         string // Base64 encoded client certificate
	KeyData          string // Base64 encoded client key
	Token            string // Bearer token (alternative to cert auth)
	Description      string
	DefaultNamespace string
	CreatedAt        time.Time
	UpdatedAt        time.Time
}

// NewCluster 创建新集群
func NewCluster(name, host string) *Cluster {
	now := time.Now()
	return &Cluster{
		Name:       name,
		Host:       host,
		Visibility: "private",
		CreatedAt:  now,
		UpdatedAt:  now,
	}
}

// Update 更新集群信息
func (c *Cluster) Update(name, host, description string) {
	if name != "" {
		c.Name = name
	}
	if host != "" {
		c.Host = host
	}
	c.Description = description
	c.UpdatedAt = time.Now()
}

// SetCertAuth 设置证书认证
func (c *Cluster) SetCertAuth(caData, certData, keyData string) {
	c.CAData = caData
	c.CertData = certData
	c.KeyData = keyData
	c.UpdatedAt = time.Now()
}

// SetTokenAuth 设置 Token 认证
func (c *Cluster) SetTokenAuth(token string) {
	c.Token = token
	c.UpdatedAt = time.Now()
}

// Validate 验证集群配置
func (c *Cluster) Validate() error {
	if c.Name == "" {
		return ErrInvalidClusterName
	}
	if c.Host == "" {
		return ErrInvalidClusterHost
	}
	if c.Visibility == "" {
		c.Visibility = "private"
	}
	// 必须有认证方式：证书或 Token
	if (c.CertData == "" || c.KeyData == "") && c.Token == "" {
		return ErrInvalidClusterAuth
	}
	return nil
}

// GetKubeConfig 生成 kubeconfig 内容
func (c *Cluster) GetKubeConfig() string {
	// 如果 CAData 已经包含完整的 kubeconfig，直接返回
	if len(c.CAData) > 100 && (c.CAData[:11] == "apiVersion:" || c.CAData[:5] == "kind:") {
		return c.CAData
	}

	// 否则从证书数据生成 kubeconfig
	kubeconfig := `apiVersion: v1
kind: Config
clusters:
- cluster:
    certificate-authority-data: ` + c.CAData + `
    server: ` + c.Host + `
  name: ` + c.Name + `
contexts:
- context:
    cluster: ` + c.Name + `
    user: ` + c.Name + `
  name: ` + c.Name + `
current-context: ` + c.Name + `
users:
- name: ` + c.Name + `
  user:
    client-certificate-data: ` + c.CertData + `
    client-key-data: ` + c.KeyData + `
`

	return kubeconfig
}
