#!/usr/bin/env python3
"""

Main entry-point for pyinseq

"""
# Setup up universal logger
from pyinseq.logger import pyinseq_logger

pyinseq_logger.setup_logger()

import sys
import traceback

# Module imports
from pyinseq.parsers import get_args
from pyinseq.tests.test_utils import run_pytest
from pyinseq.settings import SETTINGS_CONSTRUCTORS
from pyinseq.utils import (
    write_config_file,
    execute,
    create_experiment_directories,
    pickle_object,
    get_config_dict,
)

logger = pyinseq_logger.logger


if __name__ == "__main__":
    ### START HERE ###
    logger.info("Process command line arguments")
    parser, args = get_args()
    # Print help if no args given
    if not sys.argv[1:]:
        parser.print_help()
        exit(0)

    if args.test:
        run_pytest()
        exit(0)

    if args.config:
        logger.info(f"Config file provided as: {args.config}")
        config_file = args.config
    else:
        config_file = write_config_file(
            args, format=args.config_format, default=args.get_default_config
        )

    config_dict = get_config_dict(config_file)
    command = config_dict["command"]

    constructor = SETTINGS_CONSTRUCTORS[command]
    settings = constructor(config_file)
    create_experiment_directories(settings)

    if settings.command != "genomeprep":
        settings.dump_sample_dict_to_yml()

    # Pickle settings
    pickle_object(settings, settings.settings_pickle)
    logger.info(f"Workflow selected: {settings.command}")
    logger.info(f"***** BEGIN {settings.command.upper()} WORKFLOW *****")

    try:
        execute(settings.snakemake_cmd)
    except Exception as e:
        logger.exception("Exception while executing snakemake subprocess")
        exc_type, exc_value, exc_tb = sys.exc_info()
        traceback.print_tb(exc_tb)
        traceback.print_exc()

    # Cleanup settings and combine logging output
    settings.clean_up()
    logger.info(f"***** {settings.command.upper()} WORKFLOW FINISHED *****")
