#!python

"""
        COPYRIGHT (c) 2022 by Featuremine Corporation.
        This software has been provided pursuant to a License Agreement
        containing restrictions on its use.  This software contains
        valuable trade secrets and proprietary information of
        Featuremine Corporation and is protected by law.  It may not be
        copied or distributed in any form or medium, disclosed to third
        parties, reverse engineered or used in any manner not provided
        for in said License Agreement except with the prior written
        authorization from Featuremine Corporation.
"""

import argparse
import extractor
from datetime import timedelta

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument("--ytp", help="RUDA Ytp file", required=True)
    parser.add_argument("--channel", help="RUDA Ytp channel", required=True)
    parser.add_argument("--peer", help="RUDA Ytp peer", required=True)
    parser.add_argument("--tickers", help="Symbols file", required=True)
    parser.add_argument("--follow", help="Symbols file", default=False, action="store_true", required=False)
    args = parser.parse_args()

    graph = extractor.system.comp_graph()
    op = graph.features
    
    with open(args.tickers) as tickerfile:
        tickers = tickerfile.read().splitlines()

    markets = ["NYSEMKT",
               "NASDAQOMXBX",
               "NSX",
               "FINRA",
               "DirectEdgeA",
               "DirectEdgeX",
               "CSX",
               "NYSE",
               "NYSEArca",
               "NASDAQOMX",
               "NASDAQOMXPSX",
               "BATSY",
               "BATS",
               "INVESTORS_EXCHANGE",
               "LTSE",
               "MEMX",
               "EPRL"]

    subscriptions = [(ticker, market) for ticker in tickers for market in markets]

    upd = op.ruda_live(args.ytp, args.channel, args.peer, args.follow)
    
    def sub(security, mkt):
        quote = op.ruda_bbo(upd, security, mkt)
        cumtrade = op.ruda_cumtrade(upd, security, mkt)
        bbo_asof_trade = op.asof(quote, cumtrade)
        return op.combine(cumtrade, tuple(), bbo_asof_trade, tuple())

    updates = op.join(
        *[sub(security, mkt) for security, mkt in subscriptions],
        "security/mkt", extractor.Array(extractor.Char, 30),
        tuple([f"{security}/{mkt}" for security, mkt in subscriptions]))

    trigger = op.timer(timedelta(minutes=1))
    count = op.count(updates)
    count_ref = graph.get_ref(count)

    def stop_cb(stats):
        print(f"Trades count: {count_ref[0].count:f}")
        print(f"Percentiles: \n100: {stats[0].delta100:f}\n99: {stats[0].delta99:f}\n95: {stats[0].delta95:f}\n90: {stats[0].delta90:f}\n75: {stats[0].delta75:f}\n50: {stats[0].delta50:f}\n25: {stats[0].delta25:f}")

    graph.callback(op.ruda_stats(upd, trigger), stop_cb)

    print("Initializing context")
    ctx = graph.stream_ctx()
    print("Running context")
    ctx.run_live()
