using MarketData.Utils;
using System;
using System.Collections.Generic;
using System.Text;

/// <summary>
/// This StopLimit class is used for database persistence 
/// </summary>

namespace MarketData.MarketDataModel
{
  public class StopLimitConstants
  {
    public static readonly String STOP_QUOTE="Stop Quote";
  }

  public class StopLimits:List<StopLimit>
  {
    public StopLimits()
    {
    }
    public StopLimits(List<StopLimit> stopLimits)
    {
      foreach(StopLimit stopLimit in stopLimits) Add(stopLimit);
    }
    public NVPCollections ToNVPCollections()
    {
      NVPCollections nvpCollections=new NVPCollections();
      foreach(StopLimit stopLimit in this)
      {
        nvpCollections.Add(stopLimit.ToNVPCollection());
      }
      return nvpCollections;
    }
    public static StopLimits FromNVPCollections(NVPCollections nvpCollections)
    {
      StopLimits stopLimits=new StopLimits();
      foreach(NVPCollection nvpCollection in nvpCollections)
      {
        stopLimits.Add(StopLimit.FromNVPCollection(nvpCollection));
      }
      return stopLimits;
    }
    public void AddFromNVPCollection(NVPCollection nvpCollection)
    {
      Add(StopLimit.FromNVPCollection(nvpCollection));
    }
    public void Add(StopLimits stopLimits)
    {
      foreach(StopLimit stopLimit in stopLimits)this.Add(stopLimit);
    }
  }

  public class StopLimit
  {
    public String Symbol{get;set;}
    public double StopPrice{get;set;}
    public double Shares{get;set;}
    public String StopType{get;set;}
    public int Active{get;set;}
    public DateTime EffectiveDate{get;set;}   // if the EffectiveDate is Epoch then the StopLimit is taken to be in effect and is the most recent.  Otherwise it is considered an historical stop limit

    public StopLimit()
    {
    }
    public StopLimit(String symbol,double stopPrice,int shares,String stopType,int active)
    {
      this.Symbol=symbol;
      this.StopPrice=stopPrice;
      this.Shares=shares;
      this.StopType=stopType;
      this.Active=active;
    }
    public override String ToString()
    {
      StringBuilder sb=new StringBuilder();
      sb.Append(Symbol).Append(",");
      sb.Append(Utility.FormatCurrency(StopPrice)).Append(",");
      sb.Append(Utility.FormatNumber(Shares,3)).Append(",");
      sb.Append(StopType).Append(",");
      sb.Append(Active.ToString()).Append(",");
      sb.Append(EffectiveDate.ToShortDateString());
      return sb.ToString();
    }
    public virtual NVPCollection ToNVPCollection()
    {
      NVPCollection nvpCollection=new NVPCollection();
      nvpCollection.Add(new NVP("Symbol",Symbol.ToString()));
      nvpCollection.Add(new NVP("StopPrice",StopPrice.ToString()));
      nvpCollection.Add(new NVP("Shares",Shares.ToString()));
      nvpCollection.Add(new NVP("StopType",StopType.ToString()));
      nvpCollection.Add(new NVP("Active",Active.ToString()));
      nvpCollection.Add(new NVP("EffectiveDate",EffectiveDate.ToShortDateString()));
      return nvpCollection;
    }
    public static StopLimit FromNVPCollection(NVPCollection nvpCollection)
    {
      StopLimit stopLimit=new StopLimit();

      NVPDictionary nvpDictionary=nvpCollection.ToDictionary();
      stopLimit.Symbol=nvpDictionary["Symbol"].Get<String>();
      stopLimit.StopPrice=nvpDictionary["StopPrice"].Get<double>();
      stopLimit.Shares=nvpDictionary["Shares"].Get<double>();
      stopLimit.StopType=nvpDictionary["StopType"].Get<String>();
      stopLimit.EffectiveDate=nvpDictionary["EffectiveDate"].Get<DateTime>();
      return stopLimit;
    }
  }
}
