#!/usr/bin/env bash
VERSION=4.0.0
CONDA_ENV=$(which bactopia | sed 's=bin/bactopia==')
BACTOPIA_NF="${CONDA_ENV}/share/bactopia-${VERSION}" 

# set -x if --verbose in args
if [[ "$*" == *"--verbose"* ]]; then
    set -x
fi

# If no user input, print usage
if [[ $# == 0 ]]; then
    echo "bactopia - v${VERSION}"
    echo ""
    echo "Available Commands"
    echo "bactopia - Execute the Bactopia Nextflow pipeline"
    echo ""
    echo "bactopia citations - Print citation for datasets, tools and Bactopia"
    echo ""
    echo "bactopia datasets - Download optional datasets to supplement your analyses with Bactopia"
    echo ""
    echo "bactopia download - Build Bactopia Conda, Docker,and or Singularity environments "
    echo ""
    echo "bactopia prepare - Create a 'file of filenames' for input FASTQ files"
    echo ""
    echo "bactopia search - Query Taxon ID or Study Accession against ENA for input accessions"
    echo ""
    echo "bactopia summary - Generate a summary table from the Bactopia results"
    echo ""
    echo "bactopia atb-formatter - Restructure All-the-Bacteria assemblies to allow usage with Bactopia Tools"
    echo ""
    echo "bactopia --citation - Print the Bactopia citation"
    echo "bactopia --version - Print the Bactopia version"
    echo ""
    echo "Print Usages:"
    echo "bactopia --help"
    echo "bactopia citations --help"
    echo "bactopia download --help"
    echo "bactopia prepare --help"
    echo "bactopia search --help"
    echo "bactopia summary --help"
    echo ""
    echo "Example Commands"
    echo "bactopia --R1 SAMPLE_R1.fastq.gz --R2 SAMPLE_R2.fastq.gz --sample SAMPLE"
    echo "bactopia --wf pangenome --bactopia /path/to/bactopia/results"
    echo ""
    echo "bactopia download --use_defaults"
    echo ""
    echo "bactopia prepare --path my-fastq-dir > my-fastqs.txt"
    echo "bactopia --fastqs my-fastqs.txt"
    echo ""
    echo "bactopia search --query PRJNA480016 --limit 20"
    echo "bactopia --accessions ena-accessions.txt"
    echo ""
    echo "bactopia summary --bactopia /path/to/bactopia/results"
    echo ""
    exit
fi

if [[ "$1" == "prepare" ]]; then
    bactopia-prepare "${@:2}"
elif [[ "$1" == "search" ]]; then
    bactopia-search "${@:2}"
elif [[ "$1" == "datasets" ]]; then
    bactopia-datasets --bactopia-path "${BACTOPIA_NF}" "${@:2}"
elif [[ "$1" == "download" ]]; then
    bactopia-download --bactopia-path "${BACTOPIA_NF}" "${@:2}"
elif [[ "$1" == "citation" ]] || [[ "$1" == "--citation" ]]; then
    echo "Petit III RA, Read TD, Bactopia: a flexible pipeline for complete analysis of bacterial "
    echo "genomes. mSystems. 5 (2020), https://doi.org/10.1128/mSystems.00190-20"
elif [[ "$1" == "citations" ]]; then
    bactopia-citations --bactopia-path "${BACTOPIA_NF}" "${@:2}"
elif [[ "$1" == "summary" ]]; then
    bactopia-summary "${@:2}"
elif [[ "$1" == "atb-formatter" ]]; then
    bactopia-atb-formatter "${@:2}"
elif [[ "$1" == "atb-downloader" ]]; then
    bactopia-atb-downloader "${@:2}"
elif [[ "$1" == "version" ]] || [[ "$1" == "--version" ]]; then
    echo "bactopia ${VERSION}"
elif [[ "$*" == *"--list_wfs"* ]]; then
    bactopia-workflows --bactopia-path "${BACTOPIA_NF}" --list_wfs
else
    # Check if Conda environments need to be built
    PREBUILD=1
    BUILD_TYPE="conda"
    if [[ "$*" == *"singularity"* ]] || [[ "$*" == *"apptainer"* ]] || [[ "$*" == *"arcc"* ]]; then
        BUILD_TYPE="singularity"
    elif  [[ "$*" == *"docker"* ]] || [[ "$*" == *"arm"* ]]; then
        BUILD_TYPE="docker"
    fi

    # If these are used, skip pre-build/system check
    CHECKS=("help" "help_all" "nfconfig" "list_wfs")
    SYSINFO_OPTS=""
    for check in "${CHECKS[@]}"; do
        if [[ "$*" == *"${check}"* ]]; then
            PREBUILD=0
        fi
    done

    if [[ "${PREBUILD}" -eq 1 ]]; then
        BUILD_OPTS=""
        if [[ "$*" == *"arcc"* ]]; then
            # Get singularity cache from config
            BUILD_OPTS=$(grep "singularity_cache =" ${BACTOPIA_NF}/conf/profiles/arcc.config | sed "s/^.* = //;s/'//g;s/^/--singularity_cache /")
        fi

        # Build conda/docker/singularity envs, rebuild out of sync envs, skip existing
        bactopia-download --bactopia-path "${BACTOPIA_NF}" --envtype "${BUILD_TYPE}" ${BUILD_OPTS} "${@:1}"

        # Auto-detect host RAM / CPUs for local profiles when user hasn't set caps.
        # bactopia-sysinfo decides eligibility and emits the additions (or nothing).
        SYSINFO_OPTS=$(bactopia-sysinfo "$@")
    fi

    # Create custom work dir
    WORK_DIR=""
    WORK_ARG=""
    WORK_DIR_IS_DEFAULT=1
    if echo "$*" | sed -r 's/ ([-]+)/\n\1/g' | grep "^-w \|-work-dir" > /dev/null; then
        # User specified a work directory
        WORK_DIR_IS_DEFAULT=0
    else
        # User did not specify a work directory, we'll use custom one based on workflow name
        WORK_DIR="$(pwd)/work/"
        WORK_ARG="-w ${WORK_DIR}"
    fi

    # Create custom work dir
    OUTPUT_ARG=""
    if echo "$*" | sed -r 's/ ([-]+)/\n\1/g' | grep "^-output-format" > /dev/null; then
        # User specified an output format
        OUTPUT_ARG=""
    else
        # User did not specify an output format, set it to 'none'
        OUTPUT_ARG="-output-format none"
    fi

    # Get path to workflow
    WF_ARG="bactopia"
    WF_NEXT=0
    for arg in "$@"; do
        if [[ "${arg}" == "--wf" ]]; then
            # take the next argument as the workflow name
            WF_NEXT=1
        elif [[ "${WF_NEXT}" -eq 1 ]]; then
            WF_ARG="${arg}"
            break
        elif [[ "${arg}" == --wf=* ]]; then
            WF_ARG=$(echo "${arg}" | sed 's/--wf=//')
            break
        fi
    done
    WF_PATH=$(bactopia-workflows --bactopia-path "${BACTOPIA_NF}" --wf "${WF_ARG}")

    # if WF_PATH is empty, exit with error
    if [[ -z "${WF_PATH}" ]]; then
        exit 1
    fi

    # Execute Bactopia Nextflow pipeline
    OPTS="${WORK_ARG} ${OUTPUT_ARG} ${SYSINFO_OPTS}"
    if nextflow run ${WF_PATH} ${OPTS} "${@:1}"; then
        # bactopia finished successfully
        if [[ "${WORK_DIR_IS_DEFAULT}" -eq 1 ]]; then
            # user asked for work dir to be cleaned up
            WORK_DIR_SIZE=$(du -h -s "${WORK_DIR}" | cut -f 1)
            echo "The work directory (${WORK_DIR}) is currently ${WORK_DIR_SIZE}, and can be removed if no longer needed"
        fi
    else
        exit $?
    fi
fi
