#!/usr/bin/env bash
# Contains sources from https://github.com/debuerreotype/debuerreotype
set -Eeuo pipefail

thisDir="$(dirname "$(readlink -f "$BASH_SOURCE")")"
source "$thisDir/.constants.sh" \
	--flags 'ports' \
	--flags 'deb-src' \
	--flags 'debian-mirror' \
	--flags 'local-pkgs:' \
	-- \
	'[--deb-src] [--ports] <target-dir> <suite> <version>' \
	'rootfs stretch 520.0'

eval "$dgetopt"
gardenlinuxOnly=1
ports=
debianMirror=0
debSrc=
local_pkgs=

# Update all param flags
while true; do
	flag="$1"; shift
	dgetopt-case "$flag"
	case "$flag" in
		--gardenlinux-only)	gardenlinuxOnly=1 ;;
		--ports) 		ports=1 ;;
		--debian-mirror) 	debianMirror=1 ;;
		--deb-src)		debSrc=1 ;;
		--local-pkgs)		local_pkgs="$1"; shift ;;
		--) break ;;
		*) eusage "unknown flag '$flag'" ;;
	esac
done

targetDir="${1:-}";	shift || eusage 'missing target-dir'
suite="${1:-}";		shift || eusage 'missing suite'
version="${1:-}";	shift || eusage 'missing version'

[ -n "$targetDir" ]

epoch="$(< "$targetDir/garden-epoch")"


# Garden Linux Repository configuration
gardenlinuxMirror='https://repo.gardenlinux.io/gardenlinux'
gardenlinuxMirrorKey='/etc/apt/trusted.gpg.d/gardenlinux.asc'

if [ -z "$ports" ]; then
	standardMirror='https://cdn-aws.deb.debian.org/debian'
else
	standardMirror='https://cdn-aws.deb.debian.org/debian-ports'
fi

securityMirror='https://security.debian.org/debian-security'

comp='main'
arch="$("$thisDir/.dpkg-arch.sh" "$targetDir")"

deb() {
	local suite="$1"; shift
	local comp="$1"; shift
	local target="$1"; shift # "standard" or "security"

	case "$target" in
		standard) mirror="$standardMirror" ;;
		security) mirror="$securityMirror" ;;
		gardenlinux) mirror="[arch=$arch signed-by=$gardenlinuxMirrorKey] $gardenlinuxMirror" ;;
		*) echo >&2 "error: unknown 'deb' line target: '$target'"; exit 1 ;;
	esac

	echo "deb $mirror $suite $comp"
	if [ -n "$debSrc" ]; then
		echo "deb-src $mirror $suite $comp"
	fi
}

# https://github.com/tianon/go-aptsources/blob/e066ed9cd8cd9eef7198765bd00ec99679e6d0be/target.go#L16-L58
{
	# Add local packages
	if [ -n "$local_pkgs" ]; then
		echo "deb [trusted=yes] file:$local_pkgs ./"
		if [ -n "$debSrc" ]; then
			echo "deb-src [trusted=yes] file:$local_pkgs ./"
		fi
	fi

        # Add Debian native mirror
        if [ $debianMirror -eq 1 ]; then
                echo "deb https://cdn-aws.deb.debian.org/debian testing main"
        fi


	printf "# Gardenlinux Repo\n"
	deb "$version" main gardenlinux

	if [[ -z "$gardenlinuxOnly" ]]; then
	        printf "\n# Debian Repo for backup\n"
		case "$suite" in
			sid|unstable|testing)
				deb "$suite" "$comp" standard
				;;

			*)
				# https://salsa.debian.org/installer-team/apt-setup/tree/d7a642fb5fc76e4f0b684db53984bdb9123f8360/generators
				deb "$suite"          "$comp" standard # "50mirror"
				deb "$suite-security" "$comp" security # "91security"
				deb "$suite-updates"  "$comp" standard # "92updates"
				# https://wiki.debian.org/SourcesList#Example_sources.list

				if [ "$suite" = 'squeeze' ]; then
					# https://wiki.debian.org/DebianSqueeze#FAQ
					deb "$suite-lts" "$comp" standard
				fi
				;;
		esac
	fi
} > "$targetDir/etc/apt/sources.list"
# Adjust file permission for sources file
chmod 0644 "$targetDir/etc/apt/sources.list"


## Adjust repository priorities
## Highest priority (600): Local packages
## Regular priority (500/550): Garden Linux repository (550 when Debian Mirror is activated)
## Lowest priority (500): Additional repositories like native Debian repository

# Adjust repository priority for local packages
if [ -n "$local_pkgs" ]; then
	printf 'Package: *\nPin: origin ""\nPin-Priority: 600\n' > "$targetDir/etc/apt/preferences.d/local_pkgs"
else
	rm -f "$targetDir/etc/apt/preferences.d/local_pkgs"
fi

# Adjust repository priority for Garden Linux
if [ $debianMirror -eq 1 ]; then
	printf 'Package: *\nPin: origin repo.gardenlinux.io\nPin-Priority: 550\n' > "$targetDir/etc/apt/preferences.d/gardenlinux"
fi


# Validate sources.list file
if [ ! -s "$targetDir/etc/apt/sources.list" ]; then
	echo >&2 "error: sources.list ended up empty -- something is definitely wrong"
	exit 1
fi
