using FLY.OBJComponents.Common;
using FLY.OBJComponents.IService;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FLY.OBJComponents.Server
{
    /// <summary>
    /// 报警管理系统
    /// </summary>
    public class WarningSystem : INotifyPropertyChanged, IWarningService
    {
        #region IWarningService

        /// <summary>
        /// 使能
        /// </summary>
        public bool Enable { get; set; }
        /// <summary>
        /// 正在响铃
        /// </summary>
        public bool IsRinging { get; private set; }
        /// <summary>
        /// 当前正在报警的！！！！！！
        /// </summary>
        public IBuffer<FlyData_WarningHistory> ReasonList { get; private set; }

        /// <summary>
        /// 最近报警列表
        /// </summary>
        public IBuffer<FlyData_WarningHistory> NewestList { get; private set; }

        #endregion



        public WarningSystem()
        {
            Enable = true;
            ReasonList = new Buffer<FlyData_WarningHistory>();
        }
        public void Init() 
        {
            NewestList = new BufferStorage<FlyData_WarningHistory>("warning_newest.csv");
        }
        public void Init(IBufferAdd<FlyData_WarningHistory> newestList) 
        {
            NewestList = newestList;
        }
        public void Reset()
        {
            ReasonList.Reset();
            IsRinging = false;
        }


        public void Silence()
        {
            IsRinging = false;
        }

        #region IWarningServiceSimple
        public void Add(int errcode, string description)
        {
            Add(errcode, description, ERR_STATE.ON, "");
        }
        public void Add(int errcode, string description, ERR_STATE state)
        {
            Add(errcode, description, state, "");
        }

        public void Add(int errcode, string description, ERR_STATE state, string accessory)
        {
            if (!Enable)
                return;

            FlyData_WarningHistory reason = new FlyData_WarningHistory();
            reason.Time = DateTime.Now;

            reason.ErrCode = errcode;
            reason.Description = description;
            reason.State = state;
            reason.Accessory = accessory;

            FlyData_WarningHistory error = null;
            Buffer<FlyData_WarningHistory> reasonList = ReasonList as Buffer<FlyData_WarningHistory>;
            int error_id = 0;
            if (reasonList.Count > 0)
            {
                int idx = reasonList.list.FindIndex(e => e.ErrCode == errcode);
                if (idx >= 0)
                {
                    error_id = reasonList.GetID(idx);
                    error = reasonList.list[idx];
                }
            }
            switch (state)
            {
                case ERR_STATE.ON:
                    if (error == null)
                    {
                        reasonList.Add(reason.Clone());

                    }
                    else
                    {
                        //已经有了，再发生，不管它。
                        return;
                    }
                    break;
                case ERR_STATE.OFF:
                    if (error == null)
                    {
                        //没有在报警，不管它。
                        return;
                    }
                    else
                    {
                        error.State = state;
                        reasonList.Remove(error_id);

                    }
                    break;
            }
            var newestList = NewestList as IBufferAdd<FlyData_WarningHistory>;
            newestList.Add(reason);


            if (reasonList.Count > 0)
            {
                IsRinging = true;
            }
            else
            {
                Reset();
            }
        }

        public void Remove(int errcode) {
 

            FlyData_WarningHistory error = null;
            Buffer<FlyData_WarningHistory> reasonList = ReasonList as Buffer<FlyData_WarningHistory>;

            if (reasonList.Count == 0)
                return;

            int idx = reasonList.list.FindIndex(e => e.ErrCode == errcode);
            if (idx < 0)
                return;

            int error_id = reasonList.GetID(idx);
            error = reasonList.list[idx];
            error.State = ERR_STATE.OFF;
            reasonList.Remove(error_id);

            var newestList = NewestList as IBufferAdd<FlyData_WarningHistory>;

            newestList.Add(new FlyData_WarningHistory
            {
                Time = DateTime.Now,
                ErrCode = errcode,
                Description = error.Description,
                State = ERR_STATE.OFF
            });


            if (reasonList.Count > 0)
            {
                IsRinging = true;
            }
            else
            {
                Reset();
            }
        }
        #endregion

        /// <summary>
        /// 获取能被交易的属性
        /// </summary>
        /// <returns></returns>
        public string[] GetPropertys()
        {
            return new string[] {
                "Enable"
            };
        }
        #region INotifyPropertyChanged 成员

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion

    }
}
