require "kubernetes"

module ContainerMom
  # Source credentials structure
  struct SourceCredentials
    include Kubernetes::Serializable

    field username : String
    field password : String
  end

  # Source configuration structure
  struct SourceConfig
    include Kubernetes::Serializable

    field type : String
    field url : String
    field credentials : SourceCredentials?
  end

  # Define the ContainerDeployment spec structure
  struct ContainerDeploymentSpec
    include Kubernetes::Serializable

    field regions : Array(String)
    field resources : Hash(String, String)?
    field domain : Hash(String, String)?
    field billing : Hash(String, String)?
    field source : SourceConfig
  end
end

# Define standard Kubernetes resources
Kubernetes.define_resource "secrets",
  group: "",
  type: Kubernetes::Resource(JSON::Any),
  kind: "Secret",
  version: "v1"

Kubernetes.define_resource "configmaps",
  group: "",
  type: Kubernetes::Resource(JSON::Any),
  kind: "ConfigMap",
  version: "v1"

Kubernetes.define_resource "jobs",
  group: "batch",
  type: Kubernetes::Resource(JSON::Any),
  kind: "Job",
  version: "v1"

Kubernetes.define_resource "deployments",
  group: "apps",
  type: Kubernetes::Resource(JSON::Any),
  kind: "Deployment",
  version: "v1"

Kubernetes.define_resource "services",
  group: "",
  type: Kubernetes::Resource(JSON::Any),
  kind: "Service",
  version: "v1"

Kubernetes.define_resource "ingresses",
  group: "networking.k8s.io",
  type: Kubernetes::Resource(JSON::Any),
  kind: "Ingress",
  version: "v1"

# Define our custom ContainerDeployment resource
Kubernetes.define_resource "containerdeployments",
  group: "app.container.mom",
  type: Kubernetes::Resource(ContainerMom::ContainerDeploymentSpec),
  kind: "ContainerDeployment",
  version: "v1alpha1"
