import asyncio
import os
import sys
import threading
import json
import tornado
from tornado.options import (define, options, parse_command_line,
                             parse_config_file)
from tornado.web import Application, RequestHandler, authenticated

import QUANTAXIS as QA
from QAPUBSUB.producer import publisher, publisher_routing
from QARealtimeCollector.collectors import (QARTC_CtpBeeCollector,
                                            QARTC_CTPTickCollector,
                                            QARTC_RandomTick, QARTC_Stock,
                                            QARTC_WsCollector)
from QARealtimeCollector.datahandler import QARTC_Resampler
from QARealtimeCollector.setting import eventmq_ip
from QAWebServer import QABaseHandler, QAWebSocketHandler


class SUBSCRIBE_SERVER(QABaseHandler):
    handler = {'stock_cn': {}, 'future_cn': {}}
    resampler = {'stock_cn': {}, 'future_cn': {}}

    def get(self):
        action = self.get_argument('action')
        if action == 'get_current_handler':
            print(self.handler)
            self.write({'result':
                        {'stock_cn': list(self.handler['stock_cn'].keys()),
                         'future_cn': list(self.handler['future_cn'].keys())}})
        elif action == 'get_current_resampler':
            print(self.resampler)
            self.write({'result':
                        {'stock_cn': list(self.resampler['stock_cn'].keys()),
                         'future_cn': list(self.resampler['future_cn'].keys())}})

    def post(self):
        action = self.get_argument('action')
        market_type = self.get_argument('market_type')
        code = self.get_argument('code')
        if action == 'new_handler':

            if code not in self.handler.keys():
                if market_type == 'future_cn':
                    self.handler[market_type][code] = QARTC_CtpBeeCollector(
                        code)
                    self.handler[market_type][code].start()
                    self.write({'result': 'success'})
                else:
                    publisher_routing(host=eventmq_ip, exchange='QARealtime_Market', routing_key='stock').pub(json.dumps({
                        'topic': 'subscribe',
                        'code': code
                    }), routing_key='stock')
                    self.handler[market_type][code] = True
                    self.write({'result': 'success'})

            else:
                self.write({'result': 'already exist'})
        elif action == 'new_resampler':
            frequence = self.get_argument('frequence')
            if (code, frequence) not in self.resampler.keys():
                if market_type == 'future_cn':
                    self.resampler[market_type][(code, frequence)] = QARTC_Resampler(
                        code, frequence)
                    self.resampler[market_type][(code, frequence)].start()
                    self.write({'result': 'success'})
                else:
                    pass
            else:
                self.write({'result': 'already exist'})


handlers = [
    (r"/",
     SUBSCRIBE_SERVER)
]


def main():
    asyncio.set_event_loop(asyncio.new_event_loop())
    define("port", default=8011, type=int, help="服务器监听端口号")

    define("address", default='0.0.0.0', type=str, help='服务器地址')
    define("content", default=[], type=str, multiple=True, help="控制台输出内容")
    parse_command_line()
    apps = Application(
        handlers=handlers,
        debug=True,
        autoreload=True,
        compress_response=True
    )
    port = options.port

    # stock_coll = QARTC_Stock(username='quantaxis', password='quantaxis')

    # threading.Thread(target=)

    http_server = tornado.httpserver.HTTPServer(apps)
    http_server.bind(port=options.port, address=options.address)
    """增加了对于非windows下的机器多进程的支持
    """
    http_server.start(1)
    tornado.ioloop.IOLoop.current().start()


if __name__ == '__main__':
    main()