#!/usr/bin/env python3
# This file is placed in the Public Domain.
# pylint: disable=E1101,E0611,C0115,C0116,C0413,C0411,W0406


"program your own commands"


import os
import readline
import signal
import sys
import termios
import time


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


from op.wdr import Wd
from op.obj import keys, printable, update
from opr.clt import Client
from opr.evt import Event, docmd
from opr.prs import parse
from opr.scn import scan
from opr.utl import wait


from oper import cmd, irc, rss
from oper.irc import Config, IRC
from oper.rss import Fetcher
from oper.run import Cfg


Config.nick = "operbot"
Config.channel = "#operbot"
Config.realname = "program your own commands"
Config.username = "operbot"


Wd.workdir = os.path.expanduser("~/.operbot")


scan(cmd)
scan(irc)
scan(rss)


class CLI(Client):

    @staticmethod
    def raw(txt):
        print(txt)


class Console(CLI):

    @staticmethod
    def announce(txt):
        pass

    @staticmethod
    def handle(event):
        Client.handle(event)
        event.wait()

    def poll(self):
        event = Event()
        event.txt = input("> ")
        event.orig = repr(self)
        return event


def banner(cfg):
    print(
          "OPERBOT started at %s %s" % (
                                     time.ctime(time.time()).replace("  ", " "),
                                     printable(cfg, "debug,verbose")
                                    )
         )


def daemon():
    pid = os.fork()
    if pid != 0:
        os._exit(0)
    os.setsid()
    os.umask(0)
    sis = open("/dev/null", 'r')
    sos = open("/dev/null", 'a+')
    ses = open("/dev/null", 'a+')
    os.dup2(sis.fileno(), sys.stdin.fileno())
    os.dup2(sos.fileno(), sys.stdout.fileno())
    os.dup2(ses.fileno(), sys.stderr.fileno())


def hup(_sig, _frame):
    print("signal 15 called")
    sys.stdout.flush()


def isopt(ostr):
    for opt in ostr:
        if opt in Cfg.opts:
            return True
    return False


def wrap(func):
    fds = sys.stdin.fileno()
    gotterm = True
    try:
        old = termios.tcgetattr(fds)
    except termios.error:
        gotterm = False
    readline.redisplay()
    try:
        func()
    except (EOFError, KeyboardInterrupt):
        print("")
    finally:
        if gotterm:
            termios.tcsetattr(fds, termios.TCSADRAIN, old)


def main():
    signal.signal(signal.SIGHUP, hup)
    txt = ' '.join(sys.argv[1:])
    cfg = parse(txt)
    update(Cfg, cfg)
    if cfg.txt:
        cli = CLI()
        docmd(cli, cfg.otxt)
        return
    if isopt("d"):
        daemon()
    if isopt("ci"):
        banner(cfg)
    if isopt("di"):
        bot = IRC()
        bot.start()
        if isopt("v"):
            print(printable(bot.cfg, "nick,channel,server,port,sasl"))
    if isopt("r"):
        fetcher = Fetcher()
        fetcher.start()
    if isopt("ci") and not isopt("d"):
        csl = Console()
        csl.start()
        csl.forever()
    if isopt("d"):
        wait()
        

wrap(main)
