#!/usr/bin/env python3

from yaml_manifest import Manifest


def format_download_params(wildcards):
    download_params = manifest.reads.lane_url(Path(wildcards.raw_file))
    base_url = download_params.get("base_url")
    download_params["base_url_param"] = f"--base_url {base_url}" if base_url else ""

    return download_params


manifest = Manifest.from_yaml(config.get("manifest_file"))
logs_dir = manifest.get_stage_logs("raw")
download_dir = manifest.get_dir("downloads")


wildcard_constraints:
    collected_file="|".join([str(x) for x in manifest.reads.flat_paths("raw")]),
    raw_file="|".join([str(x) for x in manifest.reads.all_raw_paths]),


rule target:
    input:
        manifest.reads.flat_paths("raw"),


rule collect_lane_files:
    input:
        lambda wildcards: manifest.reads.collected_path_to_raw_paths(
            Path(wildcards.collected_file)
        ),
    output:
        Path("{collected_file}"),
    shell:
        "cat {input} > {output}"


rule download_file:
    output:
        read_file=Path("{raw_file}"),
        check_file=Path("{raw_file}.check.txt"),
    log:
        Path(logs_dir, "download_file", "{raw_file}.log"),
    retries: 3
    params:
        params=format_download_params,
    shell:
        "bpa-file-downloader "
        "--file_checksum {params.params[md5sum]} "
        "{params.params[base_url_param]} "
        "{params.params[url]} "
        "{output.read_file} "
        "&> {log}"
