import os

PRE = "transcripts"
FASTA = "{0}.fasta.gz".format(PRE)
GTF = "{0}.gtf.gz".format(PRE)
INDEX = "{0}.kidx".format(PRE)
K = 31


ZCAT = 'gzcat' if os.uname()[0] == 'Darwin' else 'zcat'

rule all:
    input:
        "kallisto_out/abundance.h5",
        "pizzly_out/output.json",
        "pizzly_post/abundance.h5"

rule index:
    input: FASTA
    output: INDEX
    shell:
        "kallisto index -k {K} -i {output} {input}"

rule kallisto_quant:
    input:
        "reads_1.fastq.gz",
        "reads_2.fastq.gz",
        INDEX
    output:
        "kallisto_out",
        "kallisto_out/abundance.h5",
        "kallisto_out/abundance.tsv",
        "kallisto_out/run_info.json",
        "kallisto_out/fusion.txt"
    shell:
        "kallisto quant "
        "-i {INDEX} "
        "-o {output[0]} "
        "--fusion "
        "{input[0]} {input[1]}"

rule pizzly:
    input:
        FASTA,
        "kallisto_out/fusion.txt"
    output:
        "pizzly_out/output.json",
        "pizzly_out/output.fusions.fasta"
    shell:
        "../build/pizzly "
        "-k {K} "
        "--gtf {GTF} "
        "--cache cache.txt "
        "--align-score 2 "
        "--insert-size 400 "
        "--fasta {FASTA} "
        "--output pizzly_out/output "
        "kallisto_out/fusion.txt "

rule append_index:
    input:
        FASTA,
        "pizzly_out/output.fusions.fasta"
    output:
        "pizzly_post/transcripts_with_fusions.fasta.gz",
        "pizzly_post/transcripts_with_fusions.kidx"
    shell:
        "cat <({ZCAT} {FASTA}) {input[1]} | gzip - > {output[0]} && "
        "kallisto index -k {K} -i {output[1]} {output[0]}"

rule requant_kallisto:
    input:
        "reads_1.fastq.gz",
        "reads_2.fastq.gz",
        "pizzly_post/transcripts_with_fusions.kidx"
    output:
        "pizzly_post",
        "pizzly_post/abundance.h5"
    shell:
        "kallisto quant "
        "-i {input[2]} "
        "-o {output[0]} "
        "{input[0]} {input[1]}"
