using System;
using System.Diagnostics;
using System.Linq;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Ipc;
using System.Threading;
using System.Windows;
using System.Windows.Threading;
using Vinno.IDCardReader;


namespace Vinno.IdentificationCardApp
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow
    {
        private bool _bTimeToStop;
        private Thread _workThread;
        private readonly ManualResetEvent _workStopEvent;

        private readonly IIdCardListener _idListener;
        private readonly IDCardManager _idCardManager;
        private readonly DispatcherTimer _timer;
        private bool _mainIsExisting = true;
        private const double MilliSeconds = 500;//ms
    
        public MainWindow()
        {
            InitializeComponent();
            Visibility = Visibility.Hidden;
            _idCardManager = new IDCardManager();
            _idCardManager.OpenPort();
            var ipcChannel = new IpcClientChannel();
            ChannelServices.RegisterChannel(ipcChannel, false);
            _idListener = (IIdCardListener)Activator.GetObject(typeof(IIdCardListener), "ipc://IdCard/IdCardListener");
      
            _workThread = new Thread(ThreadWorkFunction) { IsBackground = true };
            _workStopEvent = new ManualResetEvent(false);
            _workThread.Start();

            _timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(MilliSeconds) };
            _timer.Tick += OnTimerTick;
            _timer.Start();

            Logger.Info("Identification read tool started");
        }

        private void OnTimerTick(object sender, EventArgs eventArgs)
        {
            if (_mainIsExisting == false)
            {
                Close();
            }
        }

        private void ThreadWorkFunction()
        {
            while (_workStopEvent.WaitOne(Convert.ToInt32(MilliSeconds)) == false)
            {
                try
                {
                    //Shut down the process of Read identification tool
                    _mainIsExisting = Process.GetProcessesByName("vStation").Any();
                    if (_mainIsExisting == false)
                    {
                        break;
                    }

                    if (_idCardManager.PortIsOpened)
                    {
                        var readCardCode = _idCardManager.ReadIcCard();
                        if (readCardCode == ReadCardReturnCodeEnum.Ok)
                        {
                            SendData();
                        }
                        else if (readCardCode == ReadCardReturnCodeEnum.DeviceConnectionError)
                        {
                            if (_idCardManager.ClosePort())
                            {
                                _idCardManager.OpenPort();
                            }
                        }
                    }
                    else
                    {
                        _idCardManager.OpenPort();
                    }
                }
                catch (Exception ex)
                {
                    Logger.Error("ThreadWorkFunction", ex);
                }
            }
        }
        private void BtnClick(object sender, RoutedEventArgs e)
        {
            if (_bTimeToStop)
            {
                _workThread = new Thread(ThreadWorkFunction) { IsBackground = true };
                _workThread.Start();
                _bTimeToStop = false;
                btnReadCard.Content = "STOP";
            }
            else
            {
                _bTimeToStop = true;
                btnReadCard.Content = "START";
            }
        }

        public void SendData()
        {
            try
            {
                CardInfo cardInfo = new CardInfo();
                cardInfo.Id = _idCardManager.IDCardInfo.Idc;
                cardInfo.Name = _idCardManager.IDCardInfo.Name;
                cardInfo.Birthday = _idCardManager.IDCardInfo.Birthday;
                cardInfo.Gender = _idCardManager.IDCardInfo.SexCode == "1" ? IDGenderType.Male : IDGenderType.Female;
                cardInfo.Address = _idCardManager.IDCardInfo.Address;
                cardInfo.SignAddress = _idCardManager.IDCardInfo.SignAddress;
                cardInfo.People = _idCardManager.IDCardInfo.PeopleCode;
                cardInfo.SamId = _idCardManager.IDCardInfo.PeriodOfValidityCode;
                cardInfo.ValidDateFrom = _idCardManager.IDCardInfo.StartDate;
                cardInfo.ValidDateTo = _idCardManager.IDCardInfo.EndDate;
                cardInfo.ImageBytes = _idCardManager.IDCardInfo.PicByte;
                Logger.Info(string.Format("SendData: Name:{0}, ID:{1}, Birthday:{2}, Gender:{3} Address:{4}",
                cardInfo.Name, cardInfo.Id, cardInfo.Birthday, cardInfo.Gender, cardInfo.Address));
                _idListener.SetCardInfo(cardInfo);
            }
            catch (Exception ex)
            {
                Logger.Error("SendData", ex);
            }
        }

        private void WindowClosing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            _timer.Stop();
            _workStopEvent.Set();
        }
    }
}