# Import Yaml or Json config file ----------------------------------------------

configfile: "config.yaml"

# Snakemake --------------------------------------------------------------------

rule all:
    input:
        "sorted/" + config["output"] + "_sorted.bam",
        "repete/" + config["output"] + "_repete.bam",
        "unique/" + config["output"] + "_unique.bam"

rule bwa_index:
    input:
        config["reference"]
    output:
        config["reference"] + ".bwt"
    log:
        "logs/bwa_index.logs"
    params:
        bwa_params = " ".join(['%s %s' % (key, value) for (key, value) in \
            config["bwa_index"].items()]),
        src = config["src_module"],
        bwa_module = config["bwa_module"]
    run:
        if(config["on_cluster"]):
            shell("""
                . {params.src}
                module load {params.bwa_module}
                bwa index {params.bwa_params} {input} 2> {log}
                """)
        else:
            shell("bwa index {params.bwa_params} {input} 2> {log}")

rule bwa_mem:
    input:
        ref = config["reference"],
        index = config["reference"] + ".bwt"
    output:
        "mapped/" + config["output"] + "_unsort.bam"
    log:
        "logs/bwa_mem.logs"
    params:
        fastq = " ".join([i for i in config["samples"]]),
        src = config["src_module"],
        bwa_module = config["bwa_module"],
        samtools_module = config["samtools_module"]
    run:
        if(config["on_cluster"]): 
            shell("""
                . {params.src}
                module load {params.bwa_module} {params.samtools_module}
                (bwa mem -M {input.ref} {params.fastq} |\
                samtools view -Sbh - > {output}) 2> {log}
                """)
        else:
            shell(" (bwa mem -M {input.ref} {params.fastq} |\
                samtools view -Sbh - > {output}) 2> {log}")

rule samtools:
    input:
        bam = "mapped/" + config["output"] + "_unsort.bam",
        ref = config["reference"]
    output:
        refid = config["reference"] + ".fai",
        sort = "sorted/" + config["output"] + "_sorted.bam"
    log:
        "logs/samtools.log"
    params:
        prefix = "sorted/" + config["output"] + "_sorted",
        src = config["src_module"],
        samtools_module = config["samtools_module"]
    run:
        if(config["on_cluster"]):
            shell("""
                . {params.src}
                module load {params.samtools_module}
                samtools sort {input.bam} {params.prefix} 2> {log}
                samtools faidx {input.ref} 2>> {log}
                """)
        else:
            shell("""
                samtools sort {input.bam} {params.prefix} 2> {log}
                samtools faidx {input.ref} 2>> {log}
                """)

rule extract_unique_alignment:
    input:
        bam = "sorted/" + config["output"] + "_sorted.bam"
    output:
        bam = "unique/" + config["output"] + "_unique.bam"
    params:
        src = config["src_module"],
        samtools_module = config["samtools_module"]
    run:
        if(config["on_cluster"]):
            shell("""
                . {params.src}
                module load {params.samtools_module}
                samtools view -q 1 -Sbh {input.bam}  -o {output.bam}
                """)
        else:
            shell("""
                samtools view -q 1 -Sbh {input.bam}  -o {output.bam}
                """)

rule extract_multiple_alignment:
    input:
        bam = "sorted/" + config["output"] + "_sorted.bam"
    output:
        bam = "repete/" + config["output"] + "_repete.bam"
    params:
        src = config["src_module"],
        samtools_module = config["samtools_module"]
    run:
        if(config["on_cluster"]):
            shell("""
                . {params.src}
                module load {params.samtools_module}
                samtools view -h {input.bam} | \
                awk '{{if($1 ~ /^@/){{print $0}}else if($5 == 0){{print $0}}}}'\
                | samtools view -Sbho {output.bam} -
                """)
        else:
            shell("""
                samtools view -h {input.bam} | \
                awk '{{if($1 ~ /^@/){{print $0}}else if($5 == 0){{print $0}}}}'\
                | samtools view -Sbho {output.bam} -
                """)

