using HelperDB;
using Newtonsoft.Json;
using AIMSExtension;
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.Design;
namespace DrawGraph
{
    public class IconManage : AreaManageBase
    {
        public RectangleFramePackObj IconPpack;
        public LinePackObj H5pack;
        public TextPackObj Extend2;
        /// 
        /// 当前手术对象
        /// 
        private OperationRecord myOpeRecord = null;
        public IconManage() { }
        public IconManage(object _operationRecor, ZedGraphControl _zedControl, TemplateManage _template, string _name) : base(_operationRecor, _zedControl, _template, _name)
        {
            init();
        }
        public void init()
        {
            //自己要用的手术对象
            myOpeRecord = OpeRecord as OperationRecord;
        }
        /// 
        /// 初始画的后置方法
        /// 
        public override void FollowUpMethod()
        {
            H5pack = template.GetPackObjectOTag("IconManage_LinePackObj_5");
            if (H5pack != null)
            {
                eventstartX = H5pack.RealX;
                eventy = H5pack.RealY;
                eventendy = H5pack.RealEndY;
            }
            IconPpack = template.GetPackObjectOTag("IconManage_RectangleFramePackObj_2");
            if (IconPpack != null)
            {
                eventy = IconPpack.RealY;
                eventendy = IconPpack.RealEndY;
                eventendX = IconPpack.RealEndX + 0.02;
            }
            LinePackObj line = template.GetPackObjectOTag("IconManage_LinePackObj_6");
            if (line != null)
            {
                eventstartX = line.RealX;
                eventendX = line.RealEndX + 0.02;
            }
        }
        #region 重写的事件
        /// 
        /// 鼠标点击画板
        /// 
        /// 
        /// 
        public override void MouseDown(ZedGraphControl sender, MouseEventArgs e)
        {
            //if (e.Button == System.Windows.Forms.MouseButtons.Left)
            //{
            //    MessageBox.Show(this.GetType().Name + "is Click Left Button");
            //}
        }
        public override void MouseMove(ZedGraphControl sender, MouseEventArgs e)
        {
        }
        public override void MouseUp(ZedGraphControl sender, MouseEventArgs e)
        {
        }
        public override void MouseDoubleClick(ZedGraphControl sender, MouseEventArgs e)
        {
        }
        public override void KeyUp(ZedGraphControl sender, KeyEventArgs e)
        {
        }
        #endregion 重写的事件结束
        public override void Bind()
        {
            init();
            DrawEvent();
        }
        /// 
        /// 画事件
        /// 
        private void DrawEvent()
        {
            if (myOpeRecord.FactEventsList.Count > 0)
            {
                foreach (FactEvents temp in myOpeRecord.FactEventsList)
                {
                    temp.clearAddObj(ZedControl);
                }
                reDrawEvent();
            }
        }
        double eventy;
        double eventendy;
        double eventendX;
        double eventstartX;
        /// 
        /// 重新画事件文本
        /// 
        private void reDrawEvent()
        {
            //画在第几行
            int rowIndex = 0;
            DateTime? drawDatetime = null;
            FactEvents drawEvent = null;
            string LastNumber = "";
            double span = getYPositionByListIndex(1, eventy, eventendy, 2);
            List eventListstr = new List();
            eventListstr.Add("【事件】");
            myOpeRecord.FactEventsList.Sort(new FactEventsComparer()); 
            //循环加药集体
            for (int i = 0; i < myOpeRecord.FactEventsList.Count; i++)
            {
                FactEvents temp = myOpeRecord.FactEventsList[i]; 
                //判断该事件是否存在当前时间段
                if (IfInTimeExist(temp.EventBeginTime.Value, temp.EventEndTime.Value) == false) continue;
                if (temp.EventBeginTime.Value.ToShortTimeString() == temp.EventEndTime.Value.ToShortTimeString())
                {
                    eventListstr.Add(string.Format("{0}{1} {2} {3}{4}", getNumber(i), temp.EventBeginTime.Value.ToShortTimeString(), temp.EventName, "", temp.Remark == null ? "" : temp.Remark.ToString()));
                }
                else
                {
                    eventListstr.Add(string.Format("{0}{1}->{2} {3} {4}{5}", getNumber(i), temp.EventBeginTime.Value.ToShortTimeString(), temp.EventEndTime.Value.ToShortTimeString(), temp.EventName, "", temp.Remark == null ? "" : temp.Remark.ToString()));
                }
                temp.setAnasArr(ZedControl, eventstartX, eventendX, myOpeRecord.PageBegin, myOpeRecord.PageBegin.AddMinutes(EVERY_PAGE_TIME_SPAN));
                try
                {
                    string EventName = temp.EventName;
                    if (EventName == "喉罩") EventName = "插管";
                    DataRow[] dr = myOpeRecord.PhysioParamList.Select("Name ='" + EventName + "'  ", "");
                    if (dr.Length > 0)
                    {
                        temp.clearDNAndDT(ZedControl);
                        string tagName = dr[0]["imgPath"].ToString();
                        temp.drawIMG(ZedControl, tagName, eventy, 0.013);
                    }
                    else
                    {
                        int DValue = 0;
                        string drawNumber = "";
                        if (drawDatetime != null && temp.EventBeginTime > drawDatetime.Value.AddMinutes(-1) && temp.EventBeginTime < drawDatetime.Value.AddMinutes(10) && LastNumber != "" && drawEvent != null)
                        {
                            drawEvent.clearDNAndDT(ZedControl);
                            drawEvent = temp;
                            drawNumber = LastNumber + "-" + getNumber(i);
                            DValue = (int)(((TimeSpan)(temp.EventBeginTime - drawDatetime.Value)).TotalMinutes / 2);
                        }
                        else
                        {
                            LastNumber = getNumber(i);
                            drawNumber = LastNumber;
                            drawEvent = temp;
                            drawDatetime = temp.EventBeginTime.Value;
                        }
                        //画图上的序号
                        temp.drawNumber(ZedControl, drawNumber, eventy + span - 0.001, DValue, Color.DarkBlue);
                    }
                    rowIndex++;
                }
                catch (Exception exp)
                {
                    PublicMethod.WriteLog(exp, "");
                }
            }
            myOpeRecord.EventListstr = eventListstr;
            TextPackObj packObj2 = template.GetPackObjectOTag("IconManage_TextPackObj_14_OperationRecord_AnalgesiaRecord_Extend2");
            if (packObj2 != null)
            {
                List AfterDrugsListstr = new List();
                myOpeRecord.ClearIconstr(ZedControl);
                myOpeRecord.FactDrugList.Sort(new FactDrugComparer());
                foreach (var item in myOpeRecord.FactDrugList)
                {
                    ListAddDrugs(AfterDrugsListstr, item);
                }
                if (AfterDrugsListstr.Count > 0)
                {
                    SetRemarkInfo(AfterDrugsListstr, packObj2, 15, 6.5f, 40, "IconDrugRemarkRow");
                    //packObj2.PackText = "";
                    //foreach (var item in AfterDrugsListstr)
                    //{
                    //    packObj2.PackText += item ;//+ "\n"
                    //}
                    //packObj2.PackValue = packObj2.PackText;
                    //packObj2.Draw();
                }
            }
            TextPackObj packObj = template.GetPackObjectOTag("IconManage_TextPackObj_40_OperationRecord_AnalgesiaRecord_Extend3");
            if (packObj != null && eventListstr.Count > 1)
            {
                List Eventststr = new List();
                foreach (var item in eventListstr)
                {
                    if (item != "【事件】")
                        Eventststr.Add(((item.Substring(1, item.Length - 1))));
                }
                myOpeRecord.FactEventsList.Sort(new FactEventsComparer());
                if (Eventststr.Count > 0)
                {
                    SetRemarkInfo(Eventststr, packObj, 15, 7f, 38, "IconeventRemarkRow");
                }
                //packObj.PackText = "";
                //foreach (var item in eventListstr)
                //{
                //    if (item != "【事件】")
                //        packObj.PackText += ((item.Substring(1, item.Length - 1)) + "\n");
                //}
                //packObj.PackValue = packObj.PackText;
                //packObj.Draw();
            }
        }
        private void SetRemarkInfo(List PunctureAndIntubatios, TextPackObj remarkPpack, int remarkRowscount, float fontsize, int fontlength, string TagName)
        {
            int remarkRow = 0;
            int AllRemarkRow = 0;
            double lastIndex = remarkPpack.RealEndY;
            double x = remarkPpack.RealX;
            double y = remarkPpack.RealY + getYPositionByListIndex(remarkRow, remarkPpack.RealY, lastIndex, remarkRowscount);
            if (PunctureAndIntubatios != null)
            {
                foreach (string item in PunctureAndIntubatios)
                {
                    List PunStr = stringformat(item, fontlength);
                    for (int m = 0; m < PunStr.Count; m++)
                    {
                        if (PunStr[m] == null) continue;
                        y = remarkPpack.RealY + getYPositionByListIndex(remarkRow, remarkPpack.RealY, lastIndex, remarkRowscount);
                        if (PunStr[m] == null || PunStr[m].Trim() == "") break;
                        ZUtil.DrawText(PunStr[m], x, y, ZedControl, fontsize, TagName + AllRemarkRow);
                        remarkRow++;
                        AllRemarkRow++;
                    }
                }
            }
        }
        private static void ListAddDrugs(List DrugListstr, FactDrug temp)
        {
            string dose = "";
            if (temp.Density != 0)
            {
                dose += ((double)temp.Density).ToString();
                if (temp.DensityUnit != null)
                {
                    dose += temp.DensityUnit;
                }
            }
            if (dose.Trim() != "") dose += " ";
            if (temp.Velocity != "")
            {
                dose += temp.Velocity;
                if (temp.VelocityUnit != null)
                {
                    dose += temp.VelocityUnit;
                }
            }
            if (dose.Trim() != "") dose += " ";
            if (temp.Dosage != 0)
            {
                dose += ((double)temp.Dosage).ToString();
                if (temp.DosageUnit != null)
                {
                    dose += temp.DosageUnit;
                }
            }
            DrugListstr.Add(string.Format("{0}{1} {2} {3}{4}{5}", "", (temp.DrugBeginTime == temp.DrugEndTime) ? temp.DrugBeginTime.ToShortTimeString() : temp.DrugBeginTime.ToShortTimeString() + "->" + temp.DrugEndTime.ToShortTimeString(), temp.DrugName.Trim(), dose, "", temp.DrugChannel == null ? "" : " " + temp.DrugChannel.ToString()));
            //DrugListstr.Append(" ");
        }
        #region 格式化字符串长度
        /// 
        /// 格式化字符串长度
        /// 
        /// 输入的字符串
        /// 截取的长度
        /// 被截取完的字符串
        public static List stringformat(string str, int n)
        {
            ///
            ///格式化字符串长度,超出部分显示省略号,区分汉字跟字母。汉字2个字节,字母数字一个字节
            ///
            List strList = new List();
            string temp = string.Empty;
            if (System.Text.Encoding.Default.GetByteCount(str) <= n)//如果长度比需要的长度n小,返回原字符串
            {
                strList.Add(str);
            }
            else
            {
                int t = 0;
                char[] q = str.ToCharArray();
                for (int i = 0; i <= q.Length; i++)
                {
                    if (t > n)
                    {
                        strList.Add(temp);
                        temp = "";
                        t = 0;
                    }
                    if (i == q.Length)// - 1
                    {
                        strList.Add(temp);
                        break;
                    }
                    //判断是否汉字:
                    if ((int)q[i] >= 0x4E00 && (int)q[i] <= 0x9FA5)
                    {
                        temp += q[i];
                        t += 2;
                    }
                    //判断半角如下: 
                    else if (q[i].ToString().Length == Encoding.Default.GetByteCount(q[i].ToString()))
                    {
                        temp += q[i];
                        t++;
                    }
                    //判断全角如下: 
                    else if (2 * q[i].ToString().Length == Encoding.Default.GetByteCount(q[i].ToString()))
                    {
                        temp += q[i];
                        t += 2;
                    }
                    else
                    {
                        temp += q[i];
                        t++;
                    }
                }
            }
            return strList;
        }
        #endregion
        private bool IfInTimeExist(DateTime Begin, DateTime End)
        {
            DateTime lastime = myOpeRecord.lastPageBegin.AddSeconds(59);
            bool b = false;
            if (End == null)
            {
                if (Begin > myOpeRecord.PageBegin && Begin < lastime)
                {
                    b = true;
                }
            }
            else
            {
                if (Begin >= myOpeRecord.PageBegin && Begin <= lastime)
                {
                    b = true;
                }
                else if (End >= myOpeRecord.PageBegin && End <= lastime)
                {
                    b = true;
                }
                else if (Begin < myOpeRecord.PageBegin && End > lastime)
                {
                    b = true;
                }
            }
            return b;
        }
        private DateTime GetInsertTime(DateTime pdTemp, bool IsInRToomTime = false)
        {
            DateTime insTime = pdTemp.Date.AddHours(pdTemp.Hour).AddMinutes(pdTemp.Minute);
            if (collectInterval == 5)
            {
                int minute = pdTemp.Minute % 5;//计算5的整数分钟
                if (minute >= 3)
                    insTime = insTime.AddMinutes(5 - minute);
                else if (minute != 0 && IsInRToomTime == true)
                    insTime = insTime.AddMinutes(5 - minute);
                else
                    insTime = insTime.AddMinutes(0 - minute);
            }
            else if (collectInterval == 10)
            {
                double minute = pdTemp.Minute % 10;//计算5的整数分钟
                if (minute >= 5)
                    insTime = insTime.AddMinutes(10 - minute);
                else
                    insTime = insTime.AddMinutes(0 - minute);
            }
            return insTime;
        }
        /// 
        /// 根据顶部加药序号,确定数值生命体征的纵向位置(以1为单位)
        /// 
        /// 
        /// 
        public double getYPositionByListIndex(double index, double yTop, double yBottom, int rowCount)
        {
            double heightT = ZedControl.Height * (yBottom - yTop);
            double setpTemp = heightT / rowCount;
            //求一格在实际高度中的百分比
            double bfb = (setpTemp / heightT);
            //两线之间度*百分比得到一格的百分比高度
            double ygBFB = (yBottom - yTop) * bfb;
            double y = ygBFB * index;
            return y;
        }
        public static string getNumber(int number)
        {
            try
            {
                string str = "①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮";
                if (number >= 15)
                    str = "①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿";
                str = str.Substring(number, 1);
                return str;
            }
            catch (Exception)
            {
                return number.ToString() + ":";
            }
        }
    }
}