import os
import pandas

from scipy.stats import linregress

from kraken_bot.Model import Model

class LinearRegression(Model):
    def __init__(self):
        self.r_value_target = float(os.getenv('R_VALUE_TARGET'))
        self.analysis = pandas.DataFrame({})
        super().__init__(
                interval = 1,
                ascending = False
                )

    def _linear_regression_for_ohlc_data(self, ohlc_data):
        self.log.debug(f"_linear_regression_for_ohlc_data: ohlc_data=...")
        return linregress(ohlc_data['time'].astype(float), ohlc_data['close'].astype(float))

    def _filter_asset_pairs(self, tradable_asset_pairs):
        self.log.debug(f"_filter_asset_pairs: tradable_asset_pairs=...")
        return tradable_asset_pairs[
                (tradable_asset_pairs['quote'] == 'ZUSD') &
                (tradable_asset_pairs['status'] == 'online')
                ]

    def _filter_regressions(self, regressions):
        self.log.debug(f"_filter_regressions: regressions=...")
        regressions.columns = ['slope', 'intercept', 'r_value', 'p_value', 'stderr']
        return regressions[
                (regressions.r_value >= self.r_value_target) &
                (regressions.slope > 0)
                ]

    def _order_regressions(self, regressions):
        self.log.debug(f"_order_regressions: regressions=...")
        return regressions.sort_values(by='slope', ascending=False)

    def since(self):
        return None

    def update(self, tradable_asset_pairs, ohlc_data):
        self.log.debug(f"update: tradable_asset_pairs=..., ohlc_data=...")
        self.analysis = self._order_regressions(
                self._filter_regressions(
                    pandas.DataFrame({
                        asset_pair: self._linear_regression_for_ohlc_data(
                            ohlc_data[asset_pair][0]
                            ) for asset_pair in self._filter_asset_pairs(tradable_asset_pairs).index
                        }).transpose()
                    ))
        self.log.debug(self.analysis)