using AIMSBLL;
using AIMSExtension;
using AIMSModel;
using DrawGraph;
using HelperDB;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Drawing.Printing;
using System.IO;
using System.IO.Packaging;
using System.Linq;
using System.Reflection;
using System.Threading;
using System.Windows.Documents;
using System.Windows.Forms;
using System.Windows.Xps;
using System.Windows.Xps.Packaging;
namespace DrawGraphManagement
{
    public partial class MainUp : Form
    {
        TemplateManage templateManage = new TemplateManage();
        TemplateManage templateManage2 = new TemplateManage();
        object operationRecor = new DrawGraph.OperationRecord();
        public MainUp()
        {
            InitializeComponent();
        }
        private void MainUp_Load(object sender, EventArgs e)
        {
            HospitalInfo hospital = BHospitalInfo.SelectSingle(1);
            txtHospitalName.Text = hospital.HospitalName;
            Person PersonObj = BPerson.GetModelByNo("admin");
            AIMSExtension.PublicMethod.OperatorId = PersonObj.Id.Value;
            AIMSExtension.PublicMethod.OperatorNo = PersonObj.No;
            AIMSExtension.PublicMethod.OperatorName = PersonObj.Name;
            AIMSExtension.PublicMethod.RoleId = PersonObj.RoleId.Value;
            AIMSExtension.PublicMethod.DepId = PersonObj.DepId.Value;
            AIMSExtension.PublicMethod.DeptName = BDepartment.GetModel(PersonObj.DepId.Value).Name;
            Role role = BRole.GetModel(PersonObj.RoleId.Value);
            AIMSExtension.PublicMethod.PermissionLevel = role.PermissionLevel == null ? 0 : role.PermissionLevel.Value;
            AIMSExtension.PublicMethod.RoleName = BMenu.GetMenuRootListManageStr(AIMSExtension.PublicMethod.RoleId, "功能权限");
            myPanel1.MouseWheel += new System.Windows.Forms.MouseEventHandler(panel1_MouseWheel);
        }
        public string DocumentName = "";
        public string PrintAanesthesiaRecord(string PatientId)
        {
            textBox1.Text = PatientId;
            button10_Click(null, null);
            BtnBind_Click(null, null);
            OperationRecord _record = operationRecor as OperationRecord;
            DocumentName = "麻醉记录单_" + _record.InHospitalNo + "_" + _record.PatientId;
            btnPrint_Click(null, null);
            return DocumentName;
        }
        public string PrintAanesthesiaRecover(string PatientId)
        {
            textBox1.Text = PatientId;
            button6_Click(null, null);
            BtnBind1(int.Parse(PatientId), 2);
            templateManage2 = null;
            OperationRecord _record = operationRecor as OperationRecord;
            DocumentName = "恢复记录单_" + _record.InHospitalNo + "_" + _record.PatientId;
            btnPrint_Click(null, null);
            return DocumentName;
        }
        public string PrintAanesthesiaPainlessRecord(string PatientId)
        {
            textBox1.Text = PatientId;
            button12_Click(null, null);
            BtnBind1(int.Parse(PatientId), 1);
            templateManage2 = null;
            OperationRecord _record = operationRecor as OperationRecord;
            DocumentName = "镇静镇痛评估记录_" + _record.InHospitalNo + "_" + _record.PatientId;
            btnPrint_Click(null, null);
            return DocumentName;
        }
        /// 
        /// 设置界面自适应
        /// 
        private void AutoSizeF()
        {
            #region 设置界面自适应
            if (templateManage.ZedControl == null) return;
            if (templateManage.Typesetting == TypesettingEnum.Horizontal)
            {
                //在此处可随时设置板子的属性
                templateManage.ZedControl.Height = templateManage.GetPageWidth();
                templateManage.ZedControl.Width = Convert.ToInt32(templateManage.ZedControl.Height * 1.414) + 2;
            }
            else
            {
                //在此处可随时设置板子的属性
                templateManage.ZedControl.Width = templateManage.GetPageWidth();// templateManage.ZedControl.Parent.Width - 54;
                templateManage.ZedControl.Height = Convert.ToInt32(templateManage.ZedControl.Width * 1.414) + 2;
            }
            templateManage.ZedControl.AxisChange();
            templateManage.ZedControl.Refresh();
            //最后还要调整图表进行自适应
            PackObjBase pack = templateManage.GetPackObjectOTag("PhysioDataManage_ChartPackObj_6");
            if (pack != null)
                pack.Draw();
            #endregion
        }
        /// 
        /// 全部刷新
        /// 
        private void AllRefresh()
        {
            foreach (AreaManageBase area in templateManage.ManageList)
            {
                List ables = area.PackManage.ListPob.Where(s => s is AbleEditPackObj).ToList();
                foreach (PackObjBase pack in ables)
                {
                    AbleEditPackObj ableEdit = pack as AbleEditPackObj;
                    if (ableEdit != null) ableEdit.IsVisible = false;
                }
            }
            //画区域
            drawArea();
        }
        private void drawArea()
        {
            templateManage.ZedControl = zgcAnaesRecord;
            templateManage.DrawArea();
        }
        private void AllRefresh2()
        {
            foreach (AreaManageBase area in templateManage2.ManageList)
            {
                List ables = area.PackManage.ListPob.Where(s => s is AbleEditPackObj).ToList();
                foreach (PackObjBase pack in ables)
                {
                    AbleEditPackObj ableEdit = pack as AbleEditPackObj;
                    if (ableEdit != null) ableEdit.IsVisible = false;
                }
            }
            //画区域
            drawArea2();
        }
        private void drawArea2()
        {
            templateManage2.ZedControl = zgcAnaesRecord2;
            templateManage2.DrawArea();
        }
        private void btnSave_Click(object sender, EventArgs e)
        {
            bool reVal = templateManage.Save();
            if (reVal)
            {
                new frmMessageBox().Show();
            }
            else
            {
                MessageBox.Show(templateManage.MsgStr);
            }
        }
        private bool zgcAnaesRecord_MouseDownEvent(ZedGraphControl sender, MouseEventArgs e)
        {
            if (templateManage != null)
            {
                templateManage.zedControl_MouseDownEvent(sender, e);
            }
            return default(bool);
        }
        private bool zgcAnaesRecord_MouseMoveEvent(ZedGraphControl sender, MouseEventArgs e)
        {
            if (templateManage != null)
            {
                templateManage.zedControl_MouseMoveEvent(sender, e);
            }
            return default(bool);
        }
        private bool zgcAnaesRecord_MouseUpEvent(ZedGraphControl sender, MouseEventArgs e)
        {
            if (templateManage != null)
            {
                templateManage.zedControl_MouseUpEvent(sender, e);
            }
            return default(bool);
        }
        private void zgcAnaesRecord_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            if (templateManage != null)
            {
                ZedGraphControl send = sender as ZedGraphControl;
                templateManage.zedControl_MouseDoubleClick(send, e);
            }
        }
        private void zgcAnaesRecord_KeyUp(object sender, KeyEventArgs e)
        {
            if (templateManage != null)
            {
                ZedGraphControl send = sender as ZedGraphControl;
                templateManage.zedControl_KeyUp(send, e);
            }
        }
        private void BtnBind_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == "") return;
            #region 绑定所有手术记录的值
            int id = 14;
            if (textBox1.Text != "") id = int.Parse(textBox1.Text);
            operationRecor = BOperationRecord.getRecord(new OperationRecord(), id, 1);
            templateManage.OpeRecord = operationRecor;
            //指定对象的所有值属性的绑定
            templateManage.BindOperationRecordValueAll(templateManage.OpeRecord);
            //非值对象的数据绑定
            templateManage.Bind();
            templateManage2.OpeRecord = operationRecor;
            //指定对象的所有值属性的绑定
            templateManage2.BindOperationRecordValueAll(templateManage2.OpeRecord);
            //非值对象的数据绑定
            templateManage2.Bind();
            #endregion
            foreach (AreaManageBase area in templateManage.ManageList)
            {
                area.setPrint(true);
            }
            foreach (AreaManageBase area in templateManage2.ManageList)
            {
                area.setPrint(true);
            }
            zgcAnaesRecord.Refresh();
            zgcAnaesRecord2.Refresh();
        }
        private void BtnBind1(int id, int RecoverId)
        {
            if (textBox1.Text == "") return;
            #region 绑定所有手术记录的值  
            operationRecor = BOperationRecord.getRecord(new OperationRecord(), id, RecoverId);
            templateManage.OpeRecord = operationRecor;
            //指定对象的所有值属性的绑定
            templateManage.BindOperationRecordValueAll(templateManage.OpeRecord);
            //非值对象的数据绑定
            templateManage.Bind();
            #endregion
            foreach (AreaManageBase area in templateManage.ManageList)
            {
                area.setPrint(true);
            }
            zgcAnaesRecord.Refresh();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                this.Close();
                this.Close();
            }
            catch (Exception)
            {
            }
        }
        private void panel1_MouseWheel(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            templateManage.SetPYL();
        }
        private void myPanel1_Scroll(object sender, ScrollEventArgs e)
        {
            templateManage.SetPYL();
        }
        private void button1_Click_1(object sender, EventArgs e)
        {
            if (templateManage != null && templateManage.ManageList.Count > 0)
            {
                int OperationApplyId = 10;
                if (textBox1.Text.Trim() != "") OperationApplyId = int.Parse(textBox1.Text.Trim());
                DocumentParent documentParent = new DocumentParent();
                documentParent.OperationApplyId = OperationApplyId;
                //documentParent.OpeRecord = BOperationRecord.SelectSingle("OperationApplyId=@OperationApplyId", new ParameterList("@OperationApplyId", OperationApplyId), RecursiveType.Parent, 3);  
                if (templateManage.OpeRecord == null) return;
                //指定对象的所有值属性的绑定
                templateManage.BindOperationRecordValueAll(templateManage.OpeRecord);
                templateManage.SetPYL(); //得设置一下偏移量
                //非值对象的数据绑定
                templateManage.Bind();
            }
        }
        private void button4_Click(object sender, EventArgs e)
        {
            templateManage.BindDefaultValue();
        }
        private void button5_Click(object sender, EventArgs e)
        {
            templateManage.ClearEdit();
        }
        private void button2_Click(object sender, EventArgs e)
        {
            if (templateManage != null)
            {
                templateManage.ControlClear();
            }
            try
            {
                string jsonStr = DBHelper.ExecuteScalar("SELECT [JsonDate] FROM [dbo].[OperationRecordTemplate] where id=1").ToString();
                if (jsonStr != null && jsonStr != "")
                {
                    templateManage = JsonConvert.DeserializeObject(jsonStr);
                    templateManage.ZedControl = zgcAnaesRecord;
                    templateManage.OpeRecord = operationRecor;
                    templateManage.Id = 1;
                    bool reVal = templateManage.Load();
                    if (reVal)
                    {
                        AllRefresh();
                    }
                    else
                    {
                        MessageBox.Show(templateManage.MsgStr);
                    }
                    AutoSizeF();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        private void button6_Click(object sender, EventArgs e)
        {
            if (templateManage != null)
            {
                templateManage.ControlClear();
            }
            try
            {
                string jsonStr = DBHelper.ExecuteScalar("SELECT [JsonDate] FROM [dbo].[OperationRecordTemplate] where id=10").ToString();
                if (jsonStr != null && jsonStr != "")
                {
                    templateManage = JsonConvert.DeserializeObject(jsonStr);
                    templateManage.ZedControl = zgcAnaesRecord;
                    templateManage.OpeRecord = operationRecor;
                    templateManage.Id = 10;
                    bool reVal = templateManage.Load();
                    if (reVal)
                    {
                        AllRefresh();
                    }
                    else
                    {
                        MessageBox.Show(templateManage.MsgStr);
                    }
                    AutoSizeF();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        private void button7_Click(object sender, EventArgs e)
        {
            if (templateManage != null)
            {
                templateManage.ControlClear();
            }
            try
            {
                string jsonStr = DBHelper.ExecuteScalar("SELECT [JsonDate] FROM [dbo].[OperationRecordTemplate] where id=20").ToString();
                if (jsonStr != null && jsonStr != "")
                {
                    templateManage = JsonConvert.DeserializeObject(jsonStr);
                    templateManage.ZedControl = zgcAnaesRecord;
                    templateManage.OpeRecord = operationRecor;
                    templateManage.Id = 20;
                    bool reVal = templateManage.Load();
                    if (reVal)
                    {
                        AllRefresh();
                    }
                    else
                    {
                        MessageBox.Show(templateManage.MsgStr);
                    }
                    AutoSizeF();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        private void button9_Click(object sender, EventArgs e)
        {
            if (templateManage != null)
            {
                templateManage.ControlClear();
            }
            try
            {
                string jsonStr = DBHelper.ExecuteScalar("SELECT [JsonDate] FROM [dbo].[OperationRecordTemplate] where id=50").ToString();
                if (jsonStr != null && jsonStr != "")
                {
                    templateManage = JsonConvert.DeserializeObject(jsonStr);
                    templateManage.ZedControl = zgcAnaesRecord;
                    templateManage.OpeRecord = operationRecor;
                    templateManage.Id = 50;
                    bool reVal = templateManage.Load();
                    if (reVal)
                    {
                        AllRefresh();
                    }
                    else
                    {
                        MessageBox.Show(templateManage.MsgStr);
                    }
                    AutoSizeF();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        private void button8_Click(object sender, EventArgs e)
        {
            if (templateManage != null)
            {
                templateManage.ControlClear();
            }
            try
            {
                string jsonStr = DBHelper.ExecuteScalar("SELECT [JsonDate] FROM [dbo].[OperationRecordTemplate] where id=30").ToString();
                if (jsonStr != null && jsonStr != "")
                {
                    templateManage = JsonConvert.DeserializeObject(jsonStr);
                    templateManage.ZedControl = zgcAnaesRecord;
                    templateManage.OpeRecord = operationRecor;
                    templateManage.Id = 30;
                    bool reVal = templateManage.Load();
                    if (reVal)
                    {
                        AllRefresh();
                    }
                    else
                    {
                        MessageBox.Show(templateManage.MsgStr);
                    }
                    AutoSizeF();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        private void button10_Click(object sender, EventArgs e)
        {
            if (templateManage != null)
            {
                templateManage.ControlClear();
            }
            try
            {
                string jsonStr = DBHelper.ExecuteScalar("SELECT [JsonDate] FROM [dbo].[OperationRecordTemplate] where id=40").ToString();
                if (jsonStr != null && jsonStr != "")
                {
                    templateManage = JsonConvert.DeserializeObject(jsonStr);
                    templateManage.ZedControl = zgcAnaesRecord;
                    templateManage.OpeRecord = operationRecor;
                    templateManage.Id = 40;
                    bool reVal = templateManage.Load();
                    if (reVal)
                    {
                        AllRefresh();
                    }
                    else
                    {
                        MessageBox.Show(templateManage.MsgStr);
                    }
                    AutoSizeF();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            try
            {
                string jsonStr = DBHelper.ExecuteScalar("SELECT [JsonDate] FROM [dbo].[OperationRecordTemplate] where id=50").ToString();
                if (jsonStr != null && jsonStr != "")
                {
                    templateManage2 = JsonConvert.DeserializeObject(jsonStr);
                    templateManage2.ZedControl = zgcAnaesRecord2;
                    templateManage2.OpeRecord = operationRecor;
                    templateManage2.Id = 50;
                    bool reVal = templateManage2.Load();
                    if (reVal)
                    {
                        AllRefresh2();
                    }
                    else
                    {
                        MessageBox.Show(templateManage2.MsgStr);
                    }
                    AutoSizeF();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        private void button11_Click(object sender, EventArgs e)
        {
            frmTemplateD frmTemplateD = new frmTemplateD();
            frmTemplateD.Show();
        }
        private void button12_Click(object sender, EventArgs e)
        {
            if (templateManage != null)
            {
                templateManage.ControlClear();
            }
            try
            {
                string jsonStr = DBHelper.ExecuteScalar("SELECT [JsonDate] FROM [dbo].[OperationRecordTemplate] where id=60").ToString();
                if (jsonStr != null && jsonStr != "")
                {
                    templateManage = JsonConvert.DeserializeObject(jsonStr);
                    templateManage.ZedControl = zgcAnaesRecord;
                    templateManage.OpeRecord = operationRecor;
                    templateManage.Id = 60;
                    bool reVal = templateManage.Load();
                    if (reVal)
                    {
                        AllRefresh();
                    }
                    else
                    {
                        MessageBox.Show(templateManage.MsgStr);
                    }
                    AutoSizeF();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        private void btnPrint_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == "") return;
            try
            {
                mPanes = new List();
                UpPanes = new List();
                PrintDocPage(null, null);
                System.Drawing.Printing.PrintDocument pDoc = new System.Drawing.Printing.PrintDocument();
                pDoc.DefaultPageSettings.Landscape = false;
                pDoc.OriginAtMargins = true;
                pDoc.DefaultPageSettings.PrinterResolution.Kind = PrinterResolutionKind.High;
                pDoc.DefaultPageSettings.Margins = new Margins(33, 0, 35, 0);
                pDoc.PrintPage -= new PrintPageEventHandler(pDoc_PrintPage);
                pDoc.PrintPage += new PrintPageEventHandler(pDoc_PrintPage);
                pDoc.PrinterSettings.PrintFileName =
   Application.StartupPath + "\\" + DocumentName + ".xps";
                pDoc.PrinterSettings.PrintToFile = true;
                pDoc.PrinterSettings.PrinterName = "XPS";
                pDoc.DefaultPageSettings.PrinterSettings.PrinterName = "Microsoft XPS Document Writer";
                pDoc.Print();
                Thread.Sleep(1000);
                byte[] bytes = File.ReadAllBytes(Application.StartupPath + "\\" + DocumentName + ".xps");
                // Print to PDF
                var outputFilePath = @"E:\PatientDocuments\" + DocumentName + ".pdf";
                PdfFilePrinter.PrintXpsToPdf(bytes, outputFilePath, "Document Title");
                File.Delete(Application.StartupPath + "\\" + DocumentName + ".xps");
            }
            catch (Exception exp)
            {
                PublicMethod.WriteLog(exp, "");
            }
        }
        int m_startPrintPage;// 打印的起始页码
        int m_endPrintPage;//打印的终止页码
        //int m_PageIndex;// 当前打印页码
        int count = 0;
        private void pDoc_PrintPage(object sender, PrintPageEventArgs e)
        {
            System.Drawing.Printing.PrintDocument pDoc = sender as System.Drawing.Printing.PrintDocument;
            m_startPrintPage = pDoc.PrinterSettings.FromPage;
            m_endPrintPage = pDoc.PrinterSettings.ToPage;
            int printCount = mPanes.Count;
            if (mPanes.Count > 0 && count < printCount)
            {
                mPanes[count].Draw(e.Graphics);
                count++;
                if (count < printCount)
                {
                    e.HasMorePages = true;
                }
            }
            else
            {
                e.HasMorePages = false;
            }
        }
        public List mPanes = new List();
        public List UpPanes = new List();
        private void PrintDocPage(object sender, PrintPageEventArgs e)
        {
            OperationRecord _record = operationRecor as OperationRecord;
            if (_record.currentPage == 1)
            {
                PrintDocPane(e, zgcAnaesRecord, templateManage, true);
                if (templateManage2!=null)
                {
                PrintDocPane(e, zgcAnaesRecord2, templateManage2, false); 
                }
            }
            else
            {
                for (int i = 1; i <= _record.pageCount; i++)
                {
                    PrintDocPane(e, zgcAnaesRecord, templateManage, true);
                    if (i == 1 && templateManage2!=null)
                    {
                        PrintDocPane(e, zgcAnaesRecord2, templateManage2, false);
                    }
                    btnNextPage_Click(_record.PatientId.Value);
                    if (i != 1 && templateManage2!=null)
                    {
                        MasterPane mPane = new MasterPane();
                        mPane.Border.IsVisible = false;
                        mPanes.Add(mPane);
                    }
                }
            }
        }
        public void SetNextPageTime()
        {
            OperationRecord _record = operationRecor as OperationRecord;
            //当下一页的开始时间,小于当前最大时间
            DateTime curTimeTemp = OperationRecord.getOpeMaxTime(_record);
            if (_record.lastPageBegin > curTimeTemp) return;
            //先设置新页的开始时间
            _record.PageBegin = _record.lastPageBegin;
            _record.lastPageBegin = _record.PageBegin.AddMinutes(240);
            _record.pageCount++;
            if (_record.pageCount > _record.currentPage) _record.pageCount = _record.currentPage;
        }
        private void btnNextPage_Click(int PatientId)
        {
            OperationRecord _record = operationRecor as OperationRecord;
            if (PatientId == 0) return;
            if (_record.pageCount == _record.currentPage) return;
            SetNextPageTime();
            try
            {
                if (PatientId != 0)
                {
                    templateManage.OpeRecord = BOperationRecord.getRecord(_record, PatientId, 1);
                    templateManage2.OpeRecord = templateManage.OpeRecord;
                    templateManage.BindOperationRecordValueAll(templateManage.OpeRecord);
                    templateManage2.BindOperationRecordValueAll(templateManage2.OpeRecord);
                    templateManage.Bind();
                    templateManage2.Bind();
                    zgcAnaesRecord.Refresh();
                    zgcAnaesRecord2.Refresh();
                }
            }
            catch (Exception ex)
            {
                PublicMethod.WriteLog(ex);
            }
        }
        private void PrintDocPane(PrintPageEventArgs e, ZedGraphControl zedGraph, TemplateManage template, bool InitChart)
        {
            OperationRecord _record = operationRecor as OperationRecord;
            foreach (AreaManageBase area in template.ManageList)
            {
                area.setPrint(false);
                area.BindTempData();
            }
            int zedGraphMainWidth = zedGraph.Size.Width;
            int zedGraphMainHeight = zedGraph.Size.Height;
            int width = 765;
            int height = Convert.ToInt32(width * 1.414) + 2;
            zedGraph.Size = new Size(width, height);
            zedGraph.Width = width;
            zedGraph.Height = height;
            if (InitChart == true)
                foreach (PhysioDataConfig pp in _record.PhysioConfigList)
                {
                    if (pp.ShowText == true)
                    {
                        pp.IsValid = false;
                        ///重新设置曲线属性
                        pp.reSetCurveSpo2();
                    }
                }
            TipBox.Hidden();
            MasterPane mPane = zedGraph.MasterPane;  //this.MasterPane;
            mPane.Border.IsVisible = false;
            //当前窗体中的矩形区域大小
            RectangleF saveRect = mPane.Rect;
            if (InitChart == true)
                template.initChart();
            mPanes.Add(mPane.Clone());
            if (e != null)
                mPane.Draw(e.Graphics);   //在打印文档中画出MasterPane内容
            using (Graphics g = zedGraph.CreateGraphics())
            {
                mPane.ReSize(g, saveRect);
            }
            UpPanes.Add(mPane.Clone());
            zedGraph.Size = new Size(zedGraphMainWidth, zedGraphMainHeight);
            if (InitChart == true)
                template.initChart();
            if (InitChart == true)
                foreach (PhysioDataConfig pp in _record.PhysioConfigList)
                {
                    if (pp.ShowText == true)
                    {
                        pp.IsValid = true;
                        ///重新设置曲线属性
                        pp.reSetCurveSpo2();
                    }
                }
        }
    }
}