#!/usr/bin/env python3
# This file is placed in the Public Domain.
#
# pylint: disable=C0413


"main"


import os
import readline
import sys
import termios
import time


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


from otpcr.client  import Client, cmnd, parse
from otpcr.disk    import Workdir, skel
from otpcr.handler import Event
from otpcr.log     import debug, enable
from otpcr.object  import Default
from otpcr.run     import broker, init, scan
from otpcr.thread  import errors, setout


from otpcr import modules


Cfg             = Default()
Cfg.dis         = ""
Cfg.mod         = "cmd,err,log,mod,tdo,thr,tmr"
Cfg.opts        = ""
Cfg.name        = __file__.rsplit(os.sep, maxsplit=1)[-1]
Cfg.version     = "14"
Cfg.wdr         = os.path.expanduser(f"~/.{Cfg.name}")
Cfg.pidfile     = os.path.join(Cfg.wdr, f"{Cfg.name}.pid")


Workdir.workdir = Cfg.wdr


class Console(Client):

    "Console"

    def __init__(self):
        Client.__init__(self)
        broker.add(self)

    def announce(self, txt):
        "disable announce."

    def callback(self, evt):
        "wait for callback."
        Client.callback(self, evt)
        evt.wait()

    def poll(self):
        "poll console and create event."
        evt = Event()
        evt.orig = object.__repr__(self)
        evt.txt = input("> ")
        evt.type = "command"
        return evt

    def say(self, _channel, txt):
        "print to console"
        txt = txt.encode('utf-8', 'replace').decode()
        print(txt)


def wrap(func):
    "restore console."
    old2 = None
    try:
        old2 = termios.tcgetattr(sys.stdin.fileno())
    except termios.error:
        pass
    try:
        func()
    except (KeyboardInterrupt, EOFError):
        print("")
    finally:
        if old2:
            termios.tcsetattr(sys.stdin.fileno(), termios.TCSADRAIN, old2)


def main():
    "main"
    parse(Cfg, " ".join(sys.argv[1:]))
    skel()
    enable(print)
    setout(print)
    if "a" in Cfg.opts:
        Cfg.mod = ",".join(modules.__dir__())
    if "v" in Cfg.opts:
        dte = " ".join(time.ctime(time.time()).replace("  ", " ").split()[1:])
        debug(f'{dte} {Cfg.name.upper()} {Cfg.opts.upper()} {Cfg.mod.upper()}')
    if "h" in Cfg.opts:
        print(__doc__)
    scan(modules, Cfg.mod, Cfg.sets.dis)
    if "c" in Cfg.opts:
        init(modules, Cfg.mod, Cfg.sets.dis)
        csl = Console()
        csl.start()
        while 1:
            time.sleep(1.0)
    elif Cfg.otxt:
        cmnd(Cfg.otxt, print)


if __name__ == "__main__":
    readline.redisplay()
    wrap(main)
    errors()
