package docs

import (
	"dagger.io/dagger"
	"dagger.io/dagger/core"

	"universe.dagger.io/alpine"
	"universe.dagger.io/bash"
	"universe.dagger.io/docker"
	"universe.dagger.io/docker/cli"
)

dagger.#Plan & {
	client: {
		// Locally, manual source of the .env or install https://direnv.net
		env: {
			GITHUB_SHA:                   string
			SSH_PRIVATE_KEY_DOCKER_SWARM: dagger.#Secret
		}
		filesystem: {
			"./": read: contents:              dagger.#FS
			"./merge.output": write: contents: actions.build.image.rootfs // Creates a build artifact for debug
		}
		network: "unix:///var/run/docker.sock": connect: dagger.#Socket // Docker daemon socket
	}

	actions: {
		params: image: {
			ref:      "registry.particubes.com/lua-docs"
			tag:      "latest"
			localTag: "test-particubes" // name of the image when being run locally
		}

		_dockerCLI: alpine.#Build & {
			packages: {
				bash: {}
				curl: {}
				"docker-cli": {}
				"openssh-client": {}
			}
		}

		#_verifyGithubSHA: bash.#Run & {
			input: _dockerCLI.output
			env: GITHUB_SHA: client.env.GITHUB_SHA
			always: true
			script: contents: #"""
				TRIMMED_URL="$(echo $URL | cut -d '/' -f 1)"
				curl --verbose --fail --connect-timeout 5 --location "$URL" >"$TRIMMED_URL.curl.out" 2>&1

				if ! grep "$GITHUB_SHA" "$TRIMMED_URL.curl.out"
				then
					echo "$GITHUB_SHA not present in the $TRIMMED_URL response:"
					cat "$TRIMMED_URL.curl.out"
					exit 1
				fi
				"""#
		}

		build: {
			luaDocs: docker.#Dockerfile & {
				source: client.filesystem."./lua-docs".read.contents
			}

			_addGithubSHA: core.#WriteFile & {
				input:    luaDocs.output.rootfs
				path:     "/www/github_sha.yml"
				contents: #"""
					keywords: ["particubes", "game", "mobile", "scripting", "cube", "voxel", "world", "docs"]
					title: "Github SHA"
					blocks:
					    - text: "\#(client.env.GITHUB_SHA)"
					"""#
			}
			image: docker.#Image & {
				rootfs: _addGithubSHA.output
				config: luaDocs.output.config
			}
		}

		clean: cli.#Run & {
			host:   client.network."unix:///var/run/docker.sock".connect
			always: true
			env: IMAGE_NAME: params.image.localTag
			command: {
				name: "sh"
				flags: "-c": #"""
					docker rm --force "$IMAGE_NAME"
					"""#
			}
		}

		test: {
			preLoad: clean

			load: cli.#Load & {
				image: build.image
				host:  client.network."unix:///var/run/docker.sock".connect
				tag:   params.image.localTag
				env: DEP: "\(preLoad.success)" // DEP created wth preLoad
			}

			run: cli.#Run & {
				host:   client.network."unix:///var/run/docker.sock".connect
				always: true
				env: {
					IMAGE_NAME: params.image.localTag
					PORTS:      "80:80"
					DEP:        "\(load.success)" // DEP created wth load
				}
				command: {
					name: "sh"
					flags: "-c": #"""
						docker run -d --rm --name "$IMAGE_NAME" -p "$PORTS" "$IMAGE_NAME"
						"""#
				}
			}

			verify: #_verifyGithubSHA & {
				env: {
					URL: "localhost/github_sha"
					DEP: "\(run.success)" // DEP created wth run
				}
			}

			postVerify: clean & {
				env: DEP: "\(verify.success)" // DEP created wth verify
			}
		}

		deploy: {
			publish: docker.#Push & {
				dest:  "\(params.image.ref):\(params.image.tag)"
				image: build.image
			}

			update: cli.#Run & {
				host:   "ssh://ubuntu@3.139.83.217"
				always: true
				ssh: key: client.env.SSH_PRIVATE_KEY_DOCKER_SWARM
				env: DEP: "\(publish.result)" // DEP created wth publish
				command: {
					name: "sh"
					flags: "-c": #"""
						docker service update --image registry.particubes.com/lua-docs:latest lua-docs
						"""#
				}
			}

			verify: #_verifyGithubSHA & {
				env: {
					URL: "https://docs.particubes.com/github_sha"
					DEP: "\(update.success)" // DEP created wth run
				}
			}
		}
	}
}