"""Simple Moving Average algorithm."""
from __future__ import annotations
import numpy as np
from app.engine.base import BaseAlgorithm
from app.engine.context import AlgorithmContext


class SMAAlgorithm(BaseAlgorithm):
    algorithm_id = 'technical.sma'
    version = '1.0.0'
    category = 'technical'
    display_name = 'Simple Moving Average'
    dependencies = []

    def __init__(self, periods=None):
        self.periods = periods or [20, 50, 200]

    def compute(self, ctx: AlgorithmContext) -> AlgorithmContext:
        df = ctx.ohlcv
        if df is None or len(df) < min(self.periods):
            return ctx

        closes = df['close'].values.astype(float)

        for period in self.periods:
            if len(closes) < period:
                continue
            sma = [None] * (period - 1)
            for i in range(period - 1, len(closes)):
                sma.append(float(np.mean(closes[i - period + 1:i + 1])))
            ctx.indicators[f'sma_{period}'] = sma
            ctx.indicators[f'sma_{period}_latest'] = sma[-1]

        return ctx
