task Star {
    String? preCommand

    Array[File] inputR1
    Array[File?] inputR2
    String genomeDir
    String outFileNamePrefix

    String? outSAMtype
    String? readFilesCommand
    Int? runThreadN
    String? outStd
    String? twopassMode
    Array[String]? outSAMattrRGline
    Int? limitBAMsortRAM

    Int? memory

    #TODO needs to be extended for all possible output extensions
    Map[String, String] samOutputNames = {"BAM SortedByCoordinate": "sortedByCoord.out.bam"}

    # converts String? to String for use as key (for the Map above) in output
    String key = select_first([outSAMtype, "BAM SortedByCoordinate"])

    command {
        set -e -o pipefail
        mkdir -p ${sub(outFileNamePrefix, basename(outFileNamePrefix) + "$", "")}
        ${preCommand}
        STAR \
        --readFilesIn ${sep=',' inputR1} ${sep="," inputR2} \
        --outFileNamePrefix ${outFileNamePrefix} \
        --genomeDir ${genomeDir} \
        --outSAMtype ${default="BAM SortedByCoordinate" outSAMtype} \
        --readFilesCommand ${default="zcat" readFilesCommand} \
        ${"--runThreadN " + runThreadN} \
        ${"--outStd " + outStd} \
        ${"--twopassMode " + twopassMode} \
        ${"--limitBAMsortRAM " + limitBAMsortRAM} \
        ${true="--outSAMattrRGline " false="" defined(outSAMattrRGline)} ${sep=" , " outSAMattrRGline}
    }

    output {
        File bamFile = outFileNamePrefix + "Aligned." +  samOutputNames[key]
    }

    runtime {
        cpu: select_first([runThreadN, 1])
        memory: select_first([memory, 10])
    }
}

task makeStarRGline {
    String sample
    String library
    String? platform
    String readgroup

    command {
        printf '"ID:${readgroup}" "LB:${library}" "PL:${default="ILLUMINA" platform}" "SM:${sample}"'
    }

    output {
        String rgLine = read_string(stdout())
    }
}