from abc import ABC, abstractmethod

from py_jftech import autowired

from api import RebalanceSignal, PortfoliosBuilder, PortfoliosRisk
from rebalance.dao import robo_rebalance_signal as rrs


class BaseRebalanceSignal(RebalanceSignal, ABC):

    @autowired
    def __init__(self, builder: PortfoliosBuilder = None):
        self._builder = builder

    def get_signal(self, day, risk: PortfoliosRisk):
        signal = rrs.get_one(type=self.signal_type, risk=risk, date=day)
        if signal:
            return signal
        trigger = self.is_trigger(day, risk)
        if trigger:
            portfolio = self._builder.get_portfolios(day, risk, self.signal_type.p_type)
            id = rrs.insert({
                'date': day,
                'type': self.signal_type,
                'risk': risk,
                'portfolio_type': self.signal_type.p_type,
                'portfolio': portfolio
            })
            return rrs.get_by_id(id)
        return None

    @abstractmethod
    def is_trigger(self, day, risk: PortfoliosRisk) -> bool:
        pass