from os import listdir
from os.path import isfile, basename, splitext

def getFilePath(sample_name, forward=True):
    if forward:
        path = config['entries'][sample_name]['main']['forward_reads']
    else:
        path = config['entries'][sample_name]['main']['reverse_reads']
    return path

def fastp_parameters():
    forward_adapter_command = "--adapter_sequence %%ADAPTER_SEQUENCE_FORWARD%%" if "%%ADAPTER_SEQUENCE_FORWARD%%" else ""
    reverse_adapter_command = "--adapter_sequence_r2 %%ADAPTER_SEQUENCE_REVERSE%%" if "%%ADAPTER_SEQUENCE_REVERSE%%" else ""
    return " ".join([parameter for parameter in [
                                                "%%PHRED_SCORE_TYPE%%", 
                                                "%%TRIM_LOW_QUALITIES%%", 
                                                "--cut_mean_quality %%QUALITY_THRESHOLD%%",
                                                "%%ADAPTER_TRIMMING%%",
                                                forward_adapter_command,
                                                reverse_adapter_command
                                                ] if parameter]) 

rule all:
    input:
        expand("preprocessing/fastp/{A}_fastp_report.html", A=config['entries'].keys()),
        expand("preprocessing/{A}_R{DIRECTION}.fastq.gz", A=config['entries'].keys(), DIRECTION=[1,2]),
        expand("preprocessing/fastp/{A}_fastp_results.json", A=config['entries'].keys()),
        ".report/modules/fastp.html"


rule fastp:
    input:
        reads_forward=lambda wildcard: getFilePath(wildcard.sample, True),
        reads_reverse=lambda wildcard: getFilePath(wildcard.sample, False)
    output:
        output_forward="preprocessing/{sample}_R1.fastq.gz",
        output_reverse="preprocessing/{sample}_R2.fastq.gz",
        html= "preprocessing/fastp/{sample}_fastp_report.html",
        json= "preprocessing/fastp/{sample}_fastp_results.json"
    params:
        additional_settings = fastp_parameters()
    conda:
        "../lib/conda_env.yaml"
    group:
        "fastqc"
    threads:
        1
    shell:
        "fastp %%ADDITIONAL_PARAMETER%% {params.additional_settings} --thread {threads} -i {input.reads_forward} -I {input.reads_reverse} -o {output.output_forward} -O {output.output_reverse} --html {output.html} --json {output.json}"

rule groups_file:
    input:
        html=expand("preprocessing/fastp/{A}_fastp_report.html", A=config['entries'].keys())
    output:
        groups="preprocessing/fastp/groups.tsv"
    run:
        with open(output.groups, 'w') as out:
            out.write("Sample\tReportn")
            for entry in config['entries'].keys():
                out.write("{}\t{}_fastp_report.html\n".format(entry, entry))


rule generate_report:
    input:
        reports_list="preprocessing/fastp/groups.tsv",
        reports=expand("preprocessing/fastp/{A}_fastp_report.html", A=config['entries'].keys())
    output:
        fastp_data=".report/data/fastp_data.js",
        fastp_html=".report/modules/fastp.html",
        fastp_js=".report/js/modules/fastp.js",
        fastp_reports=directory(".report/modules/fastp/")
    conda:
        "../lib/conda_env.yaml"
    group:
        "fastp_report"
    shell:
        "mkdir -p {output.fastp_reports} && cp {input.reports} {output.fastp_reports} && "
        "python3 lib/generate_report_data.py --reports {input.reports_list} --output {output.fastp_data} && "
        "cp lib/report/fastp.html {output.fastp_html} && "
        "cp lib/report/fastp.js {output.fastp_js}"
