#!/usr/bin/perl
use strict;
use File::Basename;
use Env qw(USER);
#my $ourproj="k29";
#my $fulljobname;
#my $rssmb;
#my $vmemmb;
my $qout;
my $jobid;
my $jobstate;
my $jobid;
my $jobstate;
my $owner;
my $proj;
my $joboutput;
my $totcpu;
my $cputime;
my $wall;
my $timelim;
my $rsskb;
my $vmemkb;
my $memlim;
my $numcpu;
my $jobfskb;
my $fslimmb;
my $fslimgb;
my @output;

my $searchstring=$USER;
#my $searchterm=$owner;
my %switches=(-g => '501',
	      -a => '');
foreach my $options (@ARGV){
  $searchstring=$switches{$options};
#d  print ("-g switch enabled?\n");
}

#open(QSTAT,"qstat.out") or die ("Can't open qstat:$!\n");
#while (<QSTAT>){
#    my $line=$_;
#@output=`ssh -l mbs501 sc qstat -f`;
@output=`qstat -f`;
my @nqstatout=`nqstat -u $USER`;
print ("    ID      User  Proj   Job Name               CPU WallTime Time Lim    RSS  vmem memlim  fs fslim cpus\n");
foreach my $line (@output){
    my $jobidtmp;
    if ($line =~ /^Job Id:\s+(\d+)\.\w+/){$jobidtmp=$1;}
    if ($line =~ /job_state =\s+(\w+)/)                      {$jobstate=$1;}
    elsif ($line =~ /Job_Owner = (\w\w\w\w\w\w)/)               {$owner=$1;}
    elsif ($line =~ /Account_Name = (\w\w\w)/)                  {$proj=$1;}
    elsif ($line =~ /Output_Path = \w+:\s*(\/.+)/)              {$joboutput=$1;}
    elsif ($line =~ /resources_used.cput = (\d+:\d\d:\d\d)/)    {$cputime=$1;}
    elsif ($line =~ /resources_used.walltime = (\d+:\d\d:\d\d)/){$wall=$1;}
    elsif ($line =~ /Resource_List.walltime = (\d+:\d\d:\d\d)/) {$timelim=$1;}
    elsif ($line =~ /resources_used.mem = (\d+)kb/)             {$rsskb=$1;}
    elsif ($line =~ /resources_used.vmem = (\d+)kb/)            {$vmemkb=$1;}
    elsif ($line =~ /Resource_List.vmem = (\d+)mb/)             {$memlim=$1;}
    elsif ($line =~ /Resource_List.ncpus = (\d+)/)              {$numcpu=$1;}    
    elsif ($line =~ /resources_used.jobfs = (\d+)kb/)           {$jobfskb=$1;}    
    elsif ($line =~ /Resource_List.jobfs = (\d+)mb/)            {$fslimmb=$1;}    
    elsif ($line =~ /Resource_List.jobfs = (\d+)gb/)            {$fslimgb=$1;}    
#    elsif ($line=~/^\s*\n/ && ){
#    elsif ($line=~/^\s*\n/){
#    my $jobidtmp;
    elsif ($line =~ /^Job Id:\s+(\d+)\.\w+/){
	my $jobidtmp=$1;
#d	print ("jobid=$jobid jobidtmp=$jobidtmp\n");
#	if ($proj=~/$ourproj/){
	if ($owner=~/$searchstring/){
	    my $fulljobname=basename($joboutput,".batch");
	    my $rssmb;
	    my $vmemmb;
	    my $jobfsgb;
	    if ($vmemkb != 0){
		$rssmb=$rsskb/1024;
		$vmemmb=$vmemkb/1024;
	    }
	    unless ($fslimgb != 0){$fslimgb=$fslimmb/1024;}
	    $jobfsgb=$jobfskb/1024/1024;
#d	print("jobid=$jobid jobstate=$jobstate owner=$owner\n");
	    $totcpu=(time_percent($cputime,$wall)/$numcpu);
	    write;
	    format STDOUT =
@####### @<@<<<<<<@<<<@<<<<<<<<<<<<<<<<<<<<<<< @###@>>>>>>>> @>>>>>>>> @#### @#### @#### @### @### @##
$jobid,$jobstate,$owner,$proj,$fulljobname,$totcpu,$wall,$timelim,$rssmb,$vmemmb,$memlim,$jobfsgb,$fslimgb,$numcpu
.
	    undef $totcpu;
	    undef $rssmb;
	    undef $vmemmb;
	    undef $jobfsgb;
	}
	    undef $jobid;
	    undef $jobstate;
	    undef $owner;
	    undef $proj;
	    undef $joboutput;
	    undef $wall;
	    undef $timelim;
	    undef $rsskb;
	    undef $vmemkb;
	    undef $memlim;
	    undef $numcpu;
	    undef $jobfskb;
	    undef $fslimgb;
	    undef $fslimmb;
	    $jobid=$jobidtmp;
	    

      }
  }
my @qSum;
foreach my $line (@nqstatout){
  if ($line =~ /^\d+ running jobs \(\d+ suspended\), \d+ queued jobs, \d+ cpus in use/){
    push (@qSum,$line);
  }
}
print STDOUT $qSum[0];
sub time_percent{
    my $cpu=@_[0];
    my $wall=@_[1];
#d    print ("cpu=$cpu wall=$wall\n");
    my $cpusecs=conv2sec($cpu);
    my $wallsecs=conv2sec($wall);
    my $percent_cpu;
#d    print ("cpusecs=$cpusecs wallsecs=$wallsecs\n");
    if ($wallsecs>0){
      $percent_cpu=$cpusecs/$wallsecs*100;
    }
    else {
      $percent_cpu=0;
    }
    return ($percent_cpu);

}
sub conv2sec{
# Expecting time in the format of hh:mm:ss
# Convert to seconds

    my $time=@_[0];
    my @ind_time=split(/:/,$time);
    my $hours=@ind_time[0];
    my $min=@ind_time[1];
    my $sec=@ind_time[2];
#d    print("hours=$hours min=$min sec=$sec\n");
    my $total_secs=$sec+60*$min+3600*$hours;
    return ($total_secs);
}
