package v1alpha1

import (
	"fmt"

	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

type DataPlanePhase string

const (
	DataPlanePhaseCreating DataPlanePhase = "Creating"
	DataPlanePhaseActive   DataPlanePhase = "Active"
	DataPlanePhaseFailed   DataPlanePhase = "Failed"
	DataPlanePhaseDeleting DataPlanePhase = "Deleting"
)

type DataPlaneOwnershipMode string

const (
	DataPlaneOwnershipModeSinglePool DataPlaneOwnershipMode = "SinglePoolOwnership"
	DataPlaneOwnershipModeMultiPool  DataPlaneOwnershipMode = "MultiPoolOwnership"
)

func EffectiveDataPlaneOwnershipMode(mode DataPlaneOwnershipMode) (DataPlaneOwnershipMode, error) {
	switch mode {
	case "", DataPlaneOwnershipModeSinglePool:
		return DataPlaneOwnershipModeSinglePool, nil
	case DataPlaneOwnershipModeMultiPool:
		return DataPlaneOwnershipModeMultiPool, nil
	default:
		return "", fmt.Errorf("unknown stored dataplane ownership mode %q", mode)
	}
}

func ValidateDataPlaneOwnershipModeUpdate(oldMode, newMode DataPlaneOwnershipMode) error {
	if oldMode != newMode {
		return fmt.Errorf("dataplane ownership mode is immutable: %q cannot change to %q", oldMode, newMode)
	}
	return nil
}

// +kubebuilder:object:root=true
// +kubebuilder:resource:categories=regionserver
// +kubebuilder:subresource:status
// +kubebuilder:printcolumn:name="ACCOUNTID",type="string",JSONPath=".spec.accountRef.accountId"
// +kubebuilder:printcolumn:name="PHASE",type="string",JSONPath=".status.phase"
// +kubebuilder:printcolumn:name="AGE",type="date",JSONPath=".metadata.creationTimestamp"
// DataPlane is the Schema for the dataplanes API
type DataPlane struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   DataPlaneSpec   `json:"spec,omitempty"`
	Status DataPlaneStatus `json:"status,omitempty"`
}

// +kubebuilder:validation:XValidation:rule="has(self.ownershipMode) == has(oldSelf.ownershipMode) && (!has(self.ownershipMode) || self.ownershipMode == oldSelf.ownershipMode)",message="ownershipMode is immutable"
type DataPlaneSpec struct {
	CloudTags         map[string]string `json:"cloudTags,omitempty"`
	VpcCidr           string            `json:"vpcCidr,omitempty"`
	ServiceCidr       string            `json:"serviceCidr,omitempty"`
	AvailabilityZones []string          `json:"availabilityZones,omitempty"`
	NodeZones         []string          `json:"nodeZones,omitempty"`
	PCA               *PCAConfig        `json:"pca,omitempty"`
	AccountRef        AccountReference  `json:"accountRef,omitempty"`
	// +optional
	// +kubebuilder:validation:Enum=SinglePoolOwnership;MultiPoolOwnership
	OwnershipMode DataPlaneOwnershipMode `json:"ownershipMode,omitempty"`
}

type DataPlaneStatus struct {
	// +optional
	Phase DataPlanePhase `json:"phase,omitempty"`
	// +optional
	Reason string `json:"reason,omitempty"`
	// +optional
	Vpc *Reference `json:"vpc,omitempty"`
	// +optional
	Internet *Reference `json:"internet,omitempty"`
	// +optional
	AppBox *Reference `json:"appBox,omitempty"`
}

// +kubebuilder:object:root=true
type DataPlaneList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`
	Items           []DataPlane `json:"items"`
}

func init() {
	SchemeBuilder.Register(&DataPlane{}, &DataPlaneList{})
}
