using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace FLY.FeedbackRenZiJia.Common
{
    public class FlyData_SnapShot
    {

        /// <summary>
        /// 唯一序列码
        /// </summary>
        public int Bookmark { get; set; }
        /// <summary>
        /// 第1幅 开始测量时间
        /// </summary>
        public DateTime BM1_BeginTime { get; set; }
        /// <summary>
        /// 第1幅 结束测量时间
        /// </summary>
        public DateTime BM1_EndTime { get; set; }
        /// <summary>
        /// 第1幅 方向
        /// </summary>
        public Misc.DIRECTION BM1_Direction { get; set; }

        /// <summary>
        /// 第2幅 开始测量时间
        /// </summary>
        public DateTime BM2_BeginTime { get; set; }
        /// <summary>
        /// 第2幅 结束测量时间
        /// </summary>
        public DateTime BM2_EndTime { get; set; }
        /// <summary>
        /// 第2幅 方向
        /// </summary>
        public Misc.DIRECTION BM2_Direction { get; set; }


        /// <summary>
        /// 复位区号
        /// </summary>
        public int OrgBoltNo { get; set; }

        /// <summary>
        /// 旋转架旋转角度
        /// </summary>
        public double RAngle { get; set; }


        /// <summary>
        /// 第1幅 改变加热时间
        /// </summary>
        public DateTime BM1_HTime { get; set; }

        /// <summary>
        /// 第2幅 改变加热时间
        /// </summary>
        public DateTime BM2_HTime { get; set; }

        /// <summary>
        /// 厚度偏差数据,100%, 大小 NBolts
        /// </summary>
        public int[] Thicks;

        /// <summary>
        /// 加热偏差数据,100%, 大小 ChannelCnt
        /// </summary>
        public int[] Heats;


        public string GetHeader()
        {
            string header = "BM,测量时间1,结束时间1,旋转方向1,测量时间2,结束时间2,旋转方向2,复位区号,旋转角度°";
            for (int i = 0; i < Thicks.Count(); i++)
            {
                header += ",厚度偏差" + (i + 1).ToString();
            }
            header += ",加热时间1,加热时间2";
            for (int i = 0; i < Heats.Count(); i++)
            {
                header += ",加热偏差" + (i + 1).ToString();
            }

            return header;
        }
        public override string ToString()
        {
            string str;
            str = Bookmark.ToString();//唯一序列码
            str += "," + BM1_BeginTime.ToString();//测量时间1
            str += "," + BM1_EndTime.ToString();//结束时间1
            str += "," + BM1_Direction.ToString();//旋转方向1

            str += "," + BM2_BeginTime.ToString();//测量时间2
            str += "," + BM2_EndTime.ToString();//结束时间2
            str += "," + BM2_Direction.ToString();//旋转方向2

            str += "," + OrgBoltNo.ToString();//复位区号
            str += "," + RAngle.ToString("F1");//旋转角度°

            for (int i = 0; i < Thicks.Count(); i++)//厚度偏差
            {
                if (Misc.MyBase.ISVALIDATA(Thicks[i]))
                    str += "," + Thicks[i].ToString();
                else
                    str += ",";
            }

            str += "," + BM1_HTime.ToString();//加热时间1
            str += "," + BM2_HTime.ToString();//加热时间2

            for (int i = 0; i < Heats.Count(); i++)//加热偏差
            {
                if (Misc.MyBase.ISVALIDATA(Thicks[i]))
                    str += "," + Heats[i].ToString();
                else
                    str += ",";

            }
            return str;
        }
        public bool TryParse(string header, string str)
        {
            string[] items = header.Split(new char[] { ',' });
            if (items.Length < 1 + 8 + 1 + 2 + 1)
                return false;

            int thicks_cnt = 0;//厚度的数量
            int heats_cnt = 0;//加热的数量
            int thicks1st_idx = -1;//第1个厚度 序号
            int heats1st_idx = -1;//第1个加热 序号
            //搜索 , 厚度
            Regex r = new Regex(@"厚度偏差\d+");
            Regex r2 = new Regex(@"加热偏差\d+");

            for (int i = 0; i < items.Count(); i++)
            {
                string s = items[i];
                if (r.IsMatch(s))
                {
                    if (thicks1st_idx == -1)
                        thicks1st_idx = i;
                    thicks_cnt++;
                }
                else if (r2.IsMatch(s))
                {
                    if (heats1st_idx == -1)
                        heats1st_idx = i;
                    heats_cnt++;
                }
            }

            if ((thicks_cnt == 0) || (heats_cnt == 0) || (thicks1st_idx == -1) || (heats1st_idx == -1))
            {
                //异常
                return false;
            }

            int len = items.Length;
            items = str.Split(new char[] { ',' });
            if ((items.Length) != len)
                return false;

            int idx = thicks1st_idx - 9;

            DateTime time;
            Misc.DIRECTION dir;
            int num_i;
            double num_d;

            if (!int.TryParse(items[idx], out num_i))
                return false;
            Bookmark = num_i;
            idx += 1;

            if (!DateTime.TryParse(items[idx], out time))
                return false;
            BM1_BeginTime = time;
            idx += 1;

            if (!DateTime.TryParse(items[idx], out time))
                return false;
            BM1_EndTime = time;
            idx += 1;

            if (!Enum.TryParse<Misc.DIRECTION>(items[idx], out dir))
                return false;
            BM1_Direction = dir;
            idx += 1;

            if (!DateTime.TryParse(items[idx], out time))
                return false;
            BM2_BeginTime = time;
            idx += 1;

            if (!DateTime.TryParse(items[idx], out time))
                return false;
            BM2_EndTime = time;
            idx += 1;

            if (!Enum.TryParse<Misc.DIRECTION>(items[idx], out dir))
                return false;
            BM2_Direction = dir;
            idx += 1;

            if (!int.TryParse(items[idx], out num_i))
                return false;
            OrgBoltNo = num_i;
            idx += 1;

            if (!double.TryParse(items[idx], out num_d))
                return false;
            RAngle = num_d;
            idx += 1;


            Thicks = new int[thicks_cnt];
            idx = thicks1st_idx;
            for (int i = 0; i < thicks_cnt; i++)
            {
                string s = items[idx];
                if (string.IsNullOrEmpty(s))
                {
                    Thicks[i] = Misc.MyBase.NULL_VALUE;
                }
                else
                {
                    if (int.TryParse(s, out num_i))
                        Thicks[i] = num_i;
                    else
                        return false;
                }
                idx++;
            }



            idx = heats1st_idx - 2;
            if (!DateTime.TryParse(items[idx], out time))
                return false;
            BM1_HTime = time;
            idx += 1;

            if (!DateTime.TryParse(items[idx], out time))
                return false;
            BM2_HTime = time;
            idx += 1;


            Heats = new int[heats_cnt];
            idx = heats1st_idx;
            for (int i = 0; i < heats_cnt; i++)
            {
                string s = items[idx];
                if (string.IsNullOrEmpty(s))
                {
                    Heats[i] = Misc.MyBase.NULL_VALUE;
                }
                else
                {
                    int n;
                    if (int.TryParse(s, out n))
                        Heats[i] = n;
                    else
                        return false;
                }
                idx++;
            }

            return true;
        }



        public byte[] ToBytes()
        {
            List<byte> buf = new List<byte>();
            #region 测厚
            buf.AddRange(BitConverter.GetBytes(Bookmark));//4
            buf.AddRange(BitConverter.GetBytes(BM1_BeginTime.Ticks));//8
            buf.AddRange(BitConverter.GetBytes(BM1_EndTime.Ticks));//8
            buf.AddRange(BitConverter.GetBytes((int)BM1_Direction));//4
            buf.AddRange(BitConverter.GetBytes(BM2_BeginTime.Ticks));//8
            buf.AddRange(BitConverter.GetBytes(BM2_EndTime.Ticks));//8
            buf.AddRange(BitConverter.GetBytes((int)BM2_Direction));//4


            buf.AddRange(BitConverter.GetBytes(OrgBoltNo));//4
            buf.AddRange(BitConverter.GetBytes(RAngle));//8

            #region 厚度
            buf.AddRange(BitConverter.GetBytes(Thicks.Count()));//4
            for (int i = 0; i < Thicks.Count(); i++)
                buf.AddRange(BitConverter.GetBytes(Thicks[i]));//4
            #endregion

            #endregion
            #region 加热
            buf.AddRange(BitConverter.GetBytes(BM1_HTime.Ticks));//8
            buf.AddRange(BitConverter.GetBytes(BM2_HTime.Ticks));//8
            buf.AddRange(BitConverter.GetBytes(Heats.Count()));//4
            for (int i = 0; i < Heats.Count(); i++)
                buf.AddRange(BitConverter.GetBytes(Heats[i]));//4
            #endregion

            return buf.ToArray();
        }
        public bool TryParse(byte[] value)
        {
            int cnt;
            return TryParse(value, 0, out cnt);
        }
        public bool TryParse(byte[] value, int index, out int cnt)
        {
            cnt = 4;
            cnt += 8 + 8 + 4 + 8 + 8 + 4;
            cnt += 4 + 8;
            if (value.Length < (index + cnt))
                return false;

            int idx = index;
            #region 测厚
            Bookmark = BitConverter.ToInt32(value, idx);
            idx += 4;

            try
            {
                BM1_BeginTime = new DateTime(BitConverter.ToInt64(value, idx));
            }
            catch
            {
                return false;
            }
            idx += 8;

            try
            {
                BM1_EndTime = new DateTime(BitConverter.ToInt64(value, idx));
            }
            catch
            {
                return false;
            }
            idx += 8;

            BM1_Direction = (Misc.DIRECTION)BitConverter.ToInt32(value, idx);
            idx += 4;

            try
            {
                BM2_BeginTime = new DateTime(BitConverter.ToInt64(value, idx));
            }
            catch
            {
                return false;
            }
            idx += 8;

            try
            {
                BM2_EndTime = new DateTime(BitConverter.ToInt64(value, idx));
            }
            catch
            {
                return false;
            }
            idx += 8;

            BM2_Direction = (Misc.DIRECTION)BitConverter.ToInt32(value, idx);
            idx += 4;




            OrgBoltNo = BitConverter.ToInt32(value, idx);
            idx += 4;

            RAngle = BitConverter.ToDouble(value, idx);
            idx += 8;



            #region 厚度
            cnt += 4;
            if (value.Length < (index + cnt))
                return false;
            int len = BitConverter.ToInt32(value, idx);
            idx += 4;

            cnt += len * 4;
            if (value.Length < (index + cnt))
                return false;
            Thicks = new int[len];
            for (int i = 0; i < len; i++)
            {
                Thicks[i] = BitConverter.ToInt32(value, idx);
                idx += 4;
            }

            #endregion


            #endregion
            #region 加热
            cnt += 8 + 8;
            if (value.Length < (index + cnt))
                return false;
            try
            {
                BM1_HTime = new DateTime(BitConverter.ToInt64(value, idx));
            }
            catch
            {
                return false;
            }
            idx += 8;

            try
            {
                BM2_HTime = new DateTime(BitConverter.ToInt64(value, idx));
            }
            catch
            {
                return false;
            }
            idx += 8;

            len = BitConverter.ToInt32(value, idx);
            idx += 4;

            cnt += len * 4;
            if (value.Length < (index + cnt))
                return false;

            Heats = new int[len];
            for (int i = 0; i < Heats.Count(); i++)
            {
                Heats[i] = BitConverter.ToInt32(value, idx);
                idx += 4;
            }
            #endregion
            return true;
        }


        public void Copy(FlyData_SnapShot f)
        {
            Bookmark = f.Bookmark;
            BM1_BeginTime = f.BM1_BeginTime;
            BM1_EndTime = f.BM1_EndTime;
            BM1_Direction = f.BM1_Direction;
            BM2_BeginTime = f.BM2_BeginTime;
            BM2_EndTime = f.BM2_EndTime;
            BM2_Direction = f.BM2_Direction;

            OrgBoltNo = f.OrgBoltNo;
            RAngle = f.RAngle;

            BM1_HTime = f.BM1_HTime;
            BM2_HTime = f.BM2_HTime;
            Thicks = f.Thicks.Clone() as int[];
            Heats = f.Heats.Clone() as int[];
        }
    }
}