import argparse
import logging

from twisted.web import server, static
from twisted.internet import reactor, defer
from jsonrpc.proxy import JSONRPCProxy

from lbrynet.lbrynet_daemon.LBRYDaemon import LBRYDaemon, LBRYindex, LBRYDaemonWeb, LBRYFileRender
from lbrynet.conf import API_CONNECTION_STRING, API_INTERFACE, API_ADDRESS, API_PORT, DEFAULT_WALLET

log = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO)


def stop():
    def _disp_shutdown():
        log.info("Shutting down lbrynet-daemon from command line")

    def _disp_not_running():
        log.info("Attempt to shut down lbrynet-daemon from command line when daemon isn't running")

    d = defer.Deferred(None)
    d.addCallback(lambda _: JSONRPCProxy.from_url(API_CONNECTION_STRING).stop())
    d.addCallbacks(lambda _: _disp_shutdown(), lambda _: _disp_not_running())
    d.callback(None)


def start():
    parser = argparse.ArgumentParser(description="Launch lbrynet-daemon")
    parser.add_argument("--wallet",
                        help="lbrycrd or lbryum, default lbryum",
                        type=str,
                        default=DEFAULT_WALLET)
    parser.add_argument("--update",
                        help="True or false, default true",
                        type=str,
                        default="True")

    log.info("Starting lbrynet-daemon from command line")

    args = parser.parse_args()
    daemon = LBRYDaemon()
    daemon.setup(args.wallet, args.update)

    root = LBRYindex()
    root.putChild("css", static.File("./css"))
    root.putChild("font", static.File("./font"))
    root.putChild("img", static.File("./img"))
    root.putChild("js", static.File("./js"))
    root.putChild(API_ADDRESS, daemon)
    root.putChild("webapi", LBRYDaemonWeb())
    root.putChild("view", LBRYFileRender())
    reactor.listenTCP(API_PORT, server.Site(root), interface=API_INTERFACE)

    reactor.run()