package Grid::Request::DRM::SGE;

use strict;
use Log::Log4perl qw(get_logger);

our $VERSION = '0.7';

my $logger = get_logger(__PACKAGE__);

my %ARCH = ( solaris => "sol-sparc64",
             linux   => "lx24*",
             opteron => "lx24-amd64",
           );

sub new {
    my $class = shift;
    my $self = bless {}, $class || ref($class);
    return $self;
}

sub account {
    $logger->debug("In account.");
    my ($self, $account) = @_;
    my $spec = "-A $account";
    $logger->debug(qq|Returning "$spec".|);
    return $spec;
}

sub hosts {
    $logger->debug("In hosts.");
    my ($self, $hosts) = @_;
    my @hosts = split(/,/, $hosts);
    my $host_list = join("|", @hosts);
    my $spec = "-l hostname=$host_list";
    $logger->debug(qq|Returning "$spec".|);
    return $spec;
}

sub opsys {
    $logger->debug("In opsys.");
    my ($self, $opsys) = @_;
    if (! defined $opsys) {
        Grid::Request::InvalidArgumentException->throw(qq|"opsys" is not defined.|);
    }
    my @sys = split(/,/, lc($opsys));
    my @arch; # To hold the translated values.
    foreach my $sys (@sys) {
        if (exists($ARCH{$sys})) {
            push @arch , $ARCH{$sys}; 
        } else {
            Grid::Request::InvalidArgumentException->throw("$sys is not a valid opsys.");
        }
    }
    my $spec = "-l arch=";
    my $arch_translated = join('|', @arch);
    $spec .= $arch_translated;
    $logger->debug(qq|Returning "$spec".|);
    return $spec;
}

sub evictable {
    $logger->debug("In evictable.");
    my $self = shift;
    my $spec = "-r y -ckpt rescheduled"; 
    $logger->debug(qq|Returning "$spec".|);
    return $spec;
}

sub priority {
    $logger->debug("In priority.");
    my ($self, $priority) = @_;
    # TODO: Note that the -p priority, as of 6.0u7, is going to a GLOBAL priority
    # across ALL jobs from all users. Additionally, priority can only be set negatively
    # from the -1024 to 0 range unless the user is an SGE manager. This should probably
    # be revised to use -js instead of -p, to prevent confusion, as -p does not rank
    # jobs per user, but globally... What the user probably wants is to prioritize among
    # his/her own jobs...
    my $spec = "-p $priority";
    $logger->debug(qq|Returning "$spec".|);
    return $spec;
}

sub memory {
    $logger->debug("In memory.");
    my ($self, $megabytes) = @_;
    my $spec = " -l mem_total=" . $megabytes . "M";
    $logger->debug(qq|Returning "$spec".|);
    return $spec;
}

sub length {
    $logger->debug("In length.");
    my ($self, $length) = @_;
    my $spec = "";
    return $spec;
}

sub project {
    $logger->debug("In project.");
    my ($self, $project) = @_;
    if (! defined $project) {
        Grid::Request::InvalidArgumentException->throw("project is not defined.");
    }
    my $spec = "-P $project";
    $logger->debug(qq|Returning "$spec".|);
    return $spec;
}

sub class {
    $logger->debug("In class.");
    my ($self, $class) = @_;
    my $spec = "";
    if (lc($class) eq "assembly") {
        $spec .= "-l msc";
    }
    $logger->debug(qq|Returning "$spec".|);
    return $spec;
}

sub runtime {
    $logger->debug("In runtime.");
    my ($self, $min) = @_;
    # Convert the minutes to 'HH:mm" format by determining the
    # number of hours and minutes
    my $hours = sprintf("%02s", int($min/60));
    $logger->debug("Hours: $hours");

    # Get the remaining minutes
    my $minutes = sprintf("%02s", $min % 60);
    $logger->debug("Minutes: $minutes");

    # Build the time string. Seconds are always set to 00
    my $time = $hours . ":" . $minutes . ":00";
    $logger->debug("Converted $min in minutes to: $time.");

    my $spec = "-l h_rt=$time";
    $logger->debug(qq|Returning "$spec".|);
    return $spec;
}

1;
