package v1alpha1

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

type VPCPeeringPhase string

const (
	VPCPeeringPhasePending  VPCPeeringPhase = "Pending"
	VPCPeeringPhaseActive   VPCPeeringPhase = "Active"
	VPCPeeringPhaseFailed   VPCPeeringPhase = "Failed"
	VPCPeeringPhaseDeleting VPCPeeringPhase = "Deleting"
)

const (
	AnnotationKeySourceVPCID     = "cloud.pingcap.com/sourceVpcId"
	AnnotationKeySourceVPCCIDR   = "cloud.pingcap.com/sourceVpcCIDR"
	AnnotationKeySourceAccountID = "cloud.pingcap.com/sourceAccountId"
)

const (
	FinalizerVPCPeering = "vpcpeering.dedicated.regionalserver.tidbcloud.com/finalizer"
)

type AWS struct {
	// +kubebuilder:validation:Required
	AccountID string `json:"accountId"`
	// +kubebuilder:validation:Required
	VpcID string `json:"vpcId"`
	// +kubebuilder:validation:Required
	PeerCIDR string `json:"peerCIDR"`
	// +kubebuilder:validation:Required
	Region string `json:"peerRegion"`
}

type AliCloud struct {
	// +kubebuilder:validation:Required
	UID string `json:"uid"`
	// +kubebuilder:validation:Required
	VpcID string `json:"vpcId"`
	// +kubebuilder:validation:Required
	PeerCIDR string `json:"peerCIDR"`
	// +kubebuilder:validation:Required
	Region string `json:"peerRegion"`
}

type Target struct {
	AWS      *AWS      `json:"aws,omitempty"`
	AliCloud *AliCloud `json:"alicloud,omitempty"`
}

type VPCPeeringSpec struct {
	// +kubebuilder:validation:Required
	DataPlane Reference `json:"dataPlane"`
	// +kubebuilder:validation:Required
	Provider string `json:"provider"`
	// +kubebuilder:validation:Required
	Region string `json:"region"`
	// +optional
	Tags map[string]string `json:"tags,omitempty"`
	// +kubebuilder:validation:Required
	Target Target `json:"target"`
}

// +kubebuilder:object:root=true
// +kubebuilder:resource:categories=regionserver
// +kubebuilder:subresource:status
// +kubebuilder:printcolumn:name="EXTERNAL-NAME",type="string",JSONPath=".status.externalName"
// +kubebuilder:printcolumn:name="PHASE",type="string",JSONPath=".status.phase"
// +kubebuilder:printcolumn:name="AGE",type="date",JSONPath=".metadata.creationTimestamp"

type VPCPeering struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   VPCPeeringSpec   `json:"spec,omitempty"`
	Status VPCPeeringStatus `json:"status,omitempty"`
}

type VPCPeeringStatus struct {
	// Common fields (all clouds)
	// +optional
	Phase VPCPeeringPhase `json:"phase,omitempty"`
	// +optional
	Reason string `json:"reason,omitempty"`
	// the resource name in provider, same as crossplane external name
	// +optional
	ExternalName string `json:"externalName,omitempty"`
	// +optional
	CrossplaneResourceName string `json:"crossplaneResourceName,omitempty"`

	// Cloud-specific status fields
	// +optional
	AWS *AWSVPCPeeringStatus `json:"aws,omitempty"`
	// +optional
	AliCloud *AliCloudVPCPeeringStatus `json:"alicloud,omitempty"`
}

// AWSVPCPeeringStatus contains AWS-specific status for VPC Peering.
// AWS requires explicit route table entries for VPC peering traffic.
type AWSVPCPeeringStatus struct {
	// Routes tracks the Route CRs created for this VPC Peering connection.
	// Each route represents an entry in a node route table pointing to the peering connection.
	// +optional
	Routes []VPCPeeringRoute `json:"routes,omitempty"`
}

type AliCloudVPCPeeringStatus struct {
	Routes []VPCPeeringRoute `json:"routes,omitempty"`
}

// VPCPeeringRoute represents a route entry for VPC Peering.
type VPCPeeringRoute struct {
	// Name is the Route CR name
	Name string `json:"name,omitempty"`
	// RouteTableName is the RouteTable CR name this route belongs to
	RouteTableName string `json:"routeTableName,omitempty"`
	// State is the route state (active, blackhole, etc.)
	State string `json:"state,omitempty"`
}

// +kubebuilder:object:root=true

type VPCPeeringList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`
	Items           []VPCPeering `json:"items"`
}

func init() {
	SchemeBuilder.Register(&VPCPeering{}, &VPCPeeringList{})
}
