import pandas as pd
from logbook import Logger

from catalyst import get_calendar
from catalyst.exchange.exchange_asset_finder import ExchangeAssetFinder
from catalyst.exchange.exchange_data_portal import (
    DataPortalExchangeBacktest,
    DataPortalExchangeLive
)
from catalyst.exchange.utils.exchange_utils import get_common_assets
from catalyst.exchange.utils.factory import get_exchanges
from test_utils import rnd_history_date_days, rnd_bar_count

log = Logger('test_bitfinex')


class TestExchangeDataPortal:
    @classmethod
    def setup(self):
        log.info('creating bitfinex exchange')
        exchanges = get_exchanges(['bitfinex', 'bittrex', 'poloniex'])
        open_calendar = get_calendar('OPEN')
        asset_finder = ExchangeAssetFinder()

        self.data_portal_live = DataPortalExchangeLive(
            exchanges=exchanges,
            asset_finder=asset_finder,
            trading_calendar=open_calendar,
            first_trading_day=pd.to_datetime('today', utc=True)
        )

        self.data_portal_backtest = DataPortalExchangeBacktest(
            exchanges=exchanges,
            asset_finder=asset_finder,
            trading_calendar=open_calendar,
            first_trading_day=None  # will set dynamically based on assets
        )

    def test_get_history_window_live(self):
        # asset_finder = self.data_portal_live.asset_finder

        # assets = [
        #     asset_finder.lookup_symbol('eth_btc', self.bitfinex),
        #     asset_finder.lookup_symbol('eth_btc', self.bittrex)
        # ]
        # now = pd.Timestamp.utcnow()
        # data = self.data_portal_live.get_history_window(
        #     assets,
        #     now,
        #     10,
        #     '1m',
        #     'price')
        pass

    def test_get_spot_value_live(self):
        # asset_finder = self.data_portal_live.asset_finder

        # assets = [
        #     asset_finder.lookup_symbol('eth_btc', self.bitfinex),
        #     asset_finder.lookup_symbol('eth_btc', self.bittrex)
        # ]
        # now = pd.Timestamp.utcnow()
        # value = self.data_portal_live.get_spot_value(
        #     assets, 'price', now, '1m')
        pass

    def test_get_history_window_backtest(self):
        asset_finder = self.data_portal_live.asset_finder

        assets = [
            asset_finder.lookup_symbol('neo_btc', self.bitfinex),
        ]

        date = pd.to_datetime('2017-09-10', utc=True)
        data = self.data_portal_backtest.get_history_window(
            assets,
            date,
            10,
            '1m',
            'close',
            'minute')

        log.info('found history window: {}'.format(data))
        pass

    def test_get_spot_value_backtest(self):
        asset_finder = self.data_portal_backtest.asset_finder

        assets = [
            asset_finder.lookup_symbol('neo_btc', self.bitfinex),
        ]

        date = pd.to_datetime('2017-09-10', utc=True)
        value = self.data_portal_backtest.get_spot_value(
            assets, 'close', date, 'minute')
        log.info('found spot value {}'.format(value))
        pass

    def test_history_compare_exchanges(self):
        exchanges = get_exchanges(['bittrex', 'bitfinex', 'poloniex'])
        assets = get_common_assets(exchanges)

        date = rnd_history_date_days()
        bar_count = rnd_bar_count()
        data = self.data_portal_backtest.get_history_window(
            assets=assets,
            end_dt=date,
            bar_count=bar_count,
            frequency='1d',
            field='close',
            data_frequency='daily'
        )

        log.info('found history window: {}'.format(data))

    def test_validate_resample(self):
        pass
