#!python
# coding: utf-8

import sys
import logging


# set logging before anything is imported
LOG_FORMAT = "%(levelname)s %(name)s %(lineno)d: %(message)s"
if "--debug" in sys.argv:
    logging.basicConfig(format=LOG_FORMAT, level=logging.DEBUG)
elif "--quiet" in sys.argv:
    logging.basicConfig(format=LOG_FORMAT, level=logging.WARNING)
else:
    logging.basicConfig(format=LOG_FORMAT, level=logging.INFO)


import argparse
import time
import storjnode
import btctxstore


def _add_programm_args(parser):

    # port
    default = 4653
    parser.add_argument("--port", default=default, type=int,
                        help="Node port. Default: {0}.".format(default))

    # debug
    parser.add_argument('--debug', action='store_true',
                        help="Show debug information.")

    # quiet
    parser.add_argument('--quiet', action='store_true',
                        help="Only show warning and error information.")


def _add_put(command_parser):
    parser = command_parser.add_parser(
        "put", help="Put key, value pair into DHT."
    )
    parser.add_argument("key", help="Key to retrieve value.")
    parser.add_argument("value", help="Value to insert into the DHT")


def _add_get(command_parser):
    parser = command_parser.add_parser(
        "get", help="Get value from DHT."
    )
    parser.add_argument("key", help="Key to retrieve value by.")


def _add_run(command_parser):
    command_parser.add_parser(
        "run", help="Run node and extend DHT network."
    )


def _add_version(command_parser):
    command_parser.add_parser(
        "version", help="Show version number and exit."
    )


def _parse_args():
    class ArgumentParser(argparse.ArgumentParser):
        def error(self, message):
            sys.stderr.write('error: %s\n' % message)
            self.print_help()
            sys.exit(2)

    # setup parser
    description = "Low level reference node command-line interface."
    parser = ArgumentParser(description=description)
    _add_programm_args(parser)
    command_parser = parser.add_subparsers(
        title='commands', dest='command', metavar="<command>"
    )

    _add_version(command_parser)
    _add_put(command_parser)
    _add_get(command_parser)
    _add_run(command_parser)

    # get values
    args = vars(parser.parse_args())
    command = args.pop("command")
    if not command:
        parser.error("No command given!")
    return command, args


if __name__ == "__main__":
    command, args = _parse_args()

    # show version
    if command == "version":
        print("v{0}".format(storjnode.__version__))
        exit(0)

    # setup node
    node_key = btctxstore.BtcTxStore().create_wallet()
    port = args["port"]
    node = storjnode.network.BlockingNode(node_key, port=port)

    print("Giving node 12sec to find peers ...")
    time.sleep(12)

    # run node server
    if command == "run":
        print("Running node on port {port} ...".format(**args))
        while True:
            time.sleep(1)

    # put key value pair
    elif command == "put":
        key = args["key"]
        value = args["value"]
        node[key] = value
        print("Put '{key}' => '{value}'!".format(**args))

    # get value by key
    elif command == "get":
        key = args["key"]
        value = node[key]
        print("Got '{key}' => '{value}'!".format(key=key, value=value))

    print("Stopping node")
    node.stop_reactor()
