using FLY.FeedbackRenZiJia.IService;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FObjBase;
using System.IO;
using FLY.FeedbackRenZiJia.Common;

namespace FLY.FeedbackRenZiJia.Server
{
    public class SnapShotBuf:ISnapShotBuf
    {
        #region 快照
        List<FlyData_SnapShot> mList = new List<FlyData_SnapShot>();
        string snapshot_path = "snapshot.csv";
        int BoltCnt;
        int ChannelCnt;

        public void Init(int boltCnt, int channelCnt)
        {
            //把记录中不是boltCnt,与 channelCnt 的删除
            BoltCnt = boltCnt;
            ChannelCnt = channelCnt;
            Load();
        }
        void Load()
        {
            try
            {
                mList.Clear();
                string filepath = snapshot_path;
                using (StreamReader sw = new StreamReader(snapshot_path, Encoding.GetEncoding("GB2312")))
                {
                    string header = sw.ReadLine();
                    while (!sw.EndOfStream)
                    {
                        string item = sw.ReadLine();
                        FlyData_SnapShot f = new FlyData_SnapShot();
                        if (f.TryParse(header, item))
                        {
                            mList.Add(f);
                        }
                    }
                }
            }
            catch
            {

            }

            var ss = from s in mList where (s.Heats.Count() != ChannelCnt) || (s.Thicks.Count() != BoltCnt) select s;
            List<FlyData_SnapShot> remove = new List<FlyData_SnapShot>();
            remove.AddRange(ss);
            foreach (FlyData_SnapShot s in remove)
            {
                mList.Remove(s);
            }
        }
        void Save()
        {
            try
            {
                string filepath = snapshot_path;

                if (mList.Count() == 0)
                {
                    return;
                }

                using (StreamWriter sw = new StreamWriter(filepath, false, Encoding.GetEncoding("GB2312")))
                {
                    sw.WriteLine(mList[0].GetHeader());
                    for (int i = 0; i < mList.Count(); i++)
                    {
                        sw.WriteLine(mList[i].ToString());
                    }
                }
            }
            catch
            {

            }
        }
        /// <summary>
        /// 获取快照 返回类型为 FlyData_SnapShot
        /// </summary>
        /// <param name="bookmark">记录点</param>
        /// <param name="AsyncDelegate"></param>
        /// <param name="AsyncState"></param>
        public void Get(int bookmark, AsyncCBHandler AsyncDelegate, object AsyncState)
        {
            var fs = from f in mList where f.Bookmark == bookmark select f;
            if (fs.Count() == 0)
            {
                AsyncDelegate(AsyncState, null);
            }
            else
            {
                AsyncDelegate(AsyncState, fs.First());
            }
        }
        /// <summary>
        /// 设置快照 
        /// </summary>
        /// <param name="f">FlyData_SnapShot</param>
        public void Set(FlyData_SnapShot f)
        {
            var fs = from _f in mList where _f.Bookmark == f.Bookmark select _f;
            if (fs.Count() != 0)
            {
                FlyData_SnapShot s = fs.First();
                s.Copy(f);
            }
            else
            {
                mList.Add(f);
            }
            Save();
        }
        /// <summary>
        /// 删除快照
        /// </summary>
        /// <param name="bookmark"></param>
        public void Del(int bookmark)
        {
            // 删除指定的项
            // 1. 先找到要删除的对象。删除集合中所有Value=10的对象
            List<FlyData_SnapShot> deleted =
                mList.FindAll(item => item.Bookmark == bookmark);
            // 2. 从集合中删除。注意:遍历的是 deleted 而不是原来的list!
            foreach (var item in deleted)
            {
                mList.Remove(item);
            }
            Save();
        }

        /// <summary>
        /// 获取保存的快照列表 返回类型为 List&lt;int&gt;
        /// </summary>
        /// <param name="AsyncDelegate"></param>
        /// <param name="AsyncState"></param>
        public void GetList(AsyncCBHandler AsyncDelegate, object AsyncState)
        {
            var bookmarks = from f in mList select f.Bookmark;
            if (bookmarks.Count() == 0)
            {
                AsyncDelegate(AsyncState, null);
            }
            else
            {
                AsyncDelegate(AsyncState, bookmarks.ToList());
            }
        }

        #endregion
    }
}