// Deploy to Netlify
// https://netlify.com
package netlify

import (
	"dagger.io/dagger"
	"universe.dagger.io/docker"

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

// Deploy a site to Netlify
#Deploy: {
	// Contents of the site
	contents: dagger.#FS

	// Name of the Netlify site
	// Example: "my-super-site"
	site: string

	// Netlify API token
	token: dagger.#Secret

	// Name of the Netlify team (optional)
	// Example: "acme-inc"
	// Default: use the Netlify account's default team
	team: string | *""

	// Domain at which the site should be available (optional)
	// If not set, Netlify will allocate one under netlify.app.
	// Example: "www.mysupersite.tld"
	domain: string | *null

	// Create the site if it doesn't exist
	create: *true | false

	// Execute `netlify deploy` in a container
	command: bash.#Run & {
		// Container image. `netlify` must be available in the execution path
		*{
			_buildDefaultImage: docker.#Build & {
				input: alpine.#Build & {
					bash: version: "=~5.1"
					jq: version:   "=~1.6"
					curl: {}
					yarn: version: "=~1.22"
				}
				steps: [{
					run: script: "yarn global add netlify-cli@3.38.10"
				}]
			}

			// No nested tasks, boo hoo hoo
			image: _buildDefaultImage.output
			env: CUSTOM_IMAGE: "0"
		} | {
			env: CUSTOM_IMAGE: "1"
		}

		script: _deployScript // see deploy.sh
		always: true
		env: {
			NETLIFY_SITE_NAME: site
			if (create) {
				NETLIFY_SITE_CREATE: "1"
			}
			if domain != null {
				NETLIFY_DOMAIN: domain
			}
			NETLIFY_ACCOUNT: team
		}
		workdir: "/src"
		mounts: {
			"Site contents": {
				dest:       "/src"
				"contents": contents
			}
			"Netlify token": {
				dest:     "/run/secrets/token"
				contents: token
			}
		}
		output: files: {
			"/netlify/url":       _
			"/netlify/deployUrl": _
			"/netlify/logsUrl":   _
		}
	}

	// URL of the deployed site
	url: command.output.files."/netlify/url".contents

	// URL of the latest deployment
	deployUrl: command.output.files."/netlify/deployUrl".contents

	// URL for logs of the latest deployment
	logsUrl: command.output.files."/netlify/logsUrl".contents
}