from os import environ
from os.path import join, splitext


def replace_ext(filename, ext):
    return splitext(filename)[0] + ext


def append_ext(filename, ext):
    return filename + ext


species_id = config["species_id"]

data_dir = "/projects/project_ludwig_pb_gaps/data/{}".format(species_id)
work_dir = "/projects/project_ludwig_pb_gaps/workdir/{}/finisher_sc".format(species_id)
results_dir = "/projects/project_ludwig_pb_gaps/results/{}/finisher_sc".format(species_id)
mummer_link = "/projects/project_ludwig_pb_gaps/apps/mummer/3.23"

input_assembly = join(data_dir, config["reference"])
reference_contigs = join(work_dir, "contigs.fasta")
input_reads = join(data_dir, config["reads"])
reads = join(work_dir, "raw_reads.fasta")
output_assembly = join(work_dir, "improved3.fasta")
result_assembly = join(results_dir, "improved3.fasta")
pickup = "-p {}".format(environ.get("PICKUP")) if environ.get("PICKUP") else ""

max_threads = 38


def log(name):
    return join(work_dir, "logs", name + ".log")


localrules:
    prepare_reference_contigs,
    copy_reads_to_workdir,
    copy_result_to_results_dir


rule ALL:
    input: result_assembly


rule prepare_reference_contigs:
    input: input_assembly
    output: reference_contigs
    shell:
        r"DBshow {input} | sed -E 's! :: Contig ([0-9]+)\[([0-9]+),([0-9]+)\]!/contig-\1/\2-\3!' > {output}"


rule copy_reads_to_workdir:
    input: input_reads
    output: reads
    shell:
        r"sed -E 's/^(>[^\s]+)\s+.*$/\1/' {input} > {reads}"


rule finisher_sc:
    input:
        reference_contigs,
        reads
    output: output_assembly
    threads: max_threads
    log:
        out = log("finisher_sc.out"),
        err = log("finisher_sc.err")
    shell:
        "cd {work_dir}; finisherSC.py {pickup} --fast True --large True --parallel {threads} {work_dir} {mummer_link} > {log[out]} 2> {log[err]}"


rule copy_result_to_results_dir:
    input: output_assembly
    output: result_assembly
    shell:
        "cp {input} {output}"
