#!/usr/bin/env perl
use strict;
use warnings;
use SMT::Agent::Utils;
use XML::XPath;
use XML::XPath::XMLParser;

sub jobhandler
{
  my ($jobtype, $jobid, $args, $verbose) =  @_;

  SMT::Agent::Utils::logger ("jobhandler for wait called", $jobid);
  SMT::Agent::Utils::logger ("wait runs jobid \"$jobid\"", $jobid);

  # check whether this handler can handle requested jobtype
  SMT::Agent::Utils::error ("wrong job handler: \"wait\" cannot handle \"$jobtype\"", $jobid) if ( $jobtype ne "wait" );

  my $xpQuery = XML::XPath->new(xml => $args);
  eval { SMT::Agent::Utils::error("no argument section found for this job", $jobid) unless ( $xpQuery->exists('/arguments[1]')); };
  my $argSet;
  eval { $argSet = $xpQuery->find('/arguments[1]') };
  SMT::Agent::Utils::error("xml data is not parsable", $jobid) if ($@);
  SMT::Agent::Utils::error("too many argument sections found for this job", $jobid) unless ( (defined $argSet) && ($argSet->size() == 1) );
  my $arg = $argSet->pop();

  my @waittimes = ();
  my @exitcodes = ();
  push @waittimes, $arg->getAttribute('waittime');
  push @exitcodes, $arg->getAttribute('exitcode');

  my $waitSet;
  eval { $waitSet = $xpQuery->find('/arguments[1]/waittime[1]') };
  SMT::Agent::Utils::error("xml data is not parsable", $jobid) if ($@);
  foreach my $_n ($waitSet->get_nodelist()) {
      push (@waittimes, $_n->string_value()) if (defined $_n);
  }
  my $exitSet;
  eval { $exitSet = $xpQuery->find('/arguments[1]/exitcode[1]') };
  SMT::Agent::Utils::error("xml data is not parsable", $jobid) if ($@);
  foreach my $_n ($exitSet->get_nodelist()) {
      push (@exitcodes, $_n->string_value()) if (defined $_n);
  }

  my $waittime;
  my $exitcode;
  do {
      $waittime = shift @waittimes;
      $waittime ||= 0 unless (@waittimes > 0);
  } until (defined $waittime);
  do {
      $exitcode = shift @exitcodes;
      $exitcode ||= 0 unless (@exitcodes > 0);
  } until (defined $exitcode);

  SMT::Agent::Utils::error( "argument invalid: waittime", $jobid ) unless ( $waittime  =~ /^\d+$/ );
  SMT::Agent::Utils::error( "argument invalid: exitcode", $jobid ) unless ( $exitcode  =~ /^\d+$/ );

  #==  run sleep ==
  SMT::Agent::Utils::logger ("sleeping ".$waittime." seconds....", $jobid);
  sleep ($waittime);
  my $retval = $exitcode;
  SMT::Agent::Utils::logger ("sleeping done.", $jobid);

  return (
    stdout => "",
    stderr => "",
    exitcode => $retval,
    success => ($retval == 0 ) ? "true" : "false",
    message => ($retval == 0 ) ? "wait successfully finished" : "wait failed"
  );

}

SMT::Agent::Utils::logger ("successfully loaded handler for jobtype \"wait\"");

1;

