package ReportGen::Globs;
use strict;

# various command line options routines

require Exporter;
use ReportGen::ObjDbase;

@ReportGen::Globs::ISA = qw ( Exporter );
@ReportGen::Globs::EXPORT = qw ( 
	$MByte $Mbit $GByte
	&GetCfg &FullDir &FullInFName &FullOutFName 
	&ObjName2Type &VendType
	&Percent &System &MkDir );


use vars qw($MByte $Mbit $GByte);
$MByte = 1024*1024;
$Mbit  = $MByte/8;
$GByte = $MByte*1024;

my $RepDir = 'polyrep';
my $CfgFile = 'reportgen.cfg';

my @ObjTypeGroups = (
	{ map { $_ => 'throughput/price (req/sec per $1000)' }  qw ( rep.rate_price.ratio ) },
	{ map { $_ => 'hit rate/price (hit/sec per $1000)' }  qw ( hit.rate_price.ratio ) },
	{ map { $_ => 'throughput/space (req/sec per RU)' }  qw ( rep.rate_rack.space.ratio ) },
	{ map { $_ => 'hit rate/space (hit/sec per RU)' }  qw ( hit.rate_rack.space.ratio ) },
	{ map { $_ => 'time (min)' }  qw ( time_till_first ) },
	{ map { $_ => 'improvement (%)' }  qw ( save ) },
	{ map { $_ => 'rate (conn/sec)' }  qw ( conn.*rate ) },
	{ map { $_ => 'rate (xact/sec)' }  qw ( rate ) },
	{ map { $_ => 'time/kilobyte (msec)' }  qw ( byte.rptm.mean ) },
	{ map { $_ => 'time (msec)' }  qw ( rptm.mean rptm.median duration ) },
	{ map { $_ => 'count' } qw ( use.mean count level started finished ) },
	{ map { $_ => 'ratio (%)' } qw ( ratio.obj ratio.byte ratio ) },
	{ map { $_ => 'size (bytes)' }  qw ( size.mean ) },
	{ map { $_ => 'price (USD)' }  qw ( price ) },
	{ map { $_ => 'age (hours)' }  qw ( age ) },
	{ map { $_ => 'string' } qw ( name ) },
);

my %VendTypes = (
	'_other' => 1,
);

sub FullDir {
	my $label = shift;
	die() unless defined $label;

	return "$ENV{POLYREP_DIR}/$label" if defined $ENV{POLYREP_DIR};

	my $dir = defined $ENV{TMPDIR} ? $ENV{TMPDIR} : '/tmp';
	return "$dir/$RepDir/$label";
}

sub FullInFName {
	my ($label, $fname, $ext) = @_;
	$ext ||= '';
	die("FullFName($label, $fname)") unless defined $fname;

	my $dir = &FullDir($label);
	return "$dir/$fname$ext";
}

sub FullOutFName {
	my ($label, $fname, $ext) = @_;
	$ext ||= '';
	die("FullFName($label, $fname)") unless defined $fname;

	my $dir = &FullDir($label);
	&MkDir($dir);
	return "$dir/$fname$ext";
}

sub ObjName2Type {
	my $name = shift;
	foreach my $group (@ObjTypeGroups) {
		foreach my $n (keys %{$group}) {
			return $group->{$n} if $name =~ /$n/x;
		}
	}
	return undef();
}

sub VendType {
	my $v = shift;
	return undef unless defined($v);
	# convert to lower case?
	return $VendTypes{$v} if defined $VendTypes{$v};
	return $VendTypes{'_other'}++;
}

sub Percent {
	my ($n, $d) = @_;
	return -1 if abs($d) < 1e-6;
	return 100*$n/$d;
}

sub GetCfg {
	my $opts = ReadDbase($CfgFile);
	return $opts;
}

sub System {
	my ($cmd) = @_;

	die("$0: `$cmd' failed; probable cause: $!\n") if system($cmd);
}

sub MkDir {
	my ($dir) = @_;

	return if -d $dir;
	&System("mkdir -p $dir");
}


syntax highlighted by Code2HTML, v. 0.9.1