from mmaseq.utils.PATH import *
from mmaseq.utils.logging_setup import initiate_log, adjust_log
from mmaseq.utils.classes import import_dataset, list_files
from pathlib import Path
import pandas as pd


def sample(wc):
    return samples[wc.sample]


# Initiate logging
###################################################################
logger = initiate_log("MMAseq Pipeline")
adjust_log(logger, int(config["verbosity"]))

logger.info("Setting up pipeline variables")
logger.debug("Importing user input from config file")

# Read user input
###################################################################
samplesheet_path = Path(config["samplesheet"])
outdir = Path(config["outdir"])
ignore_assemblies = config["ignore_assemblies"]
deploy_dir = Path(config["deploy_dir"])
species_configs = Path(config["species_configs"])

logger.trace(("User input (by config):\n"
    f" - samplesheet_path: {samplesheet_path}"
    f" - deploy_dir: {deploy_dir}"
    f" - outdir: {outdir}"))

# Deduce variables
###################################################################
logdir = outdir / "Logs"
database_dir = deploy_dir / "Databases"
logger.trace(("Deduced variables:\n"
    f" - logdir: {logdir}"
    f" - database_dir: {database_dir}"))

# Read config files
#################################################################
logger.debug("Creating sample specific input and output objects")
logger.trace("Reading samplesheet")

logger.trace("Generating Sample class objects")
samples = import_dataset(samplesheet_path, species_configs, outdir)

logger.trace("Determining output files")
raw_files = list_files(samples, raw = True)
result_files = list_files(samples, raw = False)

#################################
logger.info("Initiating pipeline")

rule versions:
    input:
        deploy_dir = deploy_dir
    output:
        versions_file = outdir / "Conda_tools_version.tsv"
    message:
        "[versions]: Conda versions are being determined and written to {output.versions_file}"
    script:
        SCRIPTS_DIR / "versions.py"


rule copy:
    input:
        raw = raw_files,
        versions_file = rules.versions.output.versions_file
    output:
        files = result_files
    log:
        stdout = "%s/copy.log" %logdir
    message:
        "[copy_results] Copying results files"
    shell:
        """
        for FILE in {input.raw}; do
            RAWDIR=$(dirname $FILE)
            NEWDIR=$(echo "$RAWDIR" | sed 's#/raw/#/#')
            
            echo "Copying $FILE to $NEWDIR/" >> {log.stdout} 2>&1
            mkdir -p $NEWDIR
            cp -f $FILE $NEWDIR/
        done
        """



# rule table:
#     input:
#         files = rules.copy.output.files,
#         versions = rules.versions.output.versions_file
#     params:
#         results_dict = all_result_files
#     output:
#         long = "%s/results_long.tsv" %outdir
#     log:
#         stdout = "%s/table.log" %logdir
#     message:
#         "[keep]: Generating long table"
#     run:
#         all_results_long = results_aggregator.generate_long_results(params.results_dict)
#         all_results_long.to_csv(output.long, sep = "\t", index = False)


rule clean:
    input:
        raw = rules.copy.input.raw,
        files = rules.copy.output.files
    log:
        stdout = "%s/clean.log" %logdir
    message:
        "[clean_results]: Removing intermediate folders"
    shell:
        """
        for DIR in $(dirname {input.raw}); do
           RAW=$(dirname $DIR)
           if [ -d "$RAW" ]; then 
               echo "Removing $RAW" > {log.stdout} 2>&1
               rm -r $RAW
           fi
        done
        """


include : "rules/Databases.smk"
include : "rules/Long.smk"
include : "rules/Paired.smk"
include : "rules/Analysis.smk"
