using MarketData.MarketDataModel;
using MarketData.Numerical;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MarketData.Generator.Indicators
{
  public class PriceTrendIndicatorResult
  {
    public PriceTrendIndicatorResult(bool isUptrend,double highPriceSlope=double.NaN,double lowPriceSlope=double.NaN)
    {
      this.IsUpTrend=isUptrend;
      this.HighPriceSlope=highPriceSlope;
      this.LowPriceSlope=lowPriceSlope;
    }
    public bool IsUpTrend{get;private set;}
    public double HighPriceSlope{get;private set;}
    public double LowPriceSlope{get; private set;}
  }
  public class PriceTrendIndicator
  {
    private PriceTrendIndicator()
    {
    }
    public static PriceTrendIndicatorResult IsUptrend(Prices prices,int dayCount)
    {
      if(null==prices||prices.Count<dayCount) return new PriceTrendIndicatorResult(false);
      float[] highPrices=prices.GetPricesHigh();
      highPrices=highPrices.Take(dayCount).ToArray();
      highPrices=Numerics.Reverse(ref highPrices);
      double highPricesSlope=Numerics.Slope(highPrices);
      if(highPricesSlope<0) return new PriceTrendIndicatorResult(false);
      float[] lowPrices=prices.GetPricesLow();
      lowPrices=lowPrices.Take(dayCount).ToArray();
      lowPrices=Numerics.Reverse(ref lowPrices);
      double lowPricesSlope=Numerics.Slope(lowPrices);
      if(lowPricesSlope<0) return new PriceTrendIndicatorResult(false);
      return new PriceTrendIndicatorResult(true,highPricesSlope,lowPricesSlope);
    }
  }
}
