#!/usr/bin/env ruby

require 'rbbt/util/simpleopt'
require 'rbbt/workflow'
require 'rbbt/workflow/usage'
require 'rbbt/hpc'
require 'rbbt/hpc/orchestrate'
require 'time'

$slurm_options = SOPT.get <<EOF
-dr--dry_run Print only the template
-cj--clean_job Clean job
--drbbt* Use development version of rbbt 
-sing--singularity Use Singularity
-si--singularity_img* Singularity image to use
-ug--user_group* Use alternative user group for group project directory
-c--contain* Contain in directory (using Singularity)
-s--sync* Contain in directory and sync jobs
-e--exclusive Make exclusive use of the node
-hm--highmem Make use of highmem cores
-wc--wipe_container* Wipe the jobs from the contain directory
-CS--contain_and_sync Contain and sync to default locations
-ci--copy_image When using a container directory, copy image there
-t--tail Tail the logs
-BPP--batch_procpath* Save Procpath performance for batch job; specify only options
-q--queue* Queue
-t--task_cpus* Tasks
-W--workflows* Additional workflows
-tm--time* Time
-OR--orchestration_rules* Orchestration rules
-rmb--remove_batch_basedir Remove the SLURM working directory (command, STDIN, exit status, ...)
EOF

batch_system = $slurm_options.delete :batch_system
batch_system ||= 'auto'

HPC::BATCH_MODULE = case batch_system.to_s.downcase
               when 'slurm'
                 HPC::SLURM
               when 'lsf'
                 HPC::LSF
               when 'auto'
                 case $previous_commands.last
                 when 'slurm'
                   HPC::SLURM
                 when 'lsf'
                   HPC::LSF
                 else
                   case Rbbt::Config.get(:batch_system, :batch, :batch_system, :hpc, :HPC, :BATCH).to_s.downcase
                   when 'slurm'
                     HPC::SLURM
                   when 'lsf'
                     HPC::LSF
                   else
                     case ENV["BATCH_SYSTEM"].to_s.downcase
                     when 'slurm'
                       HPC::SLURM
                     when 'lsf'
                       HPC::LSF
                     end
                   end
                 end
               end

raise ParameterException.new("Could not detect batch_system: #{Misc.fingerprint batch_system}") if HPC::BATCH_MODULE.nil?

class Step
    def run(*args)
        if done?
            self.load
        else
            begin
                Log.debug "Issuing SLURM job for #{self.path}"
                HPC::BATCH_MODULE.orchestrate_job(self, SOPT::GOT_OPTIONS.merge($slurm_options)) 
            rescue HPC::SBATCH
            end
        end
    end
end

ARGV.concat ["-W", $slurm_options[:workflows], '--detach'] if $slurm_options[:workflows]
load Rbbt.share.rbbt_commands.workflow.task.find