
if config["genome"] == "":
    pass
else:
    rule R_createInSilicoFasta:
        """
        Create fasta files representing the in-silico ddRad digestion (R).
        """
        input:
            script=config["insilico-script"],
            reference="%s" % (config["genome"])
        output:
            full="%s/References/full_inSilico_reference.fa" % (config["project-folder"]),
            selected="%s/References/sizeSelected_inSilico_reference.fa" % (config["project-folder"])
        log:
            "%s/logs/R_createInSilicoFasta.log" % (config["project-folder"])
        benchmark:
            "%s/benchmark/R_createInSilicoFasta.tsv" % (config["project-folder"])
        singularity:
            config["singularity"]["r-gbs"]
        params:
           projFolder=config["project-folder"],
           enz1=config["enz1"],
           enz2=config["enz2"],
           min=config["minLength"],
           max=config["maxLength"],
        shell:"""
           R -e "projFolder <- '{params.projFolder}'; \
                 refGenome.file <- '{input.reference}'; \
                 enz1.in <- '{params.enz1}'; \
                 enz2.in <- '{params.enz2}'; \
                 minLength <- '{params.min}' ; \
                 maxLength <- '{params.max}' ; \
                 full.file <- '{output.full}'; \
                 selected.file <- '{output.selected}'; \
                 snakemake <- TRUE;\
                 options(knitr.duplicate.label = 'allow');\
                 source('{input.script}')" &> {log}
        """
    
if config["genome"] == "":
    pass
else:
    rule InsilicoGenome_AlignReads:
        """
        Align reads to the in-silico Genome (BWA).
        """
        input:
            fullInsilico="%s/References/full_inSilico_reference.fa" % (config["project-folder"]),
            selectedInsilico="%s/References/sizeSelected_inSilico_reference.fa" % (config["project-folder"]),
            fullIndex=config["genome-bwa-full_insilico-index"],
            selectedIndex=config["genome-bwa-selected_insilico-index"],
            fullGenome=config["full-insilico-genome"],
            selectedGenome=config["selected-insilico-genome"],
            R1="%s/FASTQ/TRIMMED/{samples}.R1.fq.gz" % (config["project-folder"]),
            R2="%s/FASTQ/TRIMMED/{samples}.R2.fq.gz" % (config["project-folder"]),
        output:
            full=temp("%s/SAM/Insilico/full/{samples}.sam" % (config["project-folder"])),
            selected=temp("%s/SAM/Insilico/selected/{samples}.sam" % (config["project-folder"]))
        log:
            full="%s/logs/Insilico_full_AlignReads.{samples}.log" % (config["project-folder"]),
            selected="%s/logs/Insilico_selected_AlignReads.{samples}.log" % (config["project-folder"])
        benchmark:
            "%s/benchmark/Insilico_AlignReads.{samples}.tsv" % (config["project-folder"])
        threads: cluster["InsilicoGenome_AlignReads"]["cpus-per-task"]
        resources:
            time=cluster["InsilicoGenome_AlignReads"]["time"],
            mem=cluster["InsilicoGenome_AlignReads"]["mem-per-cpu"]
        singularity: config["singularity"]["gbs"]
        shell:"""
            bwa mem -t {threads} -M {input.fullGenome} {input.R1} {input.R2} > {output.full} 2> {log.full}
            bwa mem -t {threads} -M {input.selectedGenome} {input.R1} {input.R2} > {output.selected} 2> {log.selected}
      	"""
      	
if config["genome"] == "":
    pass
else:
    rule InsilicoGenome_SamToSortedBam:
        """
        Sam to sorted bam for insilico (SAMTOOLS)
        """
        input:
            full="%s/SAM/Insilico/full/{samples}.sam" % (config["project-folder"]),
            selected="%s/SAM/Insilico/selected/{samples}.sam" % (config["project-folder"])
        output:
            bamFull=temp("%s/BAM/Insilico/full/{samples}.bam" % (config["project-folder"])),
            sortedFull="%s/BAM/Insilico/full/{samples}.sorted.bam" % (config["project-folder"]),
            bamSelected=temp("%s/BAM/Insilico/selected/{samples}.bam" % (config["project-folder"])),
            sortedSelected="%s/BAM/Insilico/selected/{samples}.sorted.bam" % (config["project-folder"]),
        log:
            "%s/logs/Samtools/Insilico_SamToSortedBam.{samples}.log" % (config["project-folder"])
        benchmark:
            "%s/benchmark/Insilico_SamToSortedBam.{samples}.tsv" % (config["project-folder"])
        threads: cluster["InsilicoGenome_AlignReads"]["cpus-per-task"]
        resources:
            time=cluster["InsilicoGenome_AlignReads"]["time"],
            mem=cluster["InsilicoGenome_AlignReads"]["mem-per-cpu"]
        params:
            q=config["params"]["step5d"]["q"],
            f=config["params"]["step5d"]["f"],
            F=config["params"]["step5d"]["F"]
        singularity: config["singularity"]["gbs"]
        shell:"""
            samtools view -b -q {params.q} -f {params.f} -F {params.F} {input.full} > {output.bamFull}
            samtools sort {output.bamFull} -o {output.sortedFull}
            samtools index -c {output.sortedFull}
            
            samtools view -b -q {params.q} -f {params.f} -F {params.F} {input.selected} > {output.bamSelected}
            samtools sort {output.bamSelected} -o {output.sortedSelected}
            samtools index -c {output.sortedSelected}
      	"""
      	
if config["genome"] == "":
    pass
else:
    rule Insilico_AlignmentStats:
        """
        Get the mapping stats for the in-silico prediction.
        """
        input:
            samFull="%s/SAM/Insilico/full/{samples}.sam" % (config["project-folder"]),
            samSelected="%s/SAM/Insilico/selected/{samples}.sam" % (config["project-folder"]),
            sortedFull="%s/BAM/Insilico/full/{samples}.sorted.bam" % (config["project-folder"]),
            sortedSelected="%s/BAM/Insilico/selected/{samples}.sorted.bam" % (config["project-folder"])
        output:
            fsFull="%s/BAM/Insilico/full/{samples}.sam.flagstat" % (config["project-folder"]),
            cFull="%s/BAM/Insilico/full/{samples}.coverage" % (config["project-folder"]),
            fsSelected="%s/BAM/Insilico/selected/{samples}.sam.flagstat" % (config["project-folder"]),
            cSelected="%s/BAM/Insilico/selected/{samples}.coverage" % (config["project-folder"])
        log:
            "%s/logs/Samtools/Insilico_AlignmentStats.{samples}.log" % (config["project-folder"])
        benchmark:
            "%s/benchmark/Insilico_AlignmentStats.{samples}.tsv" % (config["project-folder"])
        threads: cluster["Insilico_AlignmentStats"]["cpus-per-task"]
        resources:
            time=cluster["Insilico_AlignmentStats"]["time"],
            mem=cluster["Insilico_AlignmentStats"]["mem-per-cpu"]
        singularity: config["singularity"]["gbs"]
        shell:"""
            samtools flagstat {input.samFull} > {output.fsFull}
            samtools idxstats {input.sortedFull} | awk '{{print $1\" \"$3}}' > {output.cFull}
            
            samtools flagstat {input.samSelected} > {output.fsSelected}
            samtools idxstats {input.sortedSelected} | awk '{{print $1\" \"$3}}' > {output.cSelected}

      	"""
