#!/bin/false Tohle je knihovna, nemá se spouštět, ale načítat pomocí source(1) nebo '.'

PYTHON="${PYTHON:-python3}"
VENV="${VENV:-${PYTHON} -m venv}"
VENV_PATH="${VENV_PATH:-env}"
BRANCH="${BRANCH:-master}"

REPO="${REPO:-git@gitea.ks.matfyz.cz:mam/mamweb.git}"
UPSTREAM_REMOTE='origin'
GIMLI='gimli.ms.mff.cuni.cz'
GIMLI_LOGIN="mam-web@$GIMLI"
# Skutečné cesty, jak je vrátí `realpath`
PRODWEB="/aux/akce/mam/www/mamweb-prod"
TESTWEB="/aux/akce/mam/www/mamweb-test"

function die {
	echo "$@" >&2
	exit 1
}

trap 'echo Něco se nepovedlo :-/' ERR

# Vždycky chceme zajistit, že běžíme z rootu repozitáře
# TODO: chceme? Nechceme naopak umět to spouštět odkudkoliv, aspoň u většiny targetů?
test -e '.git' || die "Make skript spuštěn ve špatné složce, spusť ho z kořenového adresáře repozitáře."

function ensure_venv {
	test -f "$VENV_PATH/bin/activate" || $VENV "$VENV_PATH"
	. "$VENV_PATH/bin/activate"
	# To ale není všechno Horste – ten venv nemusí fungovat, chceme to ověřit a případně spadnout.
	local SPRAVNA_CESTA="$(readlink -f "$VENV_PATH/bin/python")"
	local SKUTECNA_CESTA="$(readlink -f "$(which python)")"
	test "$SPRAVNA_CESTA" == "$SKUTECNA_CESTA" || die "Venv asi nefunguje. Prosím smaž si ho a zkus to znovu."
	python -c 'print()' > /dev/null || die "Python ve venvu je rozbitý. Prosím smaž venv a zkus to znovu."
}

function ensure_web_installed {
	ensure_venv
	python -c 'import django; print(django.__version__)' > /dev/null && return
	echo >&2 "POZOR: Web nevypadá nainstalovaně, instaluji."
	make/install_web
}

function gimli_only {
	# Rovnou zkontrolujeme i uživatele
	if test "$HOSTNAME" != gimli -o "$USER" != mam-web
	then
		echo "Tento příkaz se má spouštět na gimlim, chceš pokračovat? Pokud ne, sestřel tento skript."
		read
	fi
}

function only_in_directory {
	local DIR="$1"
	local CURRENT="$(readlink -f .)"
	if test "$CURRENT" != "$DIR"
	then
		echo "Tento příkaz se má spouštět ve složce $DIR, chceš pokračovat? Pokud ne, sestřel tento skript."
		read
	fi
}

function safe_checkout_branch {
	if test "$#" -ne 1
	then
		echo >&2 "Použití: $0 <branch>"
		return 1
	fi

	local BRANCH="$1"
	local SCRIPT="$0"

	git fetch --all
	local UPSTREAM_BRANCH
	if git rev-parse "$BRANCH@{u}" >/dev/null 2>/dev/null
	then
		UPSTREAM_BRANCH="$BRANCH@{u}" # Stačí symbolicky.
	else
		# Tohle je jediná možná záchrana.
		UPSTREAM_BRANCH="$UPSTREAM_REMOTE/$BRANCH"
	fi
	git rev-parse "$UPSTREAM_BRANCH" || die "Vzdálená větev $UPSTREAM_BRANCH neexistuje?"

	# Od teď si musíme dát pozor, abychom nezměnili kód, který právě běží.
	# Zkontrolujeme, že se nemění tahle knihovna a skript, který běží.
	# `git rev-parse` dává SHA-1 hashe objektů, vizte manuálovou stránku pro pochopení.
	# Pozor: tohle porovnává jen verze commitnuté do gitu. Lokální změny udělají něco náhodného…
	if test "$(git rev-parse @:make/lib.sh)" != "$(git rev-parse "$UPSTREAM_BRANCH":make/lib.sh)"
	then
		echo >&2 "Změna v make/lib.sh, prosím pullni manuálně"
		exit 1
	fi
	if test "$(git rev-parse @:"$SCRIPT")" != "$(git rev-parse "$UPSTREAM_BRANCH":"$SCRIPT")"
	then
		echo >&2 "Změna v $SCRIPT, prosím pullni manuálně"
		exit 1
	fi
	git checkout "$BRANCH"
	git pull
	git clean -f
}

function install_everything {
	# Skoro celé nasazení webu je stejné pro testweb i pro produkci, tak je to tady dohromady
	gimli_only
	ensure_venv
	make/install
	./manage.py migrate
	./manage.py collectstatic --noinput
	setfacl -R -m default:u:www-data:rX media static
	setfacl -R -m u:www-data:rX media static
	chown -R :mam . || true
	chmod -R g+rX,go-w . || true
}