#!/bin/sh

. /lib/partman/definitions.sh
. /lib/partman/recipes.sh
. /lib/partman/lvm_tools.sh

VG_name=$1
recipe=$2

decode_recipe $recipe lvm

scheme=$(echo "$scheme" | grep "lvmok")

partstep=$(echo "$scheme" | wc -l)
partstep=$(expr $partstep + 3)

db_progress START 0 $partstep partman-auto/text/automatically_partition
db_progress INFO partman-auto/progress/info

db_progress STEP 1

# expand_scheme can't cope with decimal and lvm overhead.
# lvm overhead gets calculated properly only using kbytes.
# Switch to that. The worst scenario is that the last partition will be one PE smaller,
# but in the big numbers it's nothing (4MB).
free_size=$(vgs -o vg_free --units k --noheading --nosuffix $VG_name | sed -e 's/\..*//g')

newscheme=''
foreach_partition '
	newmin="${1}000"
	newmed="${2}000"
	if [ "$3" != "1000000000" ]; then
		newmax="${3}000"
	else
		newmax="$3"
	fi
	shift; shift; shift
	newscheme="$newscheme${NL}$newmin $newmed $newmax $*"
'

scheme="$newscheme"

db_progress STEP 1

expand_scheme

db_progress STEP 1

name_number=1
foreach_partition '
	if echo $* | grep -q "mountpoint{"; then
		lvname=$(echo $* | sed \
			-e "s/.*mountpoint{  *\([^ }]*\) *}.*/\1/g" \
			-e "s!//!/!g" \
			-e '\''s!/$!!g'\'' \
			-e "s/_/__/g" \
			-e "s/+/_+/g" \
			-e "s/-/_dash/g" \
			-e "s/ /_space/g" \
			-e '\''s!^/root$!_root!g'\'' \
			-e '\''s!^$!/root!g'\'' \
			-e "s!^/!!" \
			-e "s!/!+!g"
		)
	elif echo $* | grep -q "method{"; then
		lvname=$(echo $* | sed \
			-e "s/.*method{  *\([^ }]*\) *}.*/\1/g")
		lvname="${lvname}_$name_number"
		name_number=$(($name_number + 1))
	else
		lvname=_$name_number
		name_number=$(($name_number + 1))
	fi

	if [ "$last" = "yes" ]; then
		lv_create $VG_name "$lvname" full || autopartitioning_failed
	else
		lv_create $VG_name "$lvname" $(($1/1024)) || autopartitioning_failed
	fi

	device=/dev/mapper/"$VG_name"-"$lvname"

	dirname=$(echo "$device" | sed "s:/:=:g")
	dev=$DEVICES/$dirname

	rm -rf $dev
	mkdir $dev || autopartitioning_failed
	printf "%s" "$device" >$dev/device
	printf "%s" "$4" >$dev/size
	printf "%s" "$VG_name - $lvname" >$dev/model
	
	cd $dev
	open_dialog OPEN "$(cat $dev/device)"
	read_line responce
	close_dialog
	if [ "$responce" = failed ]; then
		cd /
		rm -rf $dev
		autopartitioning_failed
	fi
	
	open_dialog NEW_LABEL loop
	close_dialog

	# find the free space
	open_dialog PARTITIONS
	free_space=""
	while { read_line num id size type fs path name; [ "$id" ]; }; do
		if [ "$fs" = free ]; then
			free_space=$id
			free_size=$size
		fi
	done
	close_dialog

	# create partition in the free space
	[ "$free_space" ] || autopartitioning_failed
	open_dialog NEW_PARTITION primary ext2 $free_space full $free_size
	read_line num id size type fs path name
	close_dialog
	
	shift; shift; shift; shift
	setup_partition $id $*
	db_progress STEP 1
'

db_progress STOP

stop_parted_server

restart_partman
