#!/usr/bin/perl

# Copyleft 2007 by Andreas Krumnow, andreas@krumnow.de
use POSIX; 

my $pages,$anz_blocks,$restSeiten, $blocksize, $min_bs, $lastBlockSize, $pg_bl, $ipb;

if (("" eq $ARGV[0]) || ("" eq $ARGV[1])
 || ($ARGV[0] < 1) || ($ARGV[1] < 1)){
	&helpme();
}

$pages      = $ARGV[0];
$blocksize  = $ARGV[1];
$min_bs = 0;
if ($ARGV[2] ne "") {
	$min_bs = $ARGV[2] - 1;
	if ($blocksize<$min_bs){ $min_bs=$blocksize; }
#	if ($min_bs<0){ $min_bs=0; }
}
$lastBlockSize=0;

my $bestDiff = $blocksize-$lastBlockSize;
my @tmpVal   = ($blocksize, $lastBlockSize);
# print "\n------------------------------------------------------------\n";
# Optimizing Blocksize ...
while($min_bs<$blocksize){
	$anz_blocks = floor($pages/($blocksize *4));
	$restSeiten = $pages - ($anz_blocks*$blocksize *4);
	if ($restSeiten > 0){
		$lastBlockSize = ceil($restSeiten/4);
		my $curDiff = $blocksize-$lastBlockSize;
		if ($curDiff<$bestDiff){
			$bestDiff = $curDiff;
			@tmpVal = ( $blocksize, $lastBlockSize);
		}
		$blocksize -= 1;
	}else{
		$blocksize = $min_bs;
		@tmpVal = ( $blocksize, $lastBlockSize);
	}
}
($blocksize, $lastBlockSize) = @tmpVal;
$pg_bl   = $blocksize *4;
$ipb     = $blocksize *2;
$anz_blocks = floor($pages/$pg_bl);
$restSeiten = $pages - ($anz_blocks*$pg_bl);
if ($restSeiten && !$lastBlockSize){ $lastBlockSize = ceil($restSeiten/4);}

print "\n------------------------------------------------------------\n";
for (my $n=0;$n<$anz_blocks;$n++){
	my $a = $n*$pg_bl;
	my $e = $a+$pg_bl;
	&printBlock($n,$a,$e,$ipb,0);
}
if ($restSeiten > 0){
	print "\nletzter Block (".$lastBlockSize." Blatt):";
	my $a = $anz_blocks*$pg_bl;
	my $e = $a+($lastBlockSize *4);
	&printBlock($anz_blocks,$a,$e,($lastBlockSize*2),$pages);
}

# print "\npages: $pages | blocksize: $blocksize";
print "\n$anz_blocks Block a $blocksize Blatt, ".$pg_bl." Seiten/Block ";
print "=> ".$anz_blocks*$pg_bl."\n";
if ($restSeiten > 0){
	print "1 Block a ".$lastBlockSize." Blatt, ".$restSeiten." Seiten";
}
print "\n------------------------------------------------------------\n";
exit 0;

sub printBlock {
	my ($bnr,$beg,$end,$lpb,$last) = @_;
	print "\nBlock ".($bnr+1).", Dokumentseite ".($beg+1)." - ".($last?$last:$end)."\n";
	print "Vorderseite: ";
	if ($last > 0){
		for (my $i=1; $i<$lpb;$i+=2){
			my $s1 = $beg+$i;
			my $s2 = 1+$end-$i;
			if ( $s1 > $last) {$s1=0;}
			if ( $s2 > $last) {$s2=0;}
			print "".$s1.",".$s2." ; ";
		}
		print "\nRueckseite : ";
		for (my $i=2; $i<=$lpb;$i+=2){
			my $s1 = $beg+$i;
			my $s2 = 1+$end-$i;
			if ( $s1 > $last) {$s1=0;}
			if ( $s2 > $last) {$s2=0;}
			print "".$s1.",".$s2." ; ";
		}
	 
	}else{
		for (my $i=1; $i<$lpb;$i+=2){ print "".$beg+$i.",".(1+$end-$i)." ; ";}
		print "\nRueckseite : ";
		for (my $i=2; $i<=$lpb;$i+=2){ print "".$beg+$i.",".(1+$end-$i)." ; ";}

	}
	print "\n";
}

sub helpme{
	print <<EOT;

USAGE: perl $0 <Pages> <Max> [<Min>]
	where Pages is the number of pages in the Original Document,
	      Max is the maximum size of pieces of paper in one block,
	      Min is the minimum of the above.


EOT
	exit;
}