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

  # 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"
end
