package main

import (
	"encoding/yaml"

	"alpha.dagger.io/dagger"
	"alpha.dagger.io/docker"
	"alpha.dagger.io/kubernetes"
	"alpha.dagger.io/kubernetes/kustomize"
)

// input: source code repository, must contain a Dockerfile
// set with `dagger input dir repository . -e kube`
repository: dagger.#Artifact & dagger.#Input

// GCR registry to push images to
registry: string & dagger.#Input
tag:      "test-gcr"

// source of Kube config file. 
// set with `dagger input dir manifest ./k8s -e kube`
manifest: dagger.#Artifact & dagger.#Input

// Declarative name
todoApp: {
	// Build an image from the project repository
	image: docker.#Build & {
		source: repository
	}

	// Push the image to a remote registry
	remoteImage: docker.#Push & {
		target: "\(registry):\(tag)"
		source: image
		auth: {
			username: gcrCreds.username
			secret:   gcrCreds.secret
		}
	}

	// Update the image of the deployment to the deployed image
	kustomization: kustomize.#Kustomize & {
		source: manifest

		// Convert CUE to YAML.
		kustomization: yaml.Marshal({
			resources: ["deployment.yaml", "service.yaml"]

			images: [{
				name:    "public.ecr.aws/j7f8d3t2/todoapp"
				newName: remoteImage.ref
			}]
		})
	}

	// Value created for generic reference of `kubeconfig` in `todoapp.cue`
	kubeSrc: kubernetes.#Resources & {
		"kubeconfig": kubeconfig
		source:       kustomization
	}
}