package PPD::Paper;

use PPD;

sub mm($) {
	my ($mm) = @_;
	return int($mm/25.4*72 + 0.5);
}

# Media parameters:
# 	Name		human-readable name
# 	W		width in PS points
# 	H		height in PS points
my %media = (
	'A0' => { Name => 'A0', W => mm(841), H => mm(1189) },
	'A1' => { Name => 'A1', W => mm(594), H => mm(841) },
	'A2' => { Name => 'A2', W => mm(420), H => mm(594) },
	'A3' => { Name => 'A3', W => mm(297), H => mm(420) },
	'A4' => { Name => 'A4', W => mm(210), H => mm(297) },
	'A5' => { Name => 'A5', W => mm(148), H => mm(210) },
	'A6' => { Name => 'A6', W => mm(105), H => mm(148) },
	'B0' => { Name => 'B0', W => mm(1000), H => mm(1414) },
	'B1' => { Name => 'B1', W => mm(707), H => mm(1000) },
	'B2' => { Name => 'B2', W => mm(500), H => mm(707) },
	'B3' => { Name => 'B3', W => mm(353), H => mm(500) },
	'B4' => { Name => 'B4', W => mm(250), H => mm(353) },
	'B5' => { Name => 'B5', W => mm(176), H => mm(250) },
	'B6' => { Name => 'B6', W => mm(125), H => mm(176) },
	'C0' => { Name => 'C0', W => mm(917), H => mm(1297) },
	'C1' => { Name => 'C1', W => mm(648), H => mm(917) },
	'C2' => { Name => 'C2', W => mm(458), H => mm(648) },
	'C3' => { Name => 'C3', W => mm(324), H => mm(458) },
	'C4' => { Name => 'C4', W => mm(229), H => mm(354) },
	'C5' => { Name => 'C5', W => mm(162), H => mm(229) },
	'C6' => { Name => 'C6', W => mm(114), H => mm(162) },
	'C7' => { Name => 'C7', W => mm(81), H => mm(114) },
	'C8' => { Name => 'C8', W => mm(57), H => mm(81) },
	'Letter' => { Name => 'US Letter', W => 612, H => 792 },
	'Legal' => { Name => 'US Legal', W => 612, H => 1008 },
);

# add_papers({
#	MinW => pt,		# Minimum paper width (default: 0)
#	MaxW => pt,		# Maximum paper width (default: 595)
#	MinH => pt,		# Minimum paper height (default: 0)
#	MaxH => pt,		# Maximum paper height (default: 842)
#	MarginH => pt,		# Horizontal margin (default: 0)
#	MarginV => pt,		# Vertical margin (default: 0)
#	DefPaper => paper,	# Default paper type (default: A4)
#	PSPageSize => PS,	# PS code for setting PageSize (subroutine called with ref to media object)
#	PSPageRegion => PS,	# The same for PageRegion (default: use PSPageSize)
# })
sub add_papers($) {
	# Scan available paper formats
	my ($o) = @_;
	my $minw = $o->{MinW} // 0;
	my $maxw = $o->{MaxW} // 595;
	my $minh = $o->{MinH} // 0;
	my $maxh = $o->{MaxH} // 842;
	my $margh = $o->{MarginH} // 0;
	my $margv = $o->{MarginV} // 0;
	my %real_media = ();
	for my $p (keys %media) {
		my $m = $media{$p};
		$m->{W} >= $minw && $m->{W} <= $maxw && $m->{H} >= $minh && $m->{H} <= $maxh or next;
		$real_media{$p} = $m;
		$m->{Key} = $p;
	}
	$o->{DefPaper} //= 'A4';

	define_ui_group('Media', { Name => 'Media settings' });

	option({
		Key => 'PageSize',
		Name => 'Page Size',
		Choice => 'PickAny',
		Priority => 30,
		Values => [ map {
			my $k = $_;
			my $m = $real_media{$_};
			{
				Key => $k,
				Name => ($m->{Name} // $k),
				PS => &{$o->{PSPageSize}}($m),
			}
		} sort keys %real_media ],
		Default => $o->{DefPaper},
	});

	option({
		Key => 'PageRegion',
		Name => 'Page Region',
		Choice => 'PickAny',
		Priority => 40,
		Values => [ map {
			my $k = $_;
			my $m = $real_media{$_};
			{
				Key => $k,
				Name => ($m->{Name} // $k),
				PS => &{$o->{PSPageRegion} // $o->{PSPageSize}}($m),
			}
		} sort keys %real_media ],
		Default => $o->{DefPaper},
	});

	option({
		Key => 'ImageableArea',
		Values => [ map {
			my $k = $_;
			my $m = $real_media{$_};
			{
				Key => $k,
				Name => ($m->{Name} // $k),
				PS => sprintf("%d %d %d %d", $margh, $margv, $m->{W} - $margh, $m->{H} - $margv),
			}
		} sort keys %real_media ],
		Default => $o->{DefPaper},
	});

	option({
		Key => 'PaperDimension',
		Values => [ map {
			my $k = $_;
			my $m = $real_media{$_};
			{
				Key => $k,
				Name => ($m->{Name} // $k),
				PS => sprintf("%d %d", $m->{W}, $m->{H}),
			}
		} sort keys %real_media ],
		Default => $o->{DefPaper},
	});
}

42;