#!/bin/sh

_klevel="klevel1"
_config="/etc/pacman.conf"
_pkgcache=""
_noinit1=""
# Dirs to copy have to be absolute
_cpdirlist="/root/.config"
_me=$(basename $0)

usage() {
	printf "\n\
This script installs packages for fresh OpenRC-based Arch Linux.\n\
It assumes presence of 'klevel#' files with lists of packages.\n\
Usage: ${_me} [--help] [--opt] [--config=<my-pacman.conf>] [--cache=<dir>] [--level[s]=<levels>] [--noinit1] <root> [extra-package1 [extra-package2 ...]]\n\
Optional --help: this message.\n\
Optional --opt: copy /opt from current root to target.\n\
Optional --config: set alternative config file.\n\
Optional --cache: use 'dir' as package cache instead of \${root}/var/cache/pacman/pkg.\n\
Optional 'level[s]' is either number starting from 1, or range '#,#'.\n\
In case of --levels, single number will correspond to range '1,#'.\n\n\
If --level[s] is omitted, level 1 is assumed.\n\
Optional --noinit1: skip initialization after level1 installation.\n\
Double dash \"--\" means end of argument list.\n\n\
Examples:\n\n\
Install level1, perform necessary initialization and than install level2:\n\
${_me} --levels=2 /mnt/newarch\n\n\
Install only level3 onto previosly installed level(s):\n\
${_me} --level=3 /mnt/newarch\n\n"
}

set_opt() {
	_cpdirlist="${_cpdirlist} /opt"
}

set_config() {
	_config="$@"
}

set_cache() {
	_pkgcache="$@"
}

set_noinit1() {
	_noinit1="YES"
}

set_startend() {
	local _l
	if [ $# -ne 2 ]; then
		echo "Incorrect argument of --level[s]."
		return 1
	fi
	_klevel=""
	for _l in $(seq $1 $2); do
		_klevel="${_klevel} klevel${_l}"
	done
}

set_level() {
	set_startend $1 $1
}

set_levels() {
	local _start
	local _end=$(echo $1 | sed 's/.*,//')
	[ "${_end}" == "$1" ] && _start=1 || _start=$(echo $1 | sed 's/,.*//')
	set_startend ${_start} ${_end}
}

process_arg() {
	case "$1" in
		"help")
			usage
			exit 0
			;;
		"opt")
			set_opt
			;;
		"config")
			set_config "$2"
			;;
		"cache")
			set_cache "$2"
			;;
		"level")
			set_level "$2"
			;;
		"levels")
			set_levels "$2"
			;;
		"noinit1")
			set_noinit1
			;;
		*)
			echo "Unknown parameter [$1][$2]!"
			echo "Try ${_me} --help"
			return 1
			;;
	esac
}

# Parse switches

while true; do
	if [ "x$(echo $1 | cut -c 1,2)" == "x--" ]; then
		_arg=$(echo $1 | cut -c 3-)
		if [ -z "${_arg}" ]; then
			shift
			break
		fi
		_key=$(echo ${_arg} | sed -e 's/=.*//')
		[ "${_arg}" == "${_key}" ] && _val="" || _val=$(echo ${_arg} | sed -e 's/.*=//')
		process_arg ${_key} "${_val}" || exit 1
		shift
	else
		break
	fi
done

if [ $# -lt 1 ]; then
	usage
	exit 1
fi

for _f in ${_klevel}; do
	if ! [ -r ${_f} ]; then
		echo "${_me}: unable to read list of packages \"${_f}\"."
		exit 1
	fi
done

_root=$1

if ! [ -d ${_root} ]; then
	echo "${_me}: root ${_root} should be directory."
	exit 1
fi

shift

# Dirs have to be absolute
_mkdirlist="/var/lib/pacman /var/cache/pacman/pkg"

after1() {
	printf "\
echo en_US.UTF-8 UTF-8 > /etc/locale.gen\n\
echo ru_RU.UTF-8 UTF-8 >> /etc/locale.gen\n\
locale | cat > /etc/locale.conf\n\
locale-gen\n\
mandb\n\
rm -rf /etc/pacman.d/gnupg\n\
rm -rf /root/.gnupg\n\
gpg --refresh-keys\n\
pacman-key --init\n\
pacman-key --populate\n\
pacman-key --refresh-keys\n\
rm \$0\n\
exit 0\n"
}

install_packages()
{
	[ -z "${_pkgcache}" ] && _pkgcache="${_root}/var/cache/pacman/pkg"
	pacman --config "${_config}" --root "${_root}" --cachedir "${_pkgcache}" \
		--needed \
		--assume-installed linux \
		--assume-installed linux-headers \
		--assume-installed polkit \
		--assume-installed systemd \
		--assume-installed systemd-sysvcompat \
		--assume-installed pulseaudio \
		-Syu $@ 2>&1 | tee -a log.${_me} || exit 1
}

[ -f log.${_me} ] && rm log.${_me}

while [ $(echo ${_klevel} | grep "klevel1" > /dev/null) ]; do
	_klevel=$(echo ${_klevel} | sed 's/klevel1 //')
	for _d in ${_mkdirlist}; do
		_rd=${_root}${_d}
		[ -d ${_rd} ] || mkdir -p ${_rd}
	done
	install_packages `cat klevel1`
	[ -z "${_noinit1}" ] || break
	[ -f ${_root}/etc/locale.gen ] && \
		mv ${_root}/etc/locale.gen ${_root}/etc/locale.gen.all
	cat /etc/resolv.conf > ${_root}/etc/resolv.conf
	cat ${_config} > ${_root}/etc/pacman.conf
	cat /etc/pacman.d/mirrorlist > ${_root}/etc/pacman.d/mirrorlist
	for _d in ${_cpdirlist}; do
		_rd=${_root}${_d}
		if [ -d ${_d} ]; then
			[ -d ${_rd} ] || mkdir -p ${_rd}
			cp -av ${_d}/* ${_rd} | tee -a log.${_me}
		fi
	done
	after1 > ${_root}/init-script
	chmod a+x ${_root}/init-script
	echo "===================================================================="
#	echo "Level1 installation completed; you are now in chroot'ed environment."
#	echo "At minimal, execute /init-script, than 'exit'." | tee -a log.${_me}
	echo "Level1 installation completed; executing /init-script in new root..."
	echo "===================================================================="
#	sleep 2
	echo
#	arch-chroot ${_root} /bin/bash
	arch-chroot ${_root} /init-script
	[ "${_klevel}" == "" ] && install_packages $@
	break
done

[ "${_klevel}" == "" ] || install_packages `cat ${_klevel}` $@
