/*
 * -------------------------------------------------
 *  nf-core/mag Nextflow config file
 * -------------------------------------------------
 * Default config options for all environments.
 */

// Global default params, used in configs
params {

  // Workflow flags
  input                      = ''
  single_end                 = false

  // short read preprocessing options
  save_trimmed_fail          = false
  fastp_qualified_quality    = 15
  fastp_cut_mean_quality     = 15
  keep_phix                  = false
  // phix_reference           = "ftp://ftp.ncbi.nlm.nih.gov/genomes/genbank/viral/Enterobacteria_phage_phiX174_sensu_lato/all_assembly_versions/GCA_002596845.1_ASM259684v1/GCA_002596845.1_ASM259684v1_genomic.fna.gz"
  phix_reference             = "${baseDir}/assets/data/GCA_002596845.1_ASM259684v1_genomic.fna.gz"
  host_fasta                 = ''
  host_genome                = ''
  host_removal_verysensitive = false
  host_removal_save_ids      = false

  // binning options
  binning_map_mode           = 'group'
  skip_binning               = false
  min_contig_size            = 1500
  min_length_unbinned_contigs = 1000000
  max_unbinned_contigs       = 100

  // assembly options
  coassemble_group           = false
  spades_options             = ''
  megahit_options            = ''
  skip_spades                = false
  skip_spadeshybrid          = false
  skip_megahit               = false
  skip_quast                 = false

  // taxonomy options
  centrifuge_db              = ''
  kraken2_db                 = ''
  skip_krona                 = false
  cat_db                     = ''
  cat_db_generate            = false
  save_cat_db                = false
  gtdb                       = "https://data.gtdb.ecogenomic.org/releases/release202/202.0/auxillary_files/gtdbtk_r202_data.tar.gz"
  gtdbtk_min_completeness    = 50.0
  gtdbtk_max_contamination   = 10.0
  gtdbtk_min_perc_aa         = 10
  gtdbtk_min_af              = 0.65
  gtdbtk_pplacer_cpus        = 1
  gtdbtk_pplacer_scratch     = true

  // long read preprocessing options
  skip_adapter_trimming      = false
  keep_lambda                = false
  longreads_min_length       = 1000
  longreads_keep_percent     = 90
  longreads_length_weight    = 10
  // lambda_reference         = "ftp://ftp.ncbi.nlm.nih.gov/genomes/genbank/viral/Escherichia_virus_Lambda/all_assembly_versions/GCA_000840245.1_ViralProj14204/GCA_000840245.1_ViralProj14204_genomic.fna.gz"
  lambda_reference           = "${baseDir}/assets/data/GCA_000840245.1_ViralProj14204_genomic.fna.gz"

  // Bin QC
  skip_busco                 = false
  busco_reference            = ''
  busco_download_path        = ''
  busco_auto_lineage_prok    = false
  save_busco_reference       = false

  // Reproducibility options
  megahit_fix_cpu_1          = false
  spades_fix_cpus            = -1
  spadeshybrid_fix_cpus      = -1
  metabat_rng_seed           = 1

  // References
  igenomes_base              = 's3://ngi-igenomes/igenomes'
  igenomes_ignore            = false
  
  // MultiQC options
  multiqc_config             = ''
  multiqc_title              = ''
  max_multiqc_email_size     = '25.MB'
  skip_multiqc               = false

  // Boilerplate options
  outdir                     = './results'
  tracedir                   = "${params.outdir}/pipeline_info"
  publish_dir_mode           = 'copy'
  email                      = ''
  email_on_fail              = ''
  plaintext_email            = false
  monochrome_logs            = false
  help                       = false
  enable_conda               = false
  singularity_pull_docker_container = false
  validate_params            = true
  show_hidden_params         = false
  schema_ignore_params       = 'genomes,modules'
  
  // Config options
  custom_config_version      = 'master'
  custom_config_base         = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}"
  hostnames                  = [:]
  config_profile_description = ''
  config_profile_contact     = ''
  config_profile_url         = ''
  config_profile_name        = null

  // Max resource options
  // Defaults only, expecting to be overwritten
  max_memory                 = '128.GB'
  max_cpus                   = 16
  max_time                   = '240.h'

}

// Load base.config by default for all pipelines
includeConfig 'conf/base.config'

// Load modules.config for DSL2 module specific options
includeConfig 'conf/modules.config'

// Load nf-core custom profiles from different Institutions
try {
  includeConfig "${params.custom_config_base}/nfcore_custom.config"
} catch (Exception e) {
  System.err.println("WARNING: Could not load nf-core/config profiles: ${params.custom_config_base}/nfcore_custom.config")
}

// Load igenomes.config if required
if (!params.igenomes_ignore) {
  includeConfig 'conf/igenomes.config'
} else {
  params.genomes = [:]
}

profiles {
  debug { process.beforeScript = 'echo $HOSTNAME' }
  conda {
    params.enable_conda      = true
    docker.enabled           = false
    singularity.enabled      = false
    podman.enabled           = false
    shifter.enabled          = false
    charliecloud.enabled     = false
  }
  docker {
    docker.enabled           = true
    // Avoid this error:
    //   WARNING: Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap.
    // Testing this in nf-core after discussion here https://github.com/nf-core/tools/pull/351
    // once this is established and works well, nextflow might implement this behavior as new default.
    docker.runOptions        = '-u \$(id -u):\$(id -g)'
    singularity.enabled      = false
    podman.enabled           = false
    shifter.enabled          = false
    charliecloud.enabled     = false
  }
  singularity {
    singularity.enabled      = true
    singularity.autoMounts   = true
    docker.enabled           = false
    podman.enabled           = false
    shifter.enabled          = false
    charliecloud.enabled     = false
  }
  podman {
    podman.enabled           = true
    docker.enabled           = false
    singularity.enabled      = false
    shifter.enabled          = false
    charliecloud.enabled     = false
  }
  shifter {
    shifter.enabled          = true
    docker.enabled           = false
    singularity.enabled      = false
    podman.enabled           = false
    charliecloud.enabled     = false
  }
  charliecloud {
    charliecloud.enabled     = true
    docker.enabled           = false
    singularity.enabled      = false
    podman.enabled           = false
    shifter.enabled          = false
  }
  test                { includeConfig 'conf/test.config'                }
  test_host_rm        { includeConfig 'conf/test_host_rm.config'        }
  test_hybrid         { includeConfig 'conf/test_hybrid.config'         }
  test_hybrid_host_rm { includeConfig 'conf/test_hybrid_host_rm.config' }
  test_busco_auto     { includeConfig 'conf/test_busco_auto.config'     }
  test_full           { includeConfig 'conf/test_full.config'           }
}

// Export these variables to prevent local Python/R libraries from conflicting with those in the container
env {
  PYTHONNOUSERSITE = 1
  R_PROFILE_USER = "/.Rprofile"
  R_ENVIRON_USER = "/.Renviron"
}

// Capture exit codes from upstream processes when piping
process.shell = ['/bin/bash', '-euo', 'pipefail']

def trace_timestamp = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss')
timeline {
  enabled = true
  file = "${params.tracedir}/execution_timeline_${trace_timestamp}.html"
}
report {
  enabled = true
  file = "${params.tracedir}/execution_report_${trace_timestamp}.html"
}
trace {
  enabled = true
  file = "${params.tracedir}/execution_trace_${trace_timestamp}.txt"
}
dag {
  enabled = true
  file = "${params.tracedir}/pipeline_dag_${trace_timestamp}.svg"
}

manifest {
  name = 'nf-core/mag'
  author = 'Hadrien Gourlé, Daniel Straub, Sabrina Krakau'
  homePage = 'https://github.com/nf-core/mag'
  description = 'Assembly, binning and annotation of metagenomes'
  mainScript = 'main.nf'
  nextflowVersion = '!>=21.04.0'
  version = '2.0.0'
}

// Function to ensure that resource requirements don't go beyond
// a maximum limit
def check_max(obj, type) {
  if (type == 'memory') {
    try {
      if (obj.compareTo(params.max_memory as nextflow.util.MemoryUnit) == 1)
        return params.max_memory as nextflow.util.MemoryUnit
      else
        return obj
    } catch (all) {
      println "   ### ERROR ###   Max memory '${params.max_memory}' is not valid! Using default value: $obj"
      return obj
    }
  } else if (type == 'time') {
    try {
      if (obj.compareTo(params.max_time as nextflow.util.Duration) == 1)
        return params.max_time as nextflow.util.Duration
      else
        return obj
    } catch (all) {
      println "   ### ERROR ###   Max time '${params.max_time}' is not valid! Using default value: $obj"
      return obj
    }
  } else if (type == 'cpus') {
    try {
      return Math.min( obj, params.max_cpus as int )
    } catch (all) {
      println "   ### ERROR ###   Max cpus '${params.max_cpus}' is not valid! Using default value: $obj"
      return obj
    }
  }
}

// Functions to fix number of cpus to allow reproducibility for MEGAHIT and SPAdes
// if corresponding parameters are specified, number of cpus is not increased with retries
def check_megahit_cpus (x, attempt ) {
  if (params.megahit_fix_cpu_1) return 1
  else return check_max (x * attempt, 'cpus' )
}
def check_spades_cpus (x, attempt ) {
  if (params.spades_fix_cpus != -1) return check_max (params.spades_fix_cpus, 'cpus' )
  else return check_max (x * attempt, 'cpus' )
}
def check_spadeshybrid_cpus (x, attempt ) {
  if (params.spadeshybrid_fix_cpus != -1) return check_max (params.spadeshybrid_fix_cpus, 'cpus' )
  else return check_max (x * attempt, 'cpus' )
}
