using Newtonsoft.Json;
using AIMSExtension;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace DrawGraph
{
    [Serializable, JsonObject(MemberSerialization.OptOut)]
    public class OutputManage : AreaManageBase
    {
        /// 
        /// 药品区域
        /// 
        public RectangleFramePackObj sapPpack;
        public LinesPackObj  lines ;
        public LinePackObj H3pack;
        public LinePackObj H5pack;
        public int RowsCount;
        /// 
        /// 当前手术对象
        /// 
        private OperationRecord myOpeRecord = null;
        public List DrugsListstr = new List();
        #region 初始化液体区域
        public OutputManage()
        {
            init();
        }
        public OutputManage(object _operationRecor, DrawGraph.ZedGraphControl _zedControl, TemplateManage _template, string _name) : base(_operationRecor, _zedControl, _template, _name)
        {
            init();
        }
        public void init()
        {
            //自己要用的手术对象
            myOpeRecord = OpeRecord as OperationRecord;
        }
        /// 
        /// 初始画的后置方法
        /// 
        public override void FollowUpMethod()
        {
            H3pack = template.GetPackObjectOTag("OutputManage_LinePackObj_11");
            H5pack = template.GetPackObjectOTag("OutputManage_LinePackObj_5");
            sapPpack = template.GetPackObjectOTag("OutputManage_RectangleFramePackObj_10");
            lines = template.GetPackObjectOTag("OutputManage_LinesPackObj_15");
            RowsCount = Convert.ToInt32(lines.XPageSpan / lines.XMajorGridStep);
        }
        #endregion
        #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 重写的事件结束
        #region 绑定区域数据
        public override void Bind()
        {
            init();
            DrawOutput();
        }
        /// 
        /// 画加药
        /// 
        private void DrawOutput()
        {
            try
            {
                foreach (FactOutputLiquids temp in myOpeRecord.FactOutputLiquidsList)
                {
                    temp.clearAddObj(ZedControl);
                }
                reDrawDrug();
            }
            catch (Exception exp)
            {
                PublicMethod.WriteLog(exp);
            }
        }
        /// 
        /// 重新画加药文本 
        ///  
        private void reDrawDrug()
        {
            try
            {
                //画在第几行
                int rowDrugsIndex = 0;
                //y的高度//主要高度
                double drugsy = 0;
                //加药最后位置
                double maxDrugsy = sapPpack.RealEndY;
                //持续加药当前时间
                DateTime curTimeTemp = OperationRecord.getOpeMaxTime(myOpeRecord);
                DateTime serverTime = DateTime.Now;
                if (curTimeTemp > serverTime) curTimeTemp = serverTime;
                //超出的药画备注 镇痛药备注
                List DrugListstr = new List();
                DrugListstr.Add("【出量】");
                myOpeRecord.BeforeDrugs = "";
                myOpeRecord.AnalgesiaDrug = "";
                //当前时间段加药集合
                myOpeRecord.FactOutputLiquidsList.ForEach(drug =>
                {
                    if (drug.IsContinue == 1 && drug.BeginTime == drug.EndTime) drug.End = curTimeTemp;
                    else if (drug.EndTime != null) drug.End = drug.EndTime;
                });
                List _FactOutputLiquidsList = myOpeRecord.FactOutputLiquidsList.Where(s => IfInTimeExist(s.BeginTime, s.End) == true).ToList();
                //加药按加药时间排序
                //_FactOutputLiquidsList.Sort(new FactOutputLiquidsComparer());
                for (int i = 0; i < _FactOutputLiquidsList.Count; i++)
                {
                    FactOutputLiquids temp = _FactOutputLiquidsList[i]; 
                    bool isEqual = false;
                    bool isChildEqual = false;
                    //以行号返回具休的位置
                    drugsy = sapPpack.RealY + getYPositionByListIndex(rowDrugsIndex, sapPpack.RealY, sapPpack.RealEndY, RowsCount);
                    SetDrug(temp, curTimeTemp, drugsy); 
                    //判断是否重复的 主药或组药
                    for (int j = 0; j < i; j++)
                    {
                        FactOutputLiquids addDrug1 = _FactOutputLiquidsList[j]; 
                        //如果加药品ID相同并且加加药ID不同,则认为加了同一种加药
                        if (addDrug1.Equal(temp)  )
                        {
                            addDrug1.clearDNAndDT(ZedControl);
                            //因为相同则取得相同对象的Y,为当前的对象的高度
                            drugsy = addDrug1.nowY;
                            isEqual = true;
                            continue;
                        } 
                    }
                    if (isChildEqual == true) continue;
                    if (drugsy <= maxDrugsy)
                    {
                        temp.drawText(H3pack.RealX + 0.006f, drugsy);
                        if (isEqual == false)
                            rowDrugsIndex++;
                    }
                    else
                        ListAddDrugs(DrugListstr, i, temp); 
                }
                myOpeRecord.OutsListstr = DrugListstr;
                DrawOutDose();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        private void DrawOutDose()
        { 
            try
            {
                double allOutDose = 0;  
                myOpeRecord.FactOutputLiquidsList.ForEach(item =>
                {
                    if (item.DosageUnit.Trim() == "mL" || item.DosageUnit.Trim() == "ml" || item.DosageUnit.Trim() == "ML")
                    {
                        Double val = Convert.ToDouble(item.Dosage);
                        allOutDose += val;
                    }
                });
                template.SetObjValue(myOpeRecord, "OperationRecord.OutAmount", allOutDose.ToString(), allOutDose.ToString(), allOutDose.ToString() != myOpeRecord.OutAmount ? true : false); 
            }
            catch (Exception ex)
            {
                PublicMethod.WriteLog(ex);
            }
        }
        private void SetDrug(FactOutputLiquids temp, DateTime curTimeTemp, double y)
        {
            if (temp.IsContinue == 1 && temp.BeginTime == temp.EndTime) temp.End = curTimeTemp; 
            temp.EqualDose = null;
            temp.setAnasArr(ZedControl, H5pack.RealX, sapPpack.RealEndX, myOpeRecord.pageBegin, myOpeRecord.pageBegin.AddMinutes(EVERY_PAGE_TIME_SPAN));
            temp.nowY = y;
        }
        private static void ListAddDrugs(List DrugListstr, int i, FactOutputLiquids temp)
        {
            string dose = "";
            if (dose.Trim() != "") dose += " ";
            dose += ((double)temp.Dosage).ToString();
            if (temp.DosageUnit != null)
            {
                dose += temp.DosageUnit;
            }
            DrugListstr.Add(string.Format("({0}){1} {2} {3}{4}{5}", i + 1, (temp.BeginTime == temp.EndTime) ? temp.BeginTime.ToShortTimeString() : temp.BeginTime.ToShortTimeString() + "->" + temp.EndTime.ToShortTimeString(), temp.OutputLiquidsName.Trim(), dose, "",""));
            //DrugListstr.Append(" ");
        }
        #endregion
        #region 当前区域公用事件方法
        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;
        }
        /// 
        /// 根据顶部加药序号,确定数值生命体征的纵向位置(以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;
        }
        #endregion
    }
}