#!/usr/bin/env python3
#
#

""" Console Bot. """


#import warnings
#warnings.simplefilter("ignore")

## bootstrap

import os, sys
sys.path.insert(0, os.getcwd())

from ggz.version import getversion

from ggz.utils.log import setloglevel

## command line parsing

from optparse import OptionParser
parser = OptionParser(usage='usage: %prog [options] <appid>', version='%prog ' + getversion())
parser.add_option('-d', '--datadir', type='string', default=False, dest='datadir', help="datadir to use")
parser.add_option('-c', '--channel', type='string', default=False, dest='channel', help="channel to operate on")
parser.add_option('-n', '--name', type='string', default=False, dest='name', help="name of the console bot")
parser.add_option('-l', '--loglevel', type='string', default=False, dest='loglevel', help="logging level")
parser.add_option('-f', '--fast', action="store_true", default=False, dest='fast', help="boot fast (dont load myplugs)")
parser.add_option('-e', '--exceptions', action="store_true", default=False, dest='exceptions', help="show exceptions on exit")
parser.add_option('', '--nocolors', action="store_true", default=False, dest='nocolors', help="enable the use of colors")
parser.add_option('', '--fleet', action="store_true", default=False, dest='fleet', help="start the fleet")
parser.add_option('', '--nourl', action="store_true", default=False, dest='nourl', help="disable geturl functionality")

opts, args = parser.parse_args()
opts.args = args

if not opts.args: print(getversion('CONSOLE'))
if opts.datadir:
    if not os.path.isdir(opts.datadir): os.mkdir(opts.datadir)
    from ggz.lib.datadir import setdatadir
    setdatadir(opts.datadir)

## make config from cmndline options

from ggz.utils.log import setloglevel
setloglevel(opts.loglevel or "error", not opts.nocolors)

if opts.nourl:
    from ggz.utils.url import url_disable
    url_disable()

from ggz.lib.boot import boot, plugin_packages
if opts.fast: boot(opts.datadir, fast=True)
else: boot(opts.datadir)

## jsb imports

from ggz.utils.exception import handle_exception
from ggz.utils.generic import waitforqueue, waitevents
from ggz.drivers.console.bot import ConsoleBot
from ggz.lib.config import Config
from ggz.lib.errors import NoOwnerSet, NoSuchCommand
from ggz.lib.commands import cmnds
from ggz.lib.exit import globalshutdown
from ggz.lib.fleet import getfleet
from ggz.lib.threads import start_new_thread
from ggz.lib.datadir import getdatadir

## basic imports

import getpass
import time
import logging

## start the bot
name = opts.name or "default-console"
cfg = Config("fleet" + os.sep + name + os.sep + 'config')
if not cfg.owner: cfg.owner = []
userid = getpass.getuser() + '@' + cfg.uuid

if userid not in cfg.owner: cfg.owner.append(userid) ; cfg.save()

try:
    bot = ConsoleBot(cfg)
except NoOwnerSet:
    print("the owner is not set in %s" % cfg.cfile)
    os._exit(1)

if opts.args:
    cmndstring = ";"
    for cmnd in opts.args:
        if "|" in cmnd: break
        cmndstring += "%s " % cmnd
    event = bot.make_event(userid, opts.channel or userid, cmndstring.strip(), showall=True)
    event.nodispatch = False
    try: event.execute(True)
    except NoSuchCommand as ex: print("no %s command found." % str(ex).strip())
    print("")
    try:
        sys.stdout.close()
    except: pass
    os._exit(0)

print("datadir is %s" % getdatadir())
bot.start(False)
if bot.maincfg.dbenable: print("dbtype is %s" % bot.maincfg.dbtype)
#print("plugins packages are %s" % ", ".join(plugin_packages))
fleet = getfleet()
fleet.addbot(bot)

if opts.fleet:
    bots = fleet.loadall()
    logging.error("starting fleet %s" % fleet.list())
    start_new_thread(fleet.startall, ())

bot.startshell()
if opts.exceptions:
    from ggz.utils.exception import exceptionevents, exceptionlist
    for (event, msg) in exceptionevents: print("EXCEPTION: %s - %s" % (event.txt,msg))
    for msg in exceptionlist: print("EXCEPTION: %s" % msg)

globalshutdown()
