#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""

TODO

* Delete cookie if session does not match

* Delete entry/tag/jid combination row upon removal of a tag.

"""

import argparse
from blasta.config import Cache, Settings, Share
from blasta.http.instance import HttpInstance
from blasta.database.sqlite import DatabaseSQLite
from blasta.utilities.logger import UtilitiesLogger
import json
import os
from os.path import getsize, exists
import shutil
import sys
import time
from typing import Optional
import uvicorn
import webbrowser


try:
    import tomllib
except:
    import tomli as tomllib


def main():
    directory_config = Settings.get_directory()
    sql_filename = os.path.join(directory_config, 'blasta.sql')
    directory_data = Share.get_directory()
    dbs_filename = os.path.join(directory_data, 'main.sqlite')
    if not exists(dbs_filename) or not getsize(dbs_filename):
        DatabaseSQLite.create_tables(sql_filename, dbs_filename)
    accounts = {}
    sessions = {}
    http_instance = HttpInstance(accounts, sessions)
    return http_instance.app

if __name__ == 'blasta.__main__':

    directory = os.path.dirname(__file__)

    # Copy data files
    directory_data = Share.get_directory()
    if not os.path.exists(directory_data):
        directory_assets = os.path.join(directory, 'assets')
        directory_assets_new = shutil.copytree(directory_assets, directory_data)
        print(f'Data directory {directory_assets_new} has been created and populated.')

    # Copy settings files
    directory_settings = Settings.get_directory()
    if not os.path.exists(directory_settings):
        directory_configs = os.path.join(directory, 'configs')
        directory_settings_new = shutil.copytree(directory_configs, directory_settings)
        print(f'Settings directory {directory_settings_new} has been created and populated.')

    # Create cache directories
    directory_cache = Cache.get_directory()
    if not os.path.exists(directory_cache):
        print(f'Creating a cache directory at {directory_cache}.')
        os.mkdir(directory_cache)
    for subdirectory in ('data', 'export', 'items'):
        subdirectory_cache = os.path.join(directory_cache, subdirectory)
        if not os.path.exists(subdirectory_cache):
            print(f'Creating a cache subdirectory at {subdirectory_cache}.')
            os.mkdir(subdirectory_cache)

    parser = argparse.ArgumentParser(
        prog='blasta',
        description='Blasta - A collaborative annotation system.',
        usage='%(prog)s [OPTION]...')
    parser.add_argument('-v', '--version', help='print version',
                        action='version', version='0.1')

    # Setup the command line arguments.
    parser.add_argument('-p', '--port', help='port number', dest='port')
    parser.add_argument('-o', '--open', help='open an html browser', action='store_const', const=True, dest='open')
    parser.add_argument('--no-log', '--nolog', help='Do not create a log file',
                        action='store_const', dest='nolog',
                        const=True, default=False)

    # Output verbosity options.
    parser.add_argument('-d', '--debug', help='set logging to DEBUG',
                        action='store_const', dest='loglevel',
                        const='debug', default='info')
    parser.add_argument('-q', '--quiet', help='set logging to ERROR',
                        action='store_const', dest='loglevel',
                        const='error', default='info')
    parser.add_argument('-w', '--warning', help='set logging to WARNING',
                        action='store_const', dest='loglevel',
                        const='warn', default='info')

    args = parser.parse_args()

    filename_log = os.path.join(directory_cache, 'blasta_log.csv')
    filename_log_old = os.path.join(directory_cache, 'blasta_log.csv.old')
    if os.path.exists(filename_log): os.rename(filename_log, filename_log_old)
    loglevel = args.loglevel
    logger = UtilitiesLogger('blasta')
    if not args.nolog:
        logger.set_filename(filename_log)
        with open(filename_log, 'a') as file:
            file.write('Time,,Level,Module,Function,JID/Path,Message\n')
    logger.set_level(loglevel)

    port = int(args.port or 8000)

    app = main()
    uvicorn.run(app, host='localhost', port=port)

    if args.open:
        # TODO Check first time
        webbrowser.open('http://localhost:{}/help/about'.format(port))
        webbrowser.open_new_tab('http://localhost:{}'.format(port))