#! /usr/bin/env python

from huobi_client import Client
from huobi_client import StreamingClient
from huobi_client.streaming_client import VALID_SYMBOL,\
                             VALID_PERIOD, VALID_PERCENT
from pprint import pprint
import argparse
import logging


def on_msg(data):
    pprint(data)


def stream(args):
    logging.basicConfig(level=logging.INFO)
    sc = StreamingClient()
    if args.filter:
        # subscribe filter
        if args.period:
            sc.subscribe(args.filter, period=args.period)
        elif args.percent:
            sc.subscribe(args.filter, percent=args.percent)
        else:
            sc.subscribe(args.filter)
    else:
        # subscribe all
        sc.subscribe_all()

    # connect to server
    try:
        sc.connect(on_msg)
    except KeyboardInterrupt:
        exit()


def main(args):
    c = Client()
    if args.command == 'stream':
        stream(args)
    elif args.command == 'info':
        pprint(c.get_account_info())
    elif args.command == 'orders':
        pprint(c.get_orders())
    elif args.command == 'oinfo':
        pprint(c.get_order_info(args.id))
    elif args.command == 'buy':
        pprint(c.buy(args.price, args.amount))
    elif args.command == 'sell':
        pprint(c.sell(args.price, args.amount))
    elif args.command == 'buym':
        pprint(c.buy_market(args.amount))
    elif args.command == 'sellm':
        pprint(c.sell_market(args.amount))
    elif args.command == 'cancel':
        pprint(c.cancel_order(args.id))
    elif args.command == 'norders':
        pprint(c.get_new_deal_orders())
    elif args.command == 'tid2oid':
        pprint(c.get_order_id_by_trade_id(args.tid))
    elif args.command == 'avail_loans':
        pprint(c.get_loan_available())
    elif args.command == 'loans':
        pprint(c.get_loans())


if __name__ == "__main__":
    parser = argparse.ArgumentParser(prog='huobi',
                                     description='huobi command line tool')
    subparsers = parser.add_subparsers(dest='command')
    # info
    parser_info = subparsers.add_parser('info', help='account info')
    # orders
    parser_orders = subparsers.add_parser('orders', help='orders')
    # oinfo
    parser_oinfo = subparsers.add_parser('oinfo', help='order info')
    parser_oinfo.add_argument('id')
    # buy
    parser_buy = subparsers.add_parser('buy', help='buy')
    parser_buy.add_argument('price', type=float)
    parser_buy.add_argument('amount', type=float)
    # sell
    parser_sell = subparsers.add_parser('sell', help='sell')
    parser_sell.add_argument('price', type=float)
    parser_sell.add_argument('amount', type=float)
    # buy_market
    parser_buym = subparsers.add_parser('buym', help='buy market')
    parser_buym.add_argument('amount', type=float)
    # sell_market
    parser_sellm = subparsers.add_parser('sellm', help='sell market')
    parser_sellm.add_argument('amount', type=float)
    # cancel order
    parser_cancel = subparsers.add_parser('cancel', help='cancel order')
    parser_cancel.add_argument('id')
    # get new deal orders
    parser_new_orders = subparsers.add_parser('norders',
                                              help='get new deal order')
    # get order id by trade id
    parser_tid2oid = subparsers.add_parser('tid2oid',
                                           help='get order id by trade id')
    parser_tid2oid.add_argument('tid')

    # TODO: withdraw
    # parser_withdraw = subparsers.add_parser('withdraw',
    #                                         help='withdraw related functions')
    # TODO: loans
    # TODO: transfer

    # get available loans
    parser_avail_loan = subparsers.add_parser('avail_loans',
                                              help='get available loans')

    # get loans
    parser_loans = subparsers.add_parser('loans',
                                         help='get loans')

    # stream
    parser_stream = subparsers.add_parser('stream',
                                          help='dump socketio data')
    parser_stream.add_argument('-f', '--filter', choices=VALID_SYMBOL)
    parser_stream.add_argument('--period', choices=VALID_PERIOD)
    parser_stream.add_argument('--percent', choices=VALID_PERCENT)

    args = parser.parse_args()
    if args.command:
        main(args)
    else:
        parser.print_help()
