package mix

import (
	"dagger.io/dagger"

	"universe.dagger.io/docker"
)

#Get: #Run & {
	// Applies to all environments
	env: null
	cache: {
		build: null
		deps:  "locked"
	}
	container: command: {
		name: "sh"
		flags: "-c": "mix do deps.get"
	}
}

// Compile Elixir dependencies, including the app
#Compile: #Run & {
	cache: {
		build: "locked"
		deps:  "locked"
	}
	container: command: {
		name: "sh"
		flags: "-c": "mix do deps.compile, compile"
	}
}

// Run mix task with all necessary mounts so compiled artefacts get cached
// FIXME: add default image to hexpm/elixir:1.13.2-erlang-23.3.4.11-debian-bullseye-20210902
#Run: {
	app: {
		// Application name
		name: string

		// Application source code
		source: dagger.#FS
	}

	// Mix environment
	env: string | null

	// Configure mix caching
	// FIXME: simpler interface, eg. "ro" | "rw"
	cache: {
		// Dependencies cache
		deps: null | "locked"

		// Build cache
		build: null | "locked"
	}

	// Run mix in a docker container
	container: docker.#Run & {
		if env != null {
			"env": MIX_ENV: env
		}
		workdir: mounts.app.dest
		mounts: "app": {
			contents: app.source
			dest:     "/mix/app"
		}
		if cache.deps != null {
			mounts: deps: {
				contents: dagger.#CacheDir & {
					id:          "\(app.name)_deps"
					concurrency: cache.deps
				}
				dest: "\(mounts.app.dest)/deps"
			}
		}
		if cache.build != null {
			mounts: buildCache: {
				contents: dagger.#CacheDir & {
					id:          "\(app.name)_build_\(env)"
					concurrency: cache.build
				}
				dest: "\(mounts.app.dest)/_build/\(env)"
			}
		}
	}
}