#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Simple Bot (SimpBot)
# Copyright 2016, Ismael Lugo (kwargs)

import argparse
import simpbot
import logging

motd = """
  ____  _  __    _______  ____   ______________
 / ___|(_)|  \  /   ___ \| __ \ / _ \___   ___/
 | |__ | ||   \/   |___||||__||| / \ |  | |
 \___ \| || |\  /|  ____/| __ || | | |  | |
 ___| || || | \/ | |     ||__||| \_/ |  | |
/____ /|_|| |    |_|     |____/ \___/   |_|
    Copyright 2016, Ismael Lugo (kwargs)    v%s""" % simpbot.__version__

logging = logging.getLogger('SIMPBOT')
Quit = lambda: exit('[ERROR]: Usar --debug para mas informacion.')

# Opcionales
args_ = argparse.ArgumentParser()
args_.add_argument('-d', '--debug',
    action="store_true", dest='debug',
    help="Inicia la depuracion")
args_.add_argument('-dl', '--debug-level',
    help='Inidica el nivel de debug',
    dest='debug_level', type=int, metavar='level')

act = args_.add_argument_group("Lanzamiento de SimpBot")
act.add_argument('-a', '--action',
    help='Inicia, Reinicia o detiene SimpBot',
    dest='action', type=str, metavar='(start|restart|stop)')
act.add_argument('-nd', '--no-daemon',
    help='No lanza SimpBot como demonio.',
    dest='no_daemon', action='store_true')

cfg = args_.add_argument_group("Configuración")
cfg.add_argument('-c', '--conf', dest="conf", type=str,
    help="Indica el metodo a usar", metavar="ARCHIVO")
cfg.add_argument('-mk', '--make-conf', dest="make", action='store_true',
    help="Crea la configuración inicial en el archivo indicado")

args = args_.parse_args()


def set_config():
    if args.conf:
        abspath = args.conf
    else:
        abspath = simpbot.envvars.CONFPATH

    if args.make:
        simpbot.envvars.CONFPATH = abspath
        simpbot.help_config.save_conf()
        logging.info('Configuracion creada en: %s', abspath)
        exit(0)
    else:
        config = simpbot.util.loadmodule(abspath)
        if config:
            from re import escape
            simpbot.config.NICK = config.NICK
            simpbot.config.USER = config.USER
            simpbot.config.USENS = config.USENS
            simpbot.config.SASL = config.SASL
            simpbot.config.USERNAME = config.USERNAME
            simpbot.config.PASSWORD = config.PASSWORD
            simpbot.config.SSL = config.SSL
            simpbot.config.PORT = config.PORT
            simpbot.config.NETWORK = config.NETWORK
            simpbot.config.SERVER = config.SERVER
            simpbot.config.SERVPASS = config.SERVPASS
            simpbot.config.TIMEOUT = config.TIMEOUT
            simpbot.config.PREFIX = escape(config.PREFIX)
            simpbot.config.WTIME = config.WTIME
            simpbot.config.MSGPS = config.MSGPS
            simpbot.config.ADMINS = config.ADMINS
            simpbot.config.CHANNELS = config.CHANNELS
            simpbot.config.VERBOSE = config.VERBOSE
            simpbot.config.VERBOSENICKS = config.VERBOSENICKS
        else:
            Quit()


def debug():
    if not args.debug:
        level = 50
    else:
        level = 10
    if args.debug_level:
        level = args.debug_level

    if args.action in ('start', 'restart'):
        if not args.no_daemon:
            simpbot.envvars.DAEMON = True

    simpbot.util.debug(level)


def action():
    if not args.action in ('start', 'restart', 'stop'):
        args_.print_usage()
        return
    import os
    import time
    from signal import SIGTERM
    pidfile = '/tmp/simbot-%s.pid' % os.environ['USER']
    pid = None
    pid_status = False
    if os.path.exists(pidfile):
        pid = int(file(pidfile, 'r').read().splitlines()[0].replace('\n', ''))
        pid_status = simpbot.util.pid_exists(pid)

    if args.action in ('stop', 'restart'):
        if not pid_status:
            print('[!]- No hay ningun proceso activo')
            return

        try:
            while 1:
                os.kill(pid, SIGTERM)
                time.sleep(1)
        except OSError, err:
            err = str(err)
            if err.find("No such process") > 0:
                print('[+]- (PID: %s) SimpBot detenido.' % pid)
                os.remove(pidfile)
        if args.action == 'restart':
            pid_status = False
            args.action = 'start'
        else:
            return

    if args.action == 'start':
        if pid_status:
            print('[!]- Ya hay un proceso activo')
            return

        if not args.no_daemon:
            print('[+]- (PID: %s) SimpBot iniciado.' % os.getpid())
            null = '/dev/null'
            simpbot.util.deamonize(null, null, null, pidfile)

        simpbot.envvars.irc = simpbot.irc.irc()
        simpbot.envvars.irc.try_connect()

        for module in simpbot.envvars.modules.listdir():
            simpbot.util.loadmodule(simpbot.envvars.modules.join(module))
        while 1:
            try:
                time.sleep(60)
            except KeyboardInterrupt:
                exit(0)


if __name__ == '__main__':
    print(motd)
    debug()
    set_config()
    action()
