#!python
# coding: utf-8

import time
import btctxstore
import storjnode
import argparse
import signal
import sys
from crochet import setup
from storjnode.network.bandwidth.limit import BandwidthLimit
from storjnode.config import ConfigFile


# start twisted via crochet and remove twisted handler
setup()
signal.signal(signal.SIGINT, signal.default_int_handler)


def parse_args(args):
    description = "Start a storjnode that only runs the DHT."
    parser = argparse.ArgumentParser(description=description)

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

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

    # --port
    msg = "Node DHT port, random user port by default."
    parser.add_argument("--port", default=None, type=int, help=msg)

    # --key
    msg = "Bitcoin wif/hwif for node id and auth, gererated by default."
    parser.add_argument("--key", default=None, help=msg)

    return vars(parser.parse_args(args=args))


def main(args):
    arguments = parse_args(args)
    node = None
    key = arguments["key"] or btctxstore.BtcTxStore().create_wallet()
    bandwidth = BandwidthLimit(ConfigFile())
    try:
        # start node
        node = storjnode.network.Node(
            key, port=arguments["port"],
            disable_data_transfer=True,
            bandwidth=bandwidth
        )
        print("Running node on port {port} with id {id} and key {key}".format(
            id=storjnode.util.node_id_to_address(node.get_id()), port=node.port, key=key
        ))

        # print received message to terminal
        def message_handler(node, message):
            print("Received message: %s" % message)
        node.add_message_handler(message_handler)

        # run forever
        while True:
            # Todo: could run process_data_transfers here
            # and remove run in reactor
            time.sleep(0.1)

    except KeyboardInterrupt:
        pass

    finally:
        if node is not None:
            node.stop()


if __name__ == "__main__":
    main(sys.argv[1:])
