using AIMSBLL;
using AIMSExtension;
using DCSoftDotfuscate;
using DevComponents.DotNetBar;
using DrawGraph;
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.Remoting.Metadata.W3cXsd2001;
using System.Windows.Forms;
namespace AIMS.OperationAanesthesia
{
    public partial class frmPhysioDataEdit : Form
    {
        #region 界面参数
        /// 
        /// 手术记录
        /// 
        public OperationRecord _record;
        #endregion
        public System.Windows.Forms.Label selectTime;
        public System.Windows.Forms.Label selectConfig;
        public System.Windows.Forms.Panel paneltop;
        public System.Windows.Forms.Panel paneltop2;
        #region 窗体构造函数
        public frmPhysioDataEdit(OperationRecord operationRecord)
        {
            InitializeComponent();
            _record = operationRecord;
        }
        #endregion
        #region 窗体加载事件
        private void FormPrintBGYYNew_Load(object sender, EventArgs e)
        {
            dtpInsertBegin.Value = _record.InRoomTime.Value;
            dtpInsertEnd.Value = _record.InRoomTime.Value.AddMinutes(240);
            int rows1 = 2;
            //循环加载CheckBox控件
            foreach (PhysioDataConfig ade in _record.PhysioConfigList)
            {
                if (ade.IsDefalultShow == false) continue;
                System.Windows.Forms.Label cb = new System.Windows.Forms.Label();
                cb.Tag = ade;
                cb.Text = ade.Name;
                cb.Font = new System.Drawing.Font("微软雅黑", 8f);
                cb.Width = 75;
                cb.Tag = ade;
                cb.Location = new Point(5, rows1 * (cb.Height + 5));
                groupBox3.Controls.Add(cb);
                System.Windows.Forms.TextBox text = new System.Windows.Forms.TextBox();
                text.Tag = ade;
                text.Font = new System.Drawing.Font("微软雅黑", 8f);
                text.Width = 40;
                text.Tag = ade;
                text.Location = new Point(80, rows1 * (cb.Height + 5));
                groupBox3.Controls.Add(text);
                System.Windows.Forms.Label unit = new System.Windows.Forms.Label();
                unit.Tag = ade;
                unit.Text = ade.Unit;
                unit.Font = new System.Drawing.Font("微软雅黑", 7f);
                unit.Width = 50;
                unit.Tag = ade;
                unit.Location = new Point(120, rows1 * (unit.Height + 5));
                groupBox3.Controls.Add(unit);
                rows1++;
            }
            foreach (PhysioDataConfig ade in _record.PhysioAnesConfigList)
            {
                if (ade.IsDefalultShow == false) continue;
                System.Windows.Forms.Label cb = new System.Windows.Forms.Label();
                cb.Tag = ade;
                cb.Text = ade.Name;
                cb.Font = new System.Drawing.Font("微软雅黑", 8f);
                cb.Width = 75;
                cb.Tag = ade;
                cb.Location = new Point(5, rows1 * (cb.Height + 5));
                groupBox3.Controls.Add(cb);
                System.Windows.Forms.TextBox text = new System.Windows.Forms.TextBox();
                text.Tag = ade;
                text.Font = new System.Drawing.Font("微软雅黑", 8f);
                text.Width = 40;
                text.Tag = ade;
                text.Location = new Point(80, rows1 * (cb.Height + 5));
                groupBox3.Controls.Add(text);
                System.Windows.Forms.Label unit = new System.Windows.Forms.Label();
                unit.Tag = ade;
                unit.Text = ade.Unit;
                unit.Font = new System.Drawing.Font("微软雅黑", 7f);
                unit.Width = 50;
                unit.Tag = ade;
                unit.Location = new Point(120, rows1 * (unit.Height + 5));
                groupBox3.Controls.Add(unit);
                rows1++;
            }
            LoadPhysioData();
            btnAdd.Focus();
        }
        private void LoadPhysioData()
        {
            System.Data.DataTable dtPhysioData = BOperationRecord.getByOpeIDIsPhysioData(_record.Id.Value);
            panel2.Controls.Clear();
            int rows = 2;
            int Width = panel2.Width - (panel2.Width / (240 / 5) * 3);
            //循环加载麻醉体征控件  
            for (int x = _record.PhysioAnesConfigList.Count - 1; x >= 0; x--)
            {
                PhysioDataConfig ade = _record.PhysioAnesConfigList[x];
                if (ade.IsDefalultShow == false) continue;
                List list = new List();
                for (int i = 0; i < dtPhysioData.Rows.Count; i++)
                {
                    if (dtPhysioData.Rows[i]["Name"].ToString().Equals(ade.Name.ToString()))
                    {
                        PhysioData pdTemp = PhysioDataConfig.newPhysioData(ade, _record.Id.Value, DateTime.Parse(dtPhysioData.Rows[i]["RecordTime"].ToString()), dtPhysioData.Rows[i]["Value"].ToString());
                        list.Add(pdTemp);
                    }
                }
                System.Windows.Forms.Panel panel = new System.Windows.Forms.Panel();
                panel.Tag = ade;
                panel.Dock = System.Windows.Forms.DockStyle.Top;
                panel.Size = new System.Drawing.Size(Width, 30);
                for (int i = (240 / ade.YAisx) - 1; i >= 0; i--)
                {
                    DateTime SpanTime = _record.InRoomTime.Value.AddMinutes(i * ade.YAisx);
                    PhysioData pdNew = null;
                    foreach (var item in list)
                    {
                        if (item.RecordTime == SpanTime)
                        {
                            pdNew = item;
                            pdNew.config = ade;
                            break;
                        }
                    }
                    if (pdNew == null)
                    {
                        pdNew = PhysioDataConfig.newPhysioData(ade, _record.Id.Value, SpanTime, -1);
                    }
                    if (ade.ImgPath != null && ade.ImgPath != "")
                    {
                        System.Windows.Forms.ComboBox textNum = new System.Windows.Forms.ComboBox();
                        textNum.Items.AddRange(ade.ImgPath.Split('|'));
                        textNum.Name = pdNew.config.Id + "" + SpanTime.ToString("HHmm");
                        textNum.Tag = pdNew;
                        if (pdNew.ValueString != "-1")
                            textNum.Text = pdNew.ValueString.ToString();
                        textNum.Width = Width / (240 / ade.YAisx);
                        textNum.Dock = System.Windows.Forms.DockStyle.Left;
                        textNum.DropDownStyle = ComboBoxStyle.DropDownList;
                        textNum.Font = new System.Drawing.Font("微软雅黑", 7f);
                        textNum.Click += TextNum_Click;
                        textNum.Leave += ComeBoxNum_Leave;
                        panel.Controls.Add(textNum);
                    }
                    else
                    {
                        System.Windows.Forms.TextBox textNum = new System.Windows.Forms.TextBox();
                        textNum.Name = pdNew.config.Id + "" + SpanTime.ToString("HHmm");
                        textNum.Tag = pdNew;
                        if (pdNew.ValueString != "-1")
                            textNum.Text = pdNew.ValueString.ToString();
                        textNum.Width = Width / (240 / ade.YAisx);
                        textNum.Dock = System.Windows.Forms.DockStyle.Left;
                        textNum.Font = new System.Drawing.Font("微软雅黑", 7f);
                        textNum.Click += TextNum_Click;
                        textNum.Leave += TextNum_Leave;
                        textNum.DoubleClick += TextNum_DoubleClick;
                        panel.Controls.Add(textNum);
                    }
                }
                System.Windows.Forms.Label textName = new System.Windows.Forms.Label();
                textName.Name = "txt" + ade.Name;
                textName.Text = ade.Name;
                textName.Font = new System.Drawing.Font("微软雅黑", 8f);
                textName.Width = panel2.Width / (240 / 5) * 3;
                textName.Dock = System.Windows.Forms.DockStyle.Left;
                panel.Controls.Add(textName);
                panel2.Controls.Add(panel);
                rows++;
            }
            //循环加载数值生命体征
            for (int x = _record.PhysioConfigList.Count - 1; x >= 0; x--)
            {
                PhysioDataConfig ade = _record.PhysioConfigList[x];
                if (ade.IsDefalultShow == false) continue;
                List list = new List();
                for (int i = 0; i < dtPhysioData.Rows.Count; i++)
                {
                    if (dtPhysioData.Rows[i]["Name"].ToString().Equals(ade.Name.ToString()))
                    {
                        PhysioData pdTemp = PhysioDataConfig.newPhysioData(ade, _record.Id.Value, DateTime.Parse(dtPhysioData.Rows[i]["RecordTime"].ToString()), dtPhysioData.Rows[i]["Value"].ToString());
                        list.Add(pdTemp);
                    }
                }
                System.Windows.Forms.Panel panel = new System.Windows.Forms.Panel();
                panel.Tag = ade;
                panel.Dock = System.Windows.Forms.DockStyle.Top;
                panel.Size = new System.Drawing.Size(Width, 30);
                for (int i = (240 / 5) - 1; i >= 0; i--)
                {
                    DateTime SpanTime = _record.InRoomTime.Value.AddMinutes(i * 5);
                    System.Windows.Forms.TextBox textNum = new System.Windows.Forms.TextBox();
                    PhysioData pdNew = null;
                    foreach (var item in list)
                    {
                        if (item.RecordTime == SpanTime)
                        {
                            pdNew = item;
                            pdNew.config = ade;
                            textNum.Text = pdNew.ValueString.ToString();
                            break;
                        }
                    }
                    if (pdNew == null)
                    {
                        pdNew = PhysioDataConfig.newPhysioData(ade, _record.Id.Value, SpanTime, -1);
                    }
                    textNum.Name = pdNew.config.Id + "" + SpanTime.ToString("HHmm");
                    textNum.Tag = pdNew;
                    textNum.Width = Width / (240 / 5);
                    textNum.Font = new System.Drawing.Font("微软雅黑", 7f);
                    textNum.Dock = System.Windows.Forms.DockStyle.Left;
                    textNum.Click += TextNum_Click;
                    textNum.Leave += TextNum_Leave;
                    textNum.DoubleClick += TextNum_DoubleClick;
                    panel.Controls.Add(textNum);
                }
                System.Windows.Forms.Label textName = new System.Windows.Forms.Label();
                textName.Name = "txt" + ade.Name;
                textName.Text = ade.Name;
                textName.Font = new System.Drawing.Font("微软雅黑", 8f);
                textName.Width = panel2.Width / (240 / 5) * 3;
                textName.Dock = System.Windows.Forms.DockStyle.Left;
                panel.Controls.Add(textName);
                panel2.Controls.Add(panel);
                rows++;
            }
            paneltop = new System.Windows.Forms.Panel();
            paneltop.Dock = System.Windows.Forms.DockStyle.Top;
            paneltop.Location = new System.Drawing.Point(20, 0);
            paneltop.Size = new System.Drawing.Size(792, 35);
            for (int i = (240 / 5) - 1; i >= 0; i--)
            {
                System.Windows.Forms.Label textNum = new System.Windows.Forms.Label();
                textNum.Name = "txt" + _record.InRoomTime.Value.AddMinutes(i * 5).ToString("yyyyMMddHHmm");
                textNum.Text = _record.InRoomTime.Value.AddMinutes(i * 5).ToString("HH mm");
                textNum.Font = new System.Drawing.Font("微软雅黑", 7f);
                textNum.Width = Width / (240 / 5);
                textNum.Dock = System.Windows.Forms.DockStyle.Left;
                textNum.TextAlign = ContentAlignment.MiddleCenter;
                paneltop.Controls.Add(textNum);
            }
            System.Windows.Forms.Label textTipName2 = new System.Windows.Forms.Label();
            textTipName2.Text = "时间 ";
            textTipName2.Font = new System.Drawing.Font("微软雅黑", 9f, FontStyle.Bold);
            textTipName2.Width = panel2.Width / (240 / 5) * 3 / 2;
            textTipName2.Dock = System.Windows.Forms.DockStyle.Left;
            textTipName2.TextAlign = ContentAlignment.MiddleRight;
            paneltop.Controls.Add(textTipName2);
            System.Windows.Forms.Label textTipName = new System.Windows.Forms.Label();
            textTipName.Text = " 名称";
            textTipName.Font = new System.Drawing.Font("微软雅黑", 9f, FontStyle.Bold);
            textTipName.Width = panel2.Width / (240 / 5) * 3 / 2;
            textTipName.Dock = System.Windows.Forms.DockStyle.Left;
            textTipName.TextAlign = ContentAlignment.MiddleLeft;
            paneltop.Controls.Add(textTipName);
            panel2.Controls.Add(paneltop);
        }
        private void LoadPhysioData(List Lists)
        {
            System.Data.DataTable dtPhysioData = BOperationRecord.getByOpeIDIsPhysioData(_record.Id.Value);
            int Width = panel2.Width - (panel2.Width / (240 / 5) * 3);
            foreach (Control pan in panel2.Controls)
            {
                if (pan is Panel)
                {
                    System.Windows.Forms.Panel panel = pan as Panel;
                    PhysioDataConfig ade = panel.Tag as PhysioDataConfig;
                    if (ade != null && IsInPhysioConfigList(ade, Lists))
                    {
                        if (ade.ConfigType == "麻醉体征")
                        {
                            List list = new List();
                            for (int i = 0; i < dtPhysioData.Rows.Count; i++)
                            {
                                if (dtPhysioData.Rows[i]["Name"].ToString().Equals(ade.Name.ToString()))
                                {
                                    PhysioData pdTemp = PhysioDataConfig.newPhysioData(ade, _record.Id.Value, DateTime.Parse(dtPhysioData.Rows[i]["RecordTime"].ToString()), dtPhysioData.Rows[i]["Value"].ToString());
                                    list.Add(pdTemp);
                                }
                            }
                            foreach (Control txt in panel.Controls)
                            {
                                if (ade.ImgPath != null && ade.ImgPath != "")
                                {
                                    System.Windows.Forms.ComboBox  textNum = txt as  ComboBox;
                                    PhysioData pdNew = textNum.Tag as PhysioData;
                                    DateTime SpanTime = pdNew.RecordTime;
                                    foreach (var item in list)
                                    {
                                        if (item.RecordTime == SpanTime)
                                        {
                                            pdNew = item;
                                            pdNew.config = ade;
                                            if (pdNew.ValueString != "-1") 
                                            textNum.Text = pdNew.ValueString.ToString();
                                            break;
                                        }
                                    }  
                                }
                                else
                                {
                                    System.Windows.Forms.TextBox textNum = txt as TextBox;
                                    PhysioData pdNew = textNum.Tag as PhysioData;
                                    DateTime SpanTime = pdNew.RecordTime;
                                    foreach (var item in list)
                                    {
                                        if (item.RecordTime == SpanTime)
                                        {
                                            pdNew = item;
                                            pdNew.config = ade;
                                            if (pdNew.ValueString != "-1") 
                                            textNum.Text = pdNew.ValueString.ToString();
                                            break;
                                        }
                                    } 
                                } 
                            } 
                        }
                        else
                        {
                            List list = new List();
                            for (int i = 0; i < dtPhysioData.Rows.Count; i++)
                            {
                                if (dtPhysioData.Rows[i]["Name"].ToString().Equals(ade.Name.ToString()))
                                {
                                    PhysioData pdTemp = PhysioDataConfig.newPhysioData(ade, _record.Id.Value, DateTime.Parse(dtPhysioData.Rows[i]["RecordTime"].ToString()), dtPhysioData.Rows[i]["Value"].ToString());
                                    list.Add(pdTemp);
                                }
                            }
                            foreach (Control txt in panel.Controls)
                            {
                                if (txt is TextBox)
                                {
                                    System.Windows.Forms.TextBox textNum = txt as TextBox;
                                    PhysioData pdNew = textNum.Tag as PhysioData;
                                    DateTime SpanTime = pdNew.RecordTime;  
                                    foreach (var item in list)
                                    {
                                        if (item.RecordTime == SpanTime)
                                        {
                                            pdNew = item;
                                            pdNew.config = ade;
                                            textNum.Text = pdNew.ValueString.ToString();
                                            break;
                                        }
                                    } 
                                }
                            } 
                        }
                    }
                }
            }
        }
        public bool IsInPhysioConfigList(PhysioDataConfig ade, List Lists)
        {
            bool isInPhysioConfigList = false;
            foreach (var item in Lists)
            {
                if (item.Id == ade.Id)
                {
                    isInPhysioConfigList = true;
                }
            }
            return isInPhysioConfigList;
        }
        private void TextNum_Leave(object sender, EventArgs e)
        {
            TextBox txtNum = sender as TextBox;
            PhysioData pdNew = txtNum.Tag as PhysioData;
            if (txtNum.Text.Trim() == "" && pdNew.Value > -1)
            {
                if (pdNew.config.ConfigType == "麻醉体征")
                    pdNew.config.EditDelItem(pdNew);
                else
                    pdNew.config.DelItem(pdNew);
                pdNew.Value = -1;
                txtNum.Tag = pdNew;
                TempValue = "";
            }
            else if (txtNum.Text.Trim() != "" && pdNew.Value > -1)
            {
                if (pdNew.Value.ToString() != txtNum.Text)
                {
                    string value = checkValue(txtNum, pdNew.config);
                    if (value != "")
                    {
                        pdNew.ValueString = value;
                        if (pdNew.config.ConfigType == "麻醉体征")
                            pdNew.config.EditModifyItem(pdNew, pdNew);
                        else
                            pdNew.config.ModifyItem(pdNew, pdNew);
                        txtNum.Tag = pdNew;
                        TempValue = txtNum.Text.Trim();
                    }
                }
            }
            else if (txtNum.Text.Trim() != "")
            {
                string value = checkValue(txtNum, pdNew.config);
                if (value != "")
                {
                    pdNew.ValueString = value;
                    if (pdNew.config.ConfigType == "麻醉体征")
                        pdNew.config.EditAddItem(pdNew);
                    else
                        pdNew.config.AddPointItem(pdNew);
                    txtNum.Tag = pdNew;
                    TempValue = txtNum.Text.Trim();
                }
            }
        }
        private void ComeBoxNum_Leave(object sender, EventArgs e)
        {
            ComboBox txtNum = sender as ComboBox;
            PhysioData pdNew = txtNum.Tag as PhysioData;
            if (txtNum.Text.Trim() == "" && pdNew.Value > -1)
            {
                pdNew.config.EditDelItem(pdNew);
                pdNew.Value = -1;
                txtNum.Tag = pdNew;
                TempValue = "";
            }
            else if (txtNum.Text.Trim() != "" && pdNew.Value > -1)
            {
                if (pdNew.Value.ToString() != txtNum.Text)
                {
                    pdNew.ValueString = txtNum.Text.Trim();
                    pdNew.config.EditModifyItem(pdNew, pdNew);
                    txtNum.Tag = pdNew;
                    TempValue = txtNum.Text.Trim();
                }
            }
            else if (txtNum.Text.Trim() != "")
            {
                pdNew.ValueString = txtNum.Text.Trim();
                pdNew.config.EditAddItem(pdNew);
                txtNum.Tag = pdNew;
                TempValue = txtNum.Text.Trim();
            }
        }
        public string checkValue(TextBox txtNum, PhysioDataConfig config)
        {
            string Result = "";
            double value = -1;
            if (config.ConfigType == "生命体征" || config.ShowText == true)
            {
                if (!double.TryParse(txtNum.Text.ToString(), out value))
                {
                    MessageBox.Show("请填写正确数值!", "系统提示");
                    txtNum.Focus();
                }
                else
                {
                    if (value < config.WarningLowLimit || value > config.WarningHighLimit)
                    {
                        //DialogResult dr = MessageBox.Show("数值:" + value + " 超出 " + config.Name + "[" + config.WarningLowLimit + "-" + config.WarningHighLimit + "] 报警范围! ", "系统提示");//, MessageBoxButtons.YesNo); //if (dr != DialogResult.Yes) { txtNum.Focus(); }
                        if (value < config.WarningLowLimit)
                        {
                            value = config.WarningLowLimit;
                        }
                        if (value > config.WarningHighLimit)
                        {
                            value = config.WarningHighLimit;
                        }
                    }
                }
                if (value > 0) Result = value.ToString();
            }
            else
            {
                Result = txtNum.Text.ToString();
            }
            return Result;
        }
        public bool checkValue2(TextBox txtNum, PhysioDataConfig config)
        {
            bool Result = true;
            double value = -1;
            if (config.ConfigType == "生命体征" || config.ShowText == true)
            {
                if (!double.TryParse(txtNum.Text.ToString(), out value))
                {
                    MessageBox.Show("请填写正确数值!", "系统提示");
                    txtNum.Focus();
                    Result = false;
                }
            }
            return Result;
        }
        private void TextNum_DoubleClick(object sender, EventArgs e)
        {
            Control txtNum = sender as Control;
            if (TempValue != "")
            {
                txtNum.Text = TempValue;
            }
        }
        public string TempValue;
        private void TextNum_Click(object sender, EventArgs e)
        {
            Control txtNum = sender as Control;
            PhysioData pdNew = txtNum.Tag as PhysioData;
            if (selectConfig != null)
            {
                selectConfig.ForeColor = System.Drawing.Color.Black;
            }
            selectConfig = txtNum.Parent.Controls.Find("txt" + pdNew.config.Name, true)[0] as System.Windows.Forms.Label;
            selectConfig.ForeColor = System.Drawing.Color.Blue;
            if (selectTime != null)
            {
                selectTime.ForeColor = System.Drawing.Color.Black;
            }
            selectTime = paneltop.Controls.Find("txt" + pdNew.RecordTime.ToString("yyyyMMddHHmm"), true)[0] as System.Windows.Forms.Label;
            selectTime.ForeColor = System.Drawing.Color.Blue;
        }
        #endregion
        private void frmPhysioDataEdit_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (selectConfig != null)
                selectConfig.Focus();
        } 
        private void btnAdd_Click(object sender, EventArgs e)
        {
            try
            {
                if (dtpInsertEnd.Value < dtpInsertBegin.Value) return;
                if (dtpInsertBegin.Value < _record.PageBegin) return;
                bool RESULT = true;
                foreach (var item in groupBox3.Controls)
                {
                    if (item is TextBox)
                    {
                        TextBox txtNum = (item as TextBox);
                        PhysioDataConfig ade = txtNum.Tag as PhysioDataConfig;
                        if (txtNum.Text.Trim() != "")
                        {
                            bool value = checkValue2(txtNum, ade);
                            if (value == false) RESULT = false;
                        }
                    }
                }
                if (RESULT == false) return;
                List ades = new List();
                List list = new List();
                foreach (var item in groupBox3.Controls)
                {
                    if (item is TextBox)
                    {
                        TextBox txtNum = (item as TextBox);
                        PhysioDataConfig ade = txtNum.Tag as PhysioDataConfig;
                        if (txtNum.Text.Trim() != "")
                        {
                            string value = checkValue(txtNum, ade);
                            int spanNun = ade.ConfigType == "麻醉体征" ? ade.YAisx : 5;
                            for (int i = 0; i < (240 / spanNun); i++)
                            {
                                DateTime SpanTime = _record.InRoomTime.Value.AddMinutes(i * spanNun);
                                if (SpanTime >= dtpInsertBegin.Value && SpanTime <= dtpInsertEnd.Value)
                                {
                                    PhysioData pdNew = PhysioDataConfig.newPhysioData(ade, _record.Id.Value, SpanTime, value);
                                    if (value != "")
                                    {
                                        pdNew.ValueString = value;
                                        list.Add(pdNew);
                                    }
                                }
                            }
                            ades.Add(ade);
                        }
                    }
                }
                if (list.Count > 0)
                {
                    PhysioDataService.AddPhysioDatas(list);
                    LoadPhysioData(ades);
                    btnClear_Click(null, null);
                    MessageBox.Show("添加成功!", "系统提示");
                }
            }
            catch (Exception ex)
            {
                PublicMethod.WriteLog(ex);
            }
        }
        private void btnClear_Click(object sender, EventArgs e)
        {
            foreach (var item in groupBox3.Controls)
            {
                if (item is TextBox)
                {
                    (item as TextBox).Text = "";
                }
            }
        }
    }
}