from __future__ import absolute_import

import argparse
import os
from builtins import input
import sys
import yaml
from os.path import exists, dirname
import sh
from phigaro.helper import (
    SetupHelper,
    HelperException,
    download_pvogs,
    download_file,
)


def create_config(no_update_db, config_path, pvogs_dir, force):
    config_dir = dirname(config_path)
    if not exists(config_dir):
        os.makedirs(config_dir)

    if exists(config_path) and not force:
        print("Phigaro already configured")
        return

    helper = SetupHelper(no_update_db)
    try:
        config = helper.setup()
        # TODO: refactor 'allpvoghmms' const
        config["hmmer"]["pvog_path"] = os.path.join(pvogs_dir, "allpvoghmms")

        print("Found Prodigal in: {}".format(config["prodigal"]["bin"]))
        print("Found HMMER in: {}".format(config["hmmer"]["bin"]))
        print("HMMER model in: {}".format(config["hmmer"]["pvog_path"]))

        with open(config_path, "w") as f:
            yaml.safe_dump(config, f, default_flow_style=False)
    except HelperException as ex:
        sys.stdout.write(ex.message + "\n")
        exit(1)
        return


def read_config_and_download_pvogs(config_path):
    if not exists(config_path):
        print("You must configure phigaro first")
        exit(1)

    with open(config_path) as f:
        config = yaml.load(f, Loader=yaml.FullLoader)
        pvogs_dir = dirname(config["hmmer"]["pvog_path"])
        print("Downloading models to {}".format(pvogs_dir))
        download_pvogs("http://download.ripcm.com/phigaro/", pvogs_dir)


def download_test_data():
    test_data_dir = input(
        "Please, write a full path to the directory you want test data saved to"
        + "(by default - working directory):"
    )
    if test_data_dir == "":
        test_data_dir = os.getcwd()
    test_data_dir = test_data_dir.replace("\\", "/")
    test_data_dir = (
        test_data_dir + "/test_data"
        if (test_data_dir[-1] != "/")
        else test_data_dir + "test_data"
    )
    base_url = "https://cdn.jsdelivr.net/gh/bobeobibo/phigaro/test_data/"
    if not exists(test_data_dir):
        os.makedirs(test_data_dir)
    download_file("Bacillus_anthracis_str_ames.fna", base_url, test_data_dir)
    download_file("Bacillus_anthracis_str_ames.phg", base_url, test_data_dir)
    download_file("Bacillus_anthracis_str_ames.phg.html", base_url, test_data_dir)


def main():
    home = os.getenv("HOME")
    phigaro_dir = os.path.join(home, ".phigaro")
    phigaro_config = os.path.join(phigaro_dir, "config.yml")
    pvogs_dir = os.path.join(phigaro_dir, "pvog")

    parser = argparse.ArgumentParser(
        prog="phigaro-setup",
        description="Phigaro setup helper",
        formatter_class=argparse.ArgumentDefaultsHelpFormatter,
    )

    parser.add_argument(
        "-c",
        "--config",
        default=phigaro_config,
        help="Path to a config.yml, default is {}".format(phigaro_config),
    )
    parser.add_argument(
        "-p",
        "--pvog",
        default=pvogs_dir,
        help="pvogs directory, default is {}".format(pvogs_dir),
    )
    parser.add_argument(
        "-f",
        "--force",
        action="store_true",
        help="Force configuration and rewrite config.yml if exists",
    )
    parser.add_argument(
        "--no-updatedb", action="store_true", help="Do not run sudo updatedb"
    )
    # parser.add_argument('--download-models', action='store_true', help='Skip configuration step and download models')
    args = parser.parse_args()
    if args.force:
        sh.rm("-rf", args.config)
    create_config(
        no_update_db=args.no_updatedb,
        config_path=args.config,
        pvogs_dir=args.pvog,
        force=args.force,
    )

    read_config_and_download_pvogs(args.config)
    while True:
        overwrite = input("Do you want to download test data Y/N?")
        if overwrite.upper() in {"Y", "YES"}:
            overwrite = "Y"
            break
        elif overwrite.upper() in {"N", "NO"}:
            overwrite = "N"
            break
    if overwrite == "Y":
        download_test_data()
        print("To run phigaro on test data enter the following command:")
        print("")
        print(
            "       phigaro -f test_data/Bacillus_anthracis_str_ames.fna -o test_data/Bacillus_anthracis_str_ames.phg -p --not-open"
        )
        print("")

    print(
        "The installation process is finished. If you have any questions, you can visit our github: https://github.com/bobeobibo/phigaro."
    )


if __name__ == "__main__":
    main()
