from bfxapi.rest.bfx_rest import BfxRest
from retrying_async import retry

from bfxbot.currency import Symbol


class BfxWrapper(BfxRest):
    def __init__(self, api_key: str, api_secret: str):
        super().__init__(API_KEY=api_key, API_SECRET=api_secret)

    @retry()
    async def get_public_ticker(self, symbol):
        if isinstance(symbol, Symbol):
            symbol = str(symbol)

        return await super().get_public_ticker(symbol)

    @retry()
    async def get_active_position(self):
        return await super().get_active_position()

    @retry()
    async def get_active_orders(self, symbol):
        if isinstance(symbol, Symbol):
            symbol = str(symbol)

        return await super().get_active_orders(symbol)

    @retry()
    async def get_trades(self, symbol, start, end):
        if isinstance(symbol, Symbol):
            symbol = str(symbol)

        return await super().get_trades(symbol, start, end)

    async def get_current_prices(self, symbol) -> (float, float, float):
        if isinstance(symbol, Symbol):
            symbol = str(symbol)

        tickers = await self.get_public_ticker(symbol)

        bid_price = tickers[0]
        ask_price = tickers[2]
        ticker_price = tickers[6]

        return bid_price, ask_price, ticker_price

    async def get_usd_balance(self):
        balance = 0.0

        wallets = await self.get_wallets()

        for w in wallets:
            if w.currency == "USD":
                balance += w.balance
            else:
                current_price = await self.get_current_prices(f"t{w.currency}USD")
                balance += current_price * w.balance

        return balance

    async def get_balance_delta(self, symbol: Symbol, start: float, end: float):
        trades = await self.get_trades(symbol, start, end)

        return sum([t.amount for t in trades])