using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using ChuPiao.AutoPrint.Common;
using ChuPiao.AutoPrint.Machine;
using ChuPiao.AutoPrint.Services;
using ChuPiao.AutoPrint.Services.AutoEncash;
using ChuPiao.Common.Enums;
using ChuPiao.Common.Models;
using ChuPiao.AutoPrint.Desktop.Properties;
using System.IO;

namespace ChuPiao.AutoPrint.Desktop.AutoEncash
{
    public partial class AutoEncashView : UserControl
    {
        private AutoEncashService _service;
        public AutoEncashView()
        {
            InitializeComponent();

            this.lblEncashedTotalMoney.Text = "0";
            this.lblEncashedTotalTicket.Text = "0";
            this.lblTotalMoney.Text = "0";
            this.lblTotalTicket.Text = "0";
            this.lblTotalMoneyOfAssign.Text = "0";
            this.lblTotalTicketOfAssign.Text = "0";
        }
        public event EventHandler CheckedChanged;

        public AutoEncashService Service
        {
            get { return _service; }
            set 
            { 
                _service = value;
                ShowLotMachineInfo();
                _service.Encashing += new EventHandler<TicketEventArgs>(_service_Encashing);
                _service.Encashed += new EventHandler<TicketEventArgs>(_service_Encashed);
                _service.EncashTicketLoaded += new EventHandler(_service_EncashTicketLoaded);
                _service.StatusChanged += new EventHandler<MachineStatusArgs>(LotMachine_StatusChanged);
            }
        }
        public void ShowLotMachineInfo()
        {
            //this.gbxMachine.Text = Service.LotMachine.MachineInfo.M_ZxNumber;
            //this.chkMacNumber.Text = Service.LotMachine.MachineInfo.M_Number;

            try
            {
                M_MachineEntity machineEntity = Service.LotMachine.MachineInfo;
                string typeDesc = EnumDescription.GetFieldText((MachineType)machineEntity.M_Type);

                this.gbxMachine.Text = string.Concat(machineEntity.M_ZxNumber, "[", typeDesc, "]");
                this.llblEncashConfig.Text = machineEntity.M_Number;
                //Application.DoEvents();
            }
            catch (Exception exception)
            {
                LoggingService.Info(string.Concat("更新机器信息界面异常。错误信息:", exception.Message));
            }
        }
        void _service_EncashTicketLoaded(object sender, EventArgs e)
        {
            //WorkbenchSingleton.SafeThreadCall(new Action(ShowEncashTicket)); 
            try
            {
                
                WorkbenchSingleton.SafeThreadAsyncCall(new Action(ShowEncashTicket));
            }
            catch (Exception exception)
            {
                LoggingService.Info(string.Concat("加载兑奖票完成更新界面异常。错误信息:", exception.Message));
            }
        }
        void LotMachine_StatusChanged(object sender, MachineStatusArgs e)
        {
            //WorkbenchSingleton.SafeThreadCall(new Action<MachineStatusEnum>(ShowMachineStatus), e.MachineStatus);
            try
            {
                WorkbenchSingleton.SafeThreadAsyncCall(new Action<MachineStatusEnum>(ShowMachineStatus), e.MachineStatus);
            }
            catch (Exception exception)
            {
                LoggingService.Info(string.Concat("机器状态变化更新界面异常。错误信息:", exception.Message));
            }
        }

        void _service_Encashed(object sender, TicketEventArgs e)
        {

            //WorkbenchSingleton.SafeThreadCall(new Action<L_LotTicketEntity>(ShowTicketEncashed), e.TicketEntity);
            try
            {
                WorkbenchSingleton.SafeThreadAsyncCall(new Action<L_LotTicketEntity>(ShowTicketEncashed), e.TicketEntity);
            }
            catch (Exception exception)
            {
                LoggingService.Info(string.Concat("更新兑奖完成界面异常。错误信息:", exception.Message));
            }
        }

        void _service_Encashing(object sender, TicketEventArgs e)
        {
            //WorkbenchSingleton.SafeThreadCall(new Action<L_LotTicketEntity>(ShowTicketEncashing), e.TicketEntity);

            try
            {
                WorkbenchSingleton.SafeThreadAsyncCall(new Action<L_LotTicketEntity>(ShowTicketEncashing), e.TicketEntity);
            }
            catch (Exception exception)
            {
                LoggingService.Info(string.Concat("更新兑奖中界面异常。错误信息:", exception.Message));
            }
        }
        void ShowEncashTicket()
        {
            this.lblTotalMoney.Text = _service.TotalMoney.ToString("0.##");
            this.lblTotalTicket.Text = _service.TotalTicket.ToString();
            this.lblEncashedTotalMoney.Text = _service.EncashedTotalMoney.ToString("0.##");
            this.lblEncashedTotalTicket.Text = _service.EncashedTotalTicket.ToString();
            this.lblTotalMoneyOfAssign.Text = _service.TotalMoneyOfAssign.ToString("0.##");
            this.lblTotalTicketOfAssign.Text = _service.TotalTicketOfAssign.ToString();

            this.AddEncashTickets(_service.AllEncashTickets);
        }
        void ShowEncashSummary()
        {
            this.lblTotalMoney.Text = _service.TotalMoney.ToString("0.##");
            this.lblTotalTicket.Text = _service.TotalTicket.ToString();
            this.lblEncashedTotalMoney.Text = _service.EncashedTotalMoney.ToString("0.##");
            this.lblEncashedTotalTicket.Text = _service.EncashedTotalTicket.ToString();
        }

        public bool IsSelected
        {
            get { return this.chkMacNumber.Checked; }
        }
        private void chkMacNumber_CheckedChanged(object sender, EventArgs e)
        {
            if (CheckedChanged != null)
            {
                CheckedChanged(sender, e);
            }
        }

        public void DeSelect()
        {
            this.chkMacNumber.Checked = !this.chkMacNumber.Checked;
        }

        public void Start()
        {
            if (IsSelected)
            {
                //Service.TicketInterval=this.

                Service.WaitEncashTickets.Clear();
                Service.EncashedTotalTicket = 0;
                //Service.EncashedTotalMoney = 0;
                foreach (ListViewItem item in this.lvwTicket.CheckedItems)
                {
                    //item.UseItemStyleForSubItems = false;
                    item.SubItems[item.SubItems.Count - 1].Text = "未打印";
                    item.ForeColor = Color.Red;
                    L_LotTicketEntity entity = item.Tag as L_LotTicketEntity;
                    Service.WaitEncashTickets.Enqueue(entity);
                }
                //foreach (ListViewItem item in this.lvwTicket.Items)
                //{
                //    if(item.Checked)
                //    {
                //        L_LotTicketEntity entity = item.Tag as L_LotTicketEntity;
                //        Service.WaitEncashTickets.Enqueue(entity);
                //    }
                    
                    
                //}

                this.lblStatus.Image = Resources.Run;
                Service.Start();
                _service.LotMachine.MachineInfo.M_Status = (int)MachineStatusEnum.Encashing;
            }
        }
        public void Stop()
        {
            if (IsSelected)
            {
                //this.lblPlayType.Text = "服务已停止";
                this.lblStatus.Image = Resources.Stop;
                Service.Stop();
                _service.LotMachine.MachineInfo.M_Status = (int)MachineStatusEnum.Stopped;
            }
        }

        void ShowTicketEncashing(L_LotTicketEntity ticketEntity)
        {
            ShowEncashSummary();
            int lineIndex = -1;
            for (int i = 0; i < this.lvwTicket.Items.Count; i++)
            {
                L_LotTicketEntity entity = this.lvwTicket.Items[i].Tag as L_LotTicketEntity;
                if (entity!=null && entity.L_TicketCode == ticketEntity.L_TicketCode)
                {
                    lineIndex = i;
                }
            }
            if(lineIndex>=0)
            {
                this.lvwTicket.Items[lineIndex].SubItems[2].Text = "打印中……";
                this.lvwTicket.Items[lineIndex].ForeColor = Color.Blue;
            }
        }
        void ShowTicketEncashed(L_LotTicketEntity ticketEntity)
        {
            ShowEncashSummary();
            int lineIndex = -1;
            for (int i = 0; i < this.lvwTicket.Items.Count; i++)
            {
                L_LotTicketEntity entity = this.lvwTicket.Items[i].Tag as L_LotTicketEntity;
                if (entity != null && entity.L_TicketCode == ticketEntity.L_TicketCode)
                {
                    lineIndex = i;
                }
            }
            if (lineIndex >= 0)
            {
                //已兑奖移至尾行
                this.lvwTicket.Items[lineIndex].Checked = false;
                this.lvwTicket.Items[lineIndex].SubItems[2].Text = "打印完成"; ;
                this.lvwTicket.Items[lineIndex].ForeColor = Color.Green;
                this.lvwTicket.EnsureVisible(lineIndex);
                //ListViewItem item = this.lvwTicket.Items[lineIndex];
                //this.lvwTicket.Items.RemoveAt(lineIndex);
                //this.lvwTicket.Items.Add(item);
            }
        }
        void ShowMachineStatus(MachineStatusEnum machineStatus)
        {
            switch (machineStatus)
            {
                case MachineStatusEnum.Stopped:
                    this.lblStatus.Image = Resources.Stop;
                    break;
                case MachineStatusEnum.Stopping:
                    this.lblStatus.Image = Resources.Pause;
                    break;
                case MachineStatusEnum.Error:
                    this.lblStatus.Image = Resources.Warning;
                    break;
                case MachineStatusEnum.Encashing:
                    this.lblStatus.Image = Resources.Run;
                    break;
            }
        }

        public void AddEncashTickets(List<L_LotTicketEntity> tickets)
        {
            this.lvwTicket.Items.Clear();
            int i = 1;
            foreach (L_LotTicketEntity ticket in tickets)
            {
                ListViewItem listViewItem =
                    new ListViewItem(new string[]
                                         {i.ToString(), ticket.L_TicketCode, "未打印"});
                listViewItem.ForeColor = Color.Red;
                listViewItem.Checked = true;
                listViewItem.Tag = ticket;
                this.lvwTicket.Items.Add(listViewItem);
                i++;
            }
        }

        private void llblEncashConfig_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {

            try
            {
                EncashConfigDialog dlgMachineEdit = new EncashConfigDialog(_service.LotMachine.MachineInfo);
                dlgMachineEdit.ShowDialog();
            }
            catch (Exception exception)
            {
                MessageService.ShowMessage(string.Concat("查看兑奖配置异常。错误信息:", exception.Message));
            }
        }

        private void llblReverseSelect_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
           
                for (int i = 0; i < this.lvwTicket.Items.Count; i++)
                {
                    lvwTicket.Items[i].Checked = !lvwTicket.Items[i].Checked;
                }
                LoggingService.Info("反选成功!");

        }

        private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            int from = 0;
            int to = 0;
            if (!Int32.TryParse(this.textBox1.Text.Trim(), out from) || !Int32.TryParse(this.textBox2.Text.Trim(), out to))
            {
                MessageBox.Show("序号请填数字!");
                return;
            }

            if (from >= to)
            {
                MessageBox.Show("前面的序号要小于后面的序号,请重填!");
                return;
            }


                for (int i = 0; i < this.lvwTicket.Items.Count; i++)
                {
                    if (i + 1 >= from && i + 1 <= to)
                    {
                        lvwTicket.Items[i].Checked = true;
                    }
                    else
                    {
                        lvwTicket.Items[i].Checked = false;
                    }
                }

                LoggingService.Info("序号选择成功!");

        }

        private void lvwTicket_MouseDown(object sender, MouseEventArgs e)
        {
            //鼠标右键
            if (e.Button == MouseButtons.Right)
            {
                //获取鼠标在listview1的坐标
                System.Drawing.Point p = lvwTicket.PointToClient(Control.MousePosition);
                ListViewItem item = lvwTicket.GetItemAt(p.X, p.Y);
                if (item!=null)
                {
                    L_LotTicketEntity entity = item.Tag as L_LotTicketEntity;
                    string text = entity.L_PrnText.Replace("\\", "");
                    //将内容添加到粘贴板中
                    try
                    {
                        Clipboard.SetDataObject(text);
                        MessageBox.Show(this, "复制成功");
                    }
                    catch (Exception ee)
                    {
                        MessageBox.Show(this, ee.Message);
                    }
                }
            }
        }

        private void linkLabel2_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            if (this.lvwTicket.CheckedItems.Count == 0)
            {
                MessageBox.Show("请选择要导出的记录!");
                return;
            }

            FolderBrowserDialog dialog = new FolderBrowserDialog();
             dialog.Description = "请选择导出文件到哪个目录";
             //dialog.RootFolder = Environment.SpecialFolder.Programs;
             if (dialog.ShowDialog() == DialogResult.OK)
             {
                 string prnPath = Path.Combine(dialog.SelectedPath, _service.LotMachine.MachineInfo.M_Number+"_" + DateTime.Now.ToString("yyyyMMddHHmmss"));
                 if (!Directory.Exists(prnPath))
                 {
                     Directory.CreateDirectory(prnPath);
                 }
                 string ticketFilePath;
                 foreach (ListViewItem item in this.lvwTicket.CheckedItems)
                 {
                     
                     L_LotTicketEntity entity = item.Tag as L_LotTicketEntity;
                     ticketFilePath = Path.Combine(prnPath, entity.L_TicketCode + ".prn");

                     try
                     {     
                         File.WriteAllText(ticketFilePath, entity.L_PrnText);
                         LoggingService.Info(string.Concat("导出电子票文件:", ticketFilePath));
                     }
                     catch (Exception exception)
                     {
                         LoggingService.Warn(string.Concat(ticketFilePath, "导出电子票文件异常。错误信息:", exception.ToString()));
                     }
                 }
             }

            
        }

       
    }
}