#!python

"""AER Subscriber

Author: Yuhuang Hu
Email : duguyue100@gmail.com
"""

from __future__ import print_function, absolute_import

import json
import argparse

from pyaer.utils import expandpath, import_custom_module
from pyaer.utils import parse_custom_args
from pyaer.comm import AERSubscriber

parser = argparse.ArgumentParser()
parser.add_argument("--url", type=str,
                    default="tcp://127.0.0.1",
                    help="AER Subscriber URL")
parser.add_argument("--port", type=int,
                    default=5099,
                    help="the port that connects this subscriber")
parser.add_argument("--topic", type=str,
                    default="",
                    help="Topic to subscribe")
parser.add_argument("--name", type=str,
                    default="",
                    help="Name of the subscriber")

parser.add_argument("--use_default_sub", action="store_true")

parser.add_argument("--custom_sub", type=expandpath,
                    default="",
                    help="path to the custom publisher class")
parser.add_argument("--custom_class", type=str,
                    default="",
                    help="custom publisher class name")


args, custom_args = parser.parse_known_args()

custom_args_dict = parse_custom_args(custom_args)

# print all options
print("="*50)
print(json.dumps(
    {**args.__dict__, **custom_args_dict},
    indent=4, sort_keys=True))
print("="*50)

# define subscriber
if args.use_default_sub:
    # fall back to the default publisher
    subscriber = AERSubscriber(
        url=args.url, port=args.port, topic=args.topic,
        name=args.name)
    subscriber.logger.info("Use default subscriber")
else:
    # use custom publisher
    CustomSubscriber = import_custom_module(args.custom_sub, args.custom_class)
    subscriber = CustomSubscriber(
        url=args.url, port=args.port, topic=args.topic, name=args.name,
        **custom_args_dict)
    subscriber.logger.info(
        "Use custom subscriber {}".format(args.custom_class))

# Start sending data
subscriber.run()
