using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DBFactory;
namespace wcfControlMonitorClient
{
    public partial class FrmBrowseActivation : Form
    {
        private static FrmBrowseActivation _formInstance;

        public static FrmBrowseActivation FormInstance
        {
            get
            {
                if (_formInstance == null)
                {
                    _formInstance = new FrmBrowseActivation();

                }
                return _formInstance;
            }
            set { _formInstance = value; }
        }
        DBOperator dbo = CStaticClass.dbo;

        DataSet ds = new DataSet();//20161121
        public FrmBrowseActivation()
        {
            InitializeComponent();
            this.dtPickerStartDate.Value = DateTime.Today;
            _formInstance = this;
        }
        public void SearchActivation() //20161121
        {
            //DateTime BeginTime = dateTimePickerBegin.Value.ToUniversalTime();
            //DateTime EndTime = dateTimePickerBegin.Value.AddDays(1).ToUniversalTime();
            chart1.Series["Series1"].Points.Clear();
            chart1.Series["Series3"].Points.Clear();
            string searchstr = string.Empty;
            string searchkind=this.comboBox_SearchKind.Text.Trim();
            string searkey=textBox_SearchKeyWord.Text.Trim();
            string title = "系统故障时间柱形图";
            if (searchkind.Length != 0 && this.textBox_SearchKeyWord.Text.Trim().Length != 0)
            {
                if (searchkind == "设备索引")
                {
                    searchkind = "F_DeviceIndex";
                }
                title = string.Format("{0}故障时间柱形图",searkey);
                searchstr = string.Format(" And {0} like '%{1}%'",searchkind,searkey );
            }
            if (cbStopAlarm.Checked)
            {
                searchstr = string.Format("{0} And ( F_ErrorIndex  != 2  and F_ErrorIndex  != 41  )", searchstr);
            }

            int groupcount = 24;
            DateTime selectday=dtPickerStartDate.Value.Date;//选择的日期
            DateTime  taday=DateTime.Now.Date;
            int  nowhour  =DateTime.Now.Hour;
            if (taday == selectday)
            {
                groupcount = nowhour + 1;
            }
            else
                if (taday < selectday)
            {
                return;
            }

            string BeginTime = dtPickerStartDate.Value.ToString("yyyy-MM-dd HH:mm:ss");
            string EndTime = dtPickerStartDate.Value.AddDays(1).ToString("yyyy-MM-dd HH:mm:ss");

            string sql =
            string.Format("SELECT * FROM T_Base_Device_Error_Log,T_Base_Device  WHERE T_Base_Device_Error_Log.F_DeviceIndex= T_Base_Device.F_DeviceIndex and  ((F_DateTime < '{0}' and F_End_DateTime >= '{0}') or (F_DateTime >= '{0}' and F_DateTime < '{1}')) {2} and F_WorkArea  like '%{3}%'  order by F_DateTime", BeginTime, EndTime, searchstr, CStaticClass.UserArea);//F_WorkArea  like '%{0}%' and {1}", CStaticClass.UserArea

            ds = dbo.ExceSQL(sql);
            DataTable dt = ds.Tables[0];//取得当天相关故障记录
            int count = dt.Rows.Count;

            DateTime bhour = Convert.ToDateTime(BeginTime);//这个小时的开始时间
            DateTime ehour = Convert.ToDateTime(BeginTime).AddHours(1);//这个小时的结束时间




            

            DataTable[] hourRecords = new DataTable[groupcount];
            int[] minutes = new int[groupcount];
           // string [] hours = new string[groupcount];
            int [] hours = new int [groupcount];
            int minvalue=60;
            double[] percent = new double[groupcount];
            for (int i = 0; i < groupcount; i++)//循环查找当前一个小时
            {

                hourRecords[i] = OneHourAlarmRecordsSort(dt, bhour, ehour);
                bhour = Convert.ToDateTime(bhour).AddHours(1);
                ehour = Convert.ToDateTime(ehour).AddHours(1);
                //hours[i] = string.Format("{0}",i + 1);
                hours[i] = i + 1;
                
            }


            for (int i = 0; i < groupcount; i++)
            {
                OneHourAlarmRecordsCombine(hourRecords[i], out minutes[i]);
                percent[i] = Convert.ToDouble((minvalue - minutes[i]) * 100 / 60);
            }


            //chart1.Series["Series1"].Points.Clear();
            chart1.Series["Series1"].Points.DataBindXY(hours, minutes);


            //chart1.Series["Series3"].Points.Clear();
            chart1.Series["Series3"].Label = "#VALY%";
            chart1.Series["Series3"].Points.DataBindXY(hours, percent);



        }

        public DataTable OneHourAlarmRecordsSort(DataTable dt, DateTime HourBeginTime, DateTime HourEndTime) //20161121
        {//掐头去尾操作
            DataTable datatable = new DataTable();
            datatable = dt.Clone();
            int count = dt.Rows.Count;
            DateTime btime, etime;
            DataRow dr;
            for (int i = 0; i < count; i++)
            {
                btime = Convert.ToDateTime(dt.Rows[i]["F_DateTime"]);
                if (string.IsNullOrEmpty(dt.Rows[i]["F_End_DateTime"].ToString()))
                {
                    etime = DateTime.Now;
                }
                else
                {
                    etime = Convert.ToDateTime(dt.Rows[i]["F_End_DateTime"]);
                }


                if (btime >= HourEndTime)
                {
                    break;
                }
                if (etime < HourBeginTime)
                {
                    continue;
                }


                if (btime < HourBeginTime)
                {

                    btime = HourBeginTime;

                }
                if (etime >= HourEndTime)
                {
                    etime = HourEndTime;
                }
                dr = datatable.NewRow();
                dr[0] = dt.Rows[i][0];
                dr[1] = dt.Rows[i][1];
                dr[2] = dt.Rows[i][2];
                dr[3] = dt.Rows[i][3];
                dr["F_DateTime"] = btime;
                dr["F_End_DateTime"] = etime;
                datatable.Rows.Add(dr);





            }



            return datatable;

        }
        public DataTable OneHourAlarmRecordsCombine(DataTable dt, out int minutes) //20161121
        {
            DataTable datatable = new DataTable();
            datatable = dt.Clone();
            int count = dt.Rows.Count;
            DateTime lastbtime, lastetime, newbtime, newetime;
            DataRow dr;
            TimeSpan ts;
            int addseconds = 0;
            for (int i = 0; i < count; i++)
            {
                if (i == 0)
                {
                    newbtime = Convert.ToDateTime(dt.Rows[i]["F_DateTime"]);
                    newetime = Convert.ToDateTime(dt.Rows[i]["F_End_DateTime"]);
                    dr = datatable.NewRow();
                    dr["F_DateTime"] = newbtime;
                    dr["F_End_DateTime"] = newetime;
                    datatable.Rows.Add(dr);

                    ts = newetime - newbtime;
                    addseconds += Convert.ToInt32(ts.TotalSeconds);

                }
                else
                {

                    int newcount = datatable.Rows.Count - 1;
                    lastbtime = Convert.ToDateTime(datatable.Rows[newcount]["F_DateTime"]);
                    lastetime = Convert.ToDateTime(datatable.Rows[newcount]["F_End_DateTime"]);

                    newbtime = Convert.ToDateTime(dt.Rows[i]["F_DateTime"]);
                    newetime = Convert.ToDateTime(dt.Rows[i]["F_End_DateTime"]);

                    if (newbtime < lastetime)
                    {
                        newbtime = lastetime;
                    }
                    if (newbtime < newetime)
                    {

                        dr = datatable.NewRow();
                        dr["F_DateTime"] = newbtime;
                        dr["F_End_DateTime"] = newetime;
                        datatable.Rows.Add(dr);
                        ts = newetime - newbtime;
                        addseconds += Convert.ToInt32(ts.TotalSeconds);
                    }

                }






            }

            minutes = addseconds / 60;
            if (addseconds % 60 != 0)
            {
                minutes++;
            }

            return datatable;

        }
        private void btSearch_Click(object sender, EventArgs e)
        {
            SearchActivation();
        }
    }
}