#!/usr/bin/env python
import argparse
import logging
import sys
from os import path, mkdir, makedirs
from pathlib import Path

import ete3.ncbi_taxonomy.ncbiquery

from card_live_dashboard.service.ConfigManager import ConfigManager

script_name = path.basename(path.realpath(sys.argv[0]))
logger = logging.getLogger(__name__)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(prog=script_name, description='Initialize the CARD:Live dashboard home directory.')
    parser.add_argument('cardlive_home_dir', nargs=1)

    args = parser.parse_args()
    if len(args.cardlive_home_dir) != 1:
        raise Exception('You must specify a valid cardlive_home_dir directory')
    else:
        cardlive_home_path = Path(args.cardlive_home_dir[0])
        cardlive_config_path = cardlive_home_path / 'config'
        cardlive_data_path = Path(cardlive_home_path, 'data', 'card_live')
        cardlive_db_path = Path(cardlive_home_path, 'db')
        cardlive_taxa_file = Path(cardlive_db_path, 'taxa.sqlite')

        if not cardlive_home_path.exists():
            mkdir(cardlive_home_path)

        print(f'Initalizing CARD:Live home directory as [{cardlive_home_path}]')

        if not cardlive_config_path.exists():
            mkdir(cardlive_config_path)

        print(f'Writing example configurations to [{cardlive_config_path}]')
        config_manager = ConfigManager(cardlive_home_path)
        config_manager.write_example_config()

        if not cardlive_data_path.exists():
            makedirs(cardlive_data_path)
        else:
            logger.warning(f'Data directory [{cardlive_data_path}] already exists.')

        if not cardlive_db_path.exists():
            mkdir(cardlive_db_path)
        else:
            logger.warning(f'Database directory [{cardlive_db_path}] already exists.')

        if not cardlive_taxa_file.exists():
            print(f'Initializing NCBI Taxonomy database in [{cardlive_db_path}]')
            ete3.ncbi_taxonomy.ncbiquery.update_db(dbfile=str(cardlive_taxa_file))
        else:
            logger.warning(f'NCBI Taxonomy database [{cardlive_taxa_file}] already exists.')

        print(f'Finished initializing CARD:Live home directory as [{cardlive_home_path}]')
        print(f'Please add CARD:Live JSON data to [{cardlive_data_path}]',
              f'and start the CARD:Live dashboard by running "card-live-dash-prod {cardlive_home_path}"')
