task spades {
    String outputDir
    String? preCommand
    File read1
    File? read2
    File? interlacedReads
    File? sangerReads
    File? pacbioReads
    File? nanoporeReads
    File? tslrContigs
    File? trustedContigs
    File? untrustedContigs
    Boolean? singleCell
    Boolean? metagenomic
    Boolean? rna
    Boolean? plasmid
    Boolean? ionTorrent
    Boolean? onlyErrorCorrection
    Boolean? onlyAssembler
    Boolean? careful
    Boolean? disableGzipOutput
    Boolean? disableRepeatResolution
    File? dataset
    Int? threads
    Int? memoryGb
    File? tmpDir
    String? k
    Float? covCutoff
    Int? phredOffset
    Int finalThreads = select_first([threads,1])
    Int totalMemory = select_first([memoryGb, finalThreads * 16])
    Int clusterMemory = totalMemory / finalThreads

    command {
        set -e -o pipefail
        ${preCommand}
        spades.py \
        ${"-o " + outputDir} \
        ${true="--sc" false="" singleCell} \
        ${true="--meta" false="" metagenomic} \
        ${true="--rna" false="" rna} \
        ${true="--plasmid" false="" plasmid} \
        ${true="--iontorrent" false="" ionTorrent} \
        ${"--12 " + interlacedReads } \
        ${true="-1" false="-s" defined(read2)} ${read1}  \
        ${"-2 " + read2 } \
        ${"--sanger " + sangerReads } \
        ${"--pacbio " + pacbioReads } \
        ${"--nanopore " + nanoporeReads } \
        ${"--tslr " + tslrContigs } \
        ${"--trusted-contigs " + trustedContigs } \
        ${"--untrusted-contigs" + untrustedContigs } \
        ${true="--only-error-correction" false="" onlyErrorCorrection } \
        ${true="--only-assembler" false="" onlyAssembler } \
        ${true="--careful" false="" careful } \
        ${true="--disable-gzip-output" false="" disableGzipOutput} \
        ${true="--disable-rr" false="" disableRepeatResolution } \
        ${"--dataset " + dataset } \
        ${"--threads " + finalThreads} \
        ${"--memory " + totalMemory } \
        ${"-k " + k } \
        ${"--cov-cutoff " + covCutoff } \
        ${"--phred-offset " + phredOffset }
    }
    output {
        Array[File] correctedReads = glob(outputDir + "/corrected/*.fastq*")
        File scaffolds = outputDir + "/scaffolds.fasta"
        File contigs = outputDir + "/contigs.fasta"
        File assemblyGraphWithScaffoldsGfa = outputDir + "/assembly_graph_with_scaffolds.gfa"
        File assemblyGraphFastg = outputDir + "/assembly_graph.fastg"
        File contigsPaths = outputDir + "/contigs.paths"
        File scaffoldsPaths = outputDir + "/scaffolds.paths"
        File params = outputDir + "/params.txt"
        File log = outputDir + "/spades.log"
    }
    runtime {
        cpu: finalThreads
        memory: clusterMemory
    }
}