#!/bin/sh

. /lib/partman/lib/base.sh
. /lib/partman/lib/resize.sh

dev=${1%//*}
oldid=${1#*//}

cd $dev

bestsize=0
bestid=

check_virtual

resize_range_failed=
if [ "$virtual" = no ] && [ -f $oldid/detected_filesystem ]; then
	case "$(cat $oldid/detected_filesystem)" in
	    ntfs)
		get_ntfs_resize_range || resize_range_failed=1
		;;
	    ext2|ext3|ext4)
		get_ext2_resize_range || resize_range_failed=1
		;;
	    *)
		get_resize_range
		;;
	esac
else
	get_resize_range
fi

if [ "$resize_range_failed" ] || [ -z "$maxsize" ]; then
	db_input critical partman-partitioning/impossible_resize || true
	if db_go; then
		exit 1
	else
		exit 99
	fi
fi

# Limit to sizes that will allow enough room for the installation.
maxsize="$(expr "$maxsize" - \( 2 \* 1024 + 510 \) \* 1024 \* 1024)"
if ! longint_le $minsize $maxsize; then
	db_input critical partman-partitioning/impossible_resize || true
	if db_go; then
		exit 1
	else
		exit 99
	fi
fi

human_resize_range
prefsize="$(expr \( "$minsize" + "$maxsize" \) / 2)"
# ask_for_size will set the default size to $hcursize.
hcursize=$(longint2human $prefsize)

if [ "$virtual" = no ]; then
	db_set partman-partitioning/confirm_resize 'false'
	db_input critical partman-partitioning/confirm_resize || true
	db_go || exit 99
	db_get partman-partitioning/confirm_resize
	[ "$RET" = 'true' ] || exit 99
fi

# perform_resizing might exit 100, so use a subshell to catch that
if (ask_for_size); then
	cd $dev
	open_dialog PARTITIONS
	while :; do
		read_line num id size type fs path name
		[ "$id" ] || break
		if [ "$fs" = free ] && longint_le $bestsize $size; then
			bestsize=$size
			bestid=$id
		fi
	done
	close_dialog
	if ! longint_le "$(expr \( 2 \* 1024 + 200 \) \* 1024 \* 1024)" $bestsize; then
		db_input critical partman-auto/resize_insufficient_space
		db_go || true
		exit 1
	fi

	autopartition $dev $bestid || exit $?

	# accept the autopartitioning
	exit 100
else
	code=$?
	if [ "$code" -eq 1 ]; then
		exit 99 # backup
	else
		# TODO: error?
		exit 0
	fi
fi
