from bfxhfindicators.indicator import Indicator
from bfxhfindicators.ema import EMA
from bfxhfindicators.accumulation_distribution import AccumulationDistribution
from math import isfinite


class ChaikinOsc(Indicator):
    def __init__(self, short, long, cache_size=None):
        self._shortEMA = EMA(short, cache_size)
        self._longEMA = EMA(long, cache_size)
        self._adl = AccumulationDistribution()

        super().__init__({
            'args': [short, long, cache_size],
            'id': 'chaikinosc',
            'name': 'ChaikinOsc(%f, %f)' % (short, long),
            'seed_period': max([short, long]),
            'data_type': 'candle',
            'data_key': '*',
            'cache_size': cache_size
        })

    def reset(self):
        super().reset()
        self._shortEMA.reset()
        self._longEMA.reset()
        self._adl.reset()

    def update(self, candle):
        self._adl.update(candle)
        adl = self._adl.v()

        if not isfinite(adl):
            return

        self._shortEMA.update(adl)
        self._longEMA.update(adl)

        short = self._shortEMA.v()
        long = self._longEMA.v()

        if (isfinite(short) and isfinite(long)):
            super().update(short - long)

        return self.v()

    def add(self, candle):
        self._adl.add(candle)
        adl = self._adl.v()

        if not isfinite(adl):
            return

        self._shortEMA.add(adl)
        self._longEMA.add(adl)

        short = self._shortEMA.v()
        long = self._longEMA.v()

        if (isfinite(short) and isfinite(long)):
            super().add(short - long)

        return self.v()
