// Terraform operations
package terraform

import (
	"encoding/json"

	"alpha.dagger.io/dagger"
	"alpha.dagger.io/dagger/op"
)

// Terraform configuration
#Configuration: {

	// Terraform version
	version: string | *"latest" @dagger(input)

	// Source configuration
	source: dagger.#Artifact @dagger(input)

	tfvars?: {
		...
	}

	// Environment variables
	env: {
		[string]: string @dagger(input)
	}

	state: #up: [
		op.#FetchContainer & {
			ref: "hashicorp/terraform:\(version)"
		},

		op.#Copy & {
			from: source
			dest: "/src"
		},

		if tfvars != _|_ {
			op.#WriteFile & {
				dest:    "/src/terraform.tfvars.json"
				content: json.Marshal(tfvars)
			}
		},

		op.#Exec & {
			args: ["terraform", "init"]
			dir:   "/src"
			"env": env
		},

		op.#Exec & {
			args: ["terraform", "apply", "-auto-approve"]
			always: true
			dir:    "/src"
			"env":  env
		},
	]

	output: {
		#up: [
			op.#Load & {from: state},
			op.#Exec & {
				args: ["sh", "-c", "terraform output -json > /output.json"]
				dir:   "/src"
				"env": env
			},
			op.#Export & {
				source: "/output.json"
				format: "json"
			},
		]
		...
	} @dagger(output)
}