aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/TEMP/Tango.Scripting/Tango.Scripting.sln
blob: e77aad451b9702c597e999864b833d0a15dc8314 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.28010.2048
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tango.Scripting", "Tango.Scripting\Tango.Scripting.csproj", "{1E938FD2-C669-4738-98C9-77F96CE4D451}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestApp", "TestApp\TestApp.csproj", "{EB6A2B6A-5115-46F5-A969-DFBBB12FCCC1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tango.Scripting.Editors", "Tango.Scripting.Editors\Tango.Scripting.Editors.csproj", "{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tango.Scripting.IDE", "Tango.Scripting.IDE\Tango.Scripting.IDE.csproj", "{C9F60285-91FB-4293-BCF5-164D76755CDD}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tango.Scripting.IDE.UI", "Tango.Scripting.IDE.UI\Tango.Scripting.IDE.UI.csproj", "{B0EFE7A0-7039-4DC4-8B39-465E521299F6}"
EndProject
Global
	GlobalSection(SolutionConfigurationPlatforms) = preSolution
		Debug|Any CPU = Debug|Any CPU
		Release|Any CPU = Release|Any CPU
	EndGlobalSection
	GlobalSection(ProjectConfigurationPlatforms) = postSolution
		{1E938FD2-C669-4738-98C9-77F96CE4D451}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{1E938FD2-C669-4738-98C9-77F96CE4D451}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{1E938FD2-C669-4738-98C9-77F96CE4D451}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{1E938FD2-C669-4738-98C9-77F96CE4D451}.Release|Any CPU.Build.0 = Release|Any CPU
		{EB6A2B6A-5115-46F5-A969-DFBBB12FCCC1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{EB6A2B6A-5115-46F5-A969-DFBBB12FCCC1}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{EB6A2B6A-5115-46F5-A969-DFBBB12FCCC1}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{EB6A2B6A-5115-46F5-A969-DFBBB12FCCC1}.Release|Any CPU.Build.0 = Release|Any CPU
		{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}.Release|Any CPU.Build.0 = Release|Any CPU
		{C9F60285-91FB-4293-BCF5-164D76755CDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{C9F60285-91FB-4293-BCF5-164D76755CDD}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{C9F60285-91FB-4293-BCF5-164D76755CDD}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{C9F60285-91FB-4293-BCF5-164D76755CDD}.Release|Any CPU.Build.0 = Release|Any CPU
		{B0EFE7A0-7039-4DC4-8B39-465E521299F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{B0EFE7A0-7039-4DC4-8B39-465E521299F6}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{B0EFE7A0-7039-4DC4-8B39-465E521299F6}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{B0EFE7A0-7039-4DC4-8B39-465E521299F6}.Release|Any CPU.Build.0 = Release|Any CPU
	EndGlobalSection
	GlobalSection(SolutionProperties) = preSolution
		HideSolutionNode = FALSE
	EndGlobalSection
	GlobalSection(ExtensibilityGlobals) = postSolution
		SolutionGuid = {198EC086-87E6-4936-A43A-4D33BE36A2C5}
	EndGlobalSection
EndGlobal
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.BL.Entities;
using Tango.BL.Enumerations;
using Tango.Core.Commands;
using Tango.Core.DI;
using Tango.Integration.Operation;
using Tango.PMR.Diagnostics;
using Tango.PMR.MachineStatus;
using Tango.PPC.Common;
using Tango.PPC.Common.Diagnostics;
using Tango.PPC.Jobs;
using Tango.PPC.Jobs.NavigationObjects;
using Tango.PPC.Jobs.Views;
using Tango.PPC.UI.Models;
using System.Timers;
using System.Windows.Threading;
using System.Diagnostics;
using Tango.PMR.Printing;
using System.ComponentModel;
using RealTimeGraphX.WPF;
using RealTimeGraphX.DataPoints;
using Tango.PPC.UI.Graphs;
using Tango.BL;
using System.Data.Entity;
using System.Windows.Media;
using Tango.PPC.Common.Resume;
using Tango.Core.ExtensionMethods;
using Tango.PPC.Common.Printing;
using Tango.PPC.Common.RemoteJob;

namespace Tango.PPC.UI.ViewModels
{
    public class MachineStatusViewVM : PPCViewModel, IRemoteJobInputOutputProvider
    {
        public enum StatisticTab
        {
            [Description("Production Data")]
            Productiondata = 0,
            [Description("Temperature")]
            Temperature = 1,
            [Description("Pressure")]
            Pressure = 2,
            [Description("Motor")]
            Motor = 3
        }

        public enum ShowSetButtonsEnum
        {
            ShowDefault,
            ShowROnErrorsJob,
            ShowOnCompleteJob
        }

        public class TimeToDyeValueItem
        {
            public DateTime startTime;
            public DateTime endTime;
            public double totalValue;
        };

        public class TimeToDyeValueCollection
        {
            public DateTime StartTime {  get; set;}
            public List<TimeToDyeValueItem> items;
            public TimeToDyeValueCollection()
            {
                items = new List<TimeToDyeValueItem>();
            }
        };

        private DispatcherTimer _productiondata_timer;
        private bool startingJob = false;

        #region Properties

        [TangoInject]
        public IDiagnosticsFrameProvider DefaultDiagnosticsFrameProvider { get; set; }

        private JobHandler _handler;

        private Job _job;
        /// <summary>
        /// Gets or sets the job.
        /// </summary>
        public Job Job
        {
            get { return _job; }
            set
            {
                _job = value;
                RaisePropertyChangedAuto();
                if (_job == null)
                    IsDyeingProcess = false;
                InvalidateRelayCommands();
                ShowSetButtons = ShowSetButtonsEnum.ShowDefault;
            }
        }

        private RunningJobStatus _runningJobStatus;
        /// <summary>
        /// Gets or sets the running job status.
        /// </summary>
        public RunningJobStatus RunningJobStatus
        {
            get { return _runningJobStatus; }
            set
            {
                _runningJobStatus = value;

                RaisePropertyChangedAuto();
            }
        }

        private bool _isJobStatusViewEnable;

        public bool IsJobStatusViewEnable
        {
            get { return _isJobStatusViewEnable; }
            set { _isJobStatusViewEnable = value; RaisePropertyChangedAuto(); }
        }

        private bool _isPrinting;
        /// <summary>
        /// Gets or sets a value indicating whether this instance is enabled stop button.
        /// </summary>
        public bool IsPrinting
        {
            get { return _isPrinting; }
            set { _isPrinting = value; RaisePropertyChangedAuto(); }
        }

        private bool _isSpoolView;
        /// <summary>
        /// Gets or sets a value indicating whether this instance is spool view.
        /// </summary>
        public bool IsSpoolView
        {
            get { return _isSpoolView; }
            set { _isSpoolView = value; RaisePropertyChangedAuto(); }
        }

        private bool _isWeightView;
        /// <summary>
        /// Gets or sets a value indicating whether this instance is length. Show indicator values in length or weight.
        /// </summary>
        public bool IsWeghtView
        {
            get { return _isWeightView; }
            set { _isWeightView = value; RaisePropertyChangedAuto(); }
        }


        private bool _isDyeingProcess;

        public bool IsDyeingProcess
        {
            get { return _isDyeingProcess; }
            set
            {
                if (_isDyeingProcess != value)
                {
                    _isDyeingProcess = value;
                    RaisePropertyChangedAuto();
                }
            }
        }

        private BrushStop _currentBrushStop;
        public BrushStop CurrentBrushStop
        {
            get { return _currentBrushStop; }
            set
            {
                // if (_currentBrushStop != value)
                {
                    _currentBrushStop = value;
                    OnUpdateCurrentBrush();
                    RaisePropertyChangedAuto();
                }
            }
        }

        public JobBrushStop JobBrushStop { get; set; }

        public double CyanOutput
        {
            get { return GetVolumeLiquidType(LiquidTypes.Cyan); }
        }

        public double MagentaOutput
        {
            get { return GetVolumeLiquidType(LiquidTypes.Magenta); }
        }

        public double YellowOutput
        {
            get { return GetVolumeLiquidType(LiquidTypes.Yellow); }
        }

        public double BlackOutput
        {
            get { return GetVolumeLiquidType(LiquidTypes.Black); }
        }

        public double LightCyanOutput
        {
            get { return GetVolumeLiquidType(LiquidTypes.LightCyan); }
        }

        public double LightMagentaOutput
        {
            get { return GetVolumeLiquidType(LiquidTypes.LightMagenta); }
        }

        public double LightYellowOutput
        {
            get { return GetVolumeLiquidType(LiquidTypes.LightYellow); }
        }
        
        //public double TransparentInkOutput
        //{
        //    get { return GetVolumeLiquidType(LiquidTypes.TransparentInk); }
        //}

        //public double LubricantOutput
        //{
        //    get { return GetVolumeLiquidType(LiquidTypes.Lubricant); }
        //}

        private List<JerricanLevelModel> _midTankLevels;
        public List<JerricanLevelModel> MidTankLevels
        {
            get { return _midTankLevels; }
            set { _midTankLevels = value; RaisePropertyChangedAuto(); }
        }

        private JerricanLevelModel _midTankLubLevel;
        public JerricanLevelModel MidTankLubLevel
        {
            get { return _midTankLubLevel; }
            set { _midTankLubLevel = value; RaisePropertyChangedAuto(); }
        }

        public MachineOverviewModel OverviewModel { get; set; }

        private bool _isDisplayJobOutline;
        /// <summary>
        /// Gets or sets a value indicating whether to display the job outline.
        /// </summary>
        public bool IsDisplayJobOutline
        {
            get { return _isDisplayJobOutline; }
            set { _isDisplayJobOutline = value; RaisePropertyChangedAuto(); }
        }

        private JobTicket _jobOutlineTicket;
        /// <summary>
        /// Gets or sets the job outline ticket.
        /// </summary>
        public JobTicket JobOutlineTicket
        {
            get { return _jobOutlineTicket; }
            set { _jobOutlineTicket = value; RaisePropertyChangedAuto(); }
        }

        public MachineOverviewErrorStates MachineErrorStates {  get; set; }

        private bool _isExpandedNotificatios;

        public bool IsExpandedNotifications
        {
            get { return _isExpandedNotificatios; }
            set {
                _isExpandedNotificatios = value;
            RaisePropertyChangedAuto();}
        }

        private int _selectedStatisticTabIndex;
        /// <summary>
        /// Gets or sets the index of the selected category.
        /// </summary>
        public int SelectedStatisticTabIndex
        {
            get { return _selectedStatisticTabIndex; }
            set
            {
                if (_selectedStatisticTabIndex != value)
                {
                    _selectedStatisticTabIndex = value;
                    RaisePropertyChangedAuto();
                    switch (_selectedStatisticTabIndex)
                    {
                        case 0:
                            {
                                SelectedStatisticTab = StatisticTab.Productiondata;
                                break;
                            }
                        case 1:
                            {
                                SelectedStatisticTab = StatisticTab.Temperature;
                                break;
                            }
                        case 2:
                            {
                                SelectedStatisticTab = StatisticTab.Pressure;
                                break;
                            }
                        case 3:
                            {
                                SelectedStatisticTab = StatisticTab.Motor;
                                break;
                            }
                    }
                }
            }
        }

        private StatisticTab _selectedStatisticTab;
        /// <summary>
        /// Gets or sets the selected category.
        /// </summary>
        ///
        public StatisticTab SelectedStatisticTab
        {
            get
            {
                return _selectedStatisticTab;
            }
            set
            {
                if (_selectedStatisticTab != value)
                {
                    _selectedStatisticTab = value;
                    RaisePropertyChangedAuto();
                }
                _selectedStatisticTabIndex = _selectedStatisticTab.ToInt32();
                RaisePropertyChanged(nameof(SelectedStatisticTabIndex));
            }
        }

        public WpfGraphController<DateTimeDataPoint, DoubleDataPoint> JobController { get; set; }

        private JobResumeModel _resumeModel;
        public JobResumeModel ResumeModel
        {
            get { return _resumeModel; }
            set { _resumeModel = value; RaisePropertyChangedAuto(); RaisePropertyChanged(nameof(HasResumeModel)); }
        }

        public bool HasResumeModel
        {
            get { return ResumeModel != null; }
        }

        private ShowSetButtonsEnum _showSetButtons;

        public ShowSetButtonsEnum ShowSetButtons
        {
            get { return _showSetButtons; }
            set {
                _showSetButtons = value;
            RaisePropertyChangedAuto();}
        }


        #endregion

        #region Commands

        public RelayCommand StopCommand { get; set; }

        public RelayCommand AbortCommand { get; set; }

        public RelayCommand ResumeCommand { get; set; }
        public RelayCommand CaancelJobCommand{ get; set; }
        public RelayCommand RestartJobCommand { get; set; }
        public RelayCommand ClearJobCommand { get; set; }
        

        public RelayCommand GoToJobCommand { get; set; }

        /// <summary>
        /// Gets or sets the job status view command.
        /// </summary>
        public RelayCommand JobStatusViewCommand { get; set; }

        /// <summary>
        /// Gets or sets the overview view command.
        /// </summary>
        public RelayCommand OverviewViewCommand { get; set; }

        public RelayCommand ClearAllNotificationsCommand { get; set; }

        public RelayCommand DisplayJobOutlineCommand { get; set; }

        public RelayCommand HideJobOutlineCommand { get; set; }

        public RelayCommand DropResumeCommand { get; set; }

        #endregion

        public MachineStatusViewVM()
        {
            _productiondata_timer = new DispatcherTimer();
            _productiondata_timer.Interval = TimeSpan.FromMinutes(10);
            _productiondata_timer.Tick += _productiondata_timer_Tick;
            

            StopCommand = new RelayCommand(StopJob, () => CanStopped());
            AbortCommand = new RelayCommand(AbortJob, () => CanStopped());

            ResumeCommand = new RelayCommand(ResumeJob, () => MachineProvider.MachineOperator.CanPrint);
            CaancelJobCommand = new RelayCommand(CaancelJob);
            RestartJobCommand = new RelayCommand(RestartJob, () => MachineProvider.MachineOperator.CanPrint);
            ClearJobCommand = new RelayCommand(ClearJob);
           

            GoToJobCommand = new RelayCommand(GoToJob, () => IsEnableGoToJob());
            JobStatusViewCommand = new RelayCommand(JobStatusView);
            OverviewViewCommand = new RelayCommand(OverviewView);
            ClearAllNotificationsCommand = new RelayCommand(ClearAllNotifications);
            DisplayJobOutlineCommand = new RelayCommand(DisplayJobOutline);
            HideJobOutlineCommand = new RelayCommand(HideJobOutline);

            DropResumeCommand = new RelayCommand(DropResume);

            IsJobStatusViewEnable = true;
            IsPrinting = false;
            IsSpoolView = false;
            IsWeghtView = false;

            OverviewModel = new MachineOverviewModel();
            MachineErrorStates = new MachineOverviewErrorStates();

            IsExpandedNotifications = false;
            SelectedStatisticTabIndex = 0;

            JobController = CreateController(CreateSeries("Total", GraphHelper.GraphColor.Green));
            ShowSetButtons = ShowSetButtonsEnum.ShowDefault;
        }

        public override void OnApplicationReady()
        {
            base.OnApplicationReady();
            EventLogger.EventReceived += EventLogger_EventReceived;

            MidTankLevels = MachineProvider.Machine.Configuration.NoneEmptyIdsPacks.Where(x => x.MidTankType.HasLevelMeasure ).OrderBy(x => x.PackIndex).Select(x => new JerricanLevelModel()
            {
                Max = x.MidTankType.LiterCapacity,
                IDSPack = x,
            }).OrderBy(y => y.IDSPack.LiquidType.Type).ToList();
            var LubLevel = MachineProvider.Machine.Configuration.NoneEmptyIdsPacks.Where(x => x.MidTankType.Type == MidTankTypes.LubricantMidTank).FirstOrDefault();
           
            MidTankLubLevel = new JerricanLevelModel();
            if(LubLevel != null)
            {
                MidTankLubLevel.Max = LubLevel.MidTankType.LiterCapacity;
                MidTankLubLevel.IDSPack = LubLevel;
            };

            MachineProvider.MachineOperator.MachineStatusChanged += MachineOperator_MachineStatusChanged;

            DateTime dateTime = DateTime.Now;
            DateTime onedayEarlier = dateTime.AddDays(-1);

            GetCollectionDyePropByStartTime(onedayEarlier);

            _productiondata_timer.Start();
        }

        #region Events

        private void EventLogger_EventReceived(object sender, MachinesEvent ev)
        {
            InvokeUI(() =>
            {
                if (ev.Category == EventTypeCategories.Error || ev.Category == EventTypeCategories.Critical)
                   {
                        IsExpandedNotifications = true;
                   }
            });
        }

            private void MachineOperator_MachineStatusChanged(object sender, MachineStatus status)
        {
            UpdateMidTankLevels(status);
            UpdateMachineStatusErrors(status);
        }
        private void UpdateMidTankLevels(MachineStatus status)
        {
            if (!IsJobStatusViewEnable)
            {
                foreach (var item in status.IDSPacksLevels)
                {
                    JerricanLevelModel model = null;
                    if (item.Index == 8)//lub
                    {
                        model = MidTankLubLevel;

                    }
                    else { 
                        model = MidTankLevels.SingleOrDefault(x => x.IDSPack.PackIndex == item.Index);
                    }

                    if (model != null)
                    {
                        model.Level = item.MidTankLevel;
                        model.JerricanPresent = item.JerricanPresent;
                        model.FillingTimeoutError = item.FillingTimeoutError;
                        model.MidTankEmpty = item.MidTankEmpty;
                        model.MidTankRefillPumpActive = item.MidTankRefillPumpActive;
                        model.RemainingTimeoutError = TimeSpan.FromSeconds(item.TimerRemainingSeconds);
                    }
                    //TEST
                    //if (model != null)
                    //{
                    //    var Li = model.IDSPack.LiquidType.Type;
                    //    var Mid = model.IDSPack.MidTankType.Type;
                    //    model.Level = 0.0;
                    //model.JerricanPresent = false;
                    //model.FillingTimeoutError = false;
                    //model.MidTankEmpty = true;
                    //model.MidTankRefillPumpActive = false;
                    //model.RemainingTimeoutError = TimeSpan.FromSeconds(300);

                    //if (item.Index == 1)
                    //{
                    //    model.Level = 1.0;
                    //}
                    //if (item.Index == 2)
                    //{
                    //    model.Level = 2.0;
                    //}
                    //if (item.Index == 3)
                    //{
                    //    model.Level = 3.0;
                    //}
                    //if (item.Index == 4)//TI
                    //{
                    //    model.Level = 7.0;
                    //}
                    //if (item.Index == 5)//LC
                    //{
                    //    model.Level = 7.0;
                    //}
                    //if (item.Index == 6)//LM
                    //{
                    //    model.Level = 3.5;
                    //}
                    //if (item.Index == 7)//LY
                    //{
                    //    model.Level = 2.5;
                    //}
                    //    if (item.Index == 8)//Lub
                    //    {
                    //        model.Level = 1.5;
                    //    }
                    //    if (item.Index ==9)
                    //    {
                    //        model.Level = 4.99;
                    //    }
                        
                    //}
                    //////////////////////////////
                }
            }
        }

        private void UpdateMachineStatusErrors(MachineStatus status)
        {
            var windersInError = status.WindersInError.ToList();// to test
            MachineErrorStates.UpdateWinders(windersInError);
            var dansersInError = status.DancersInError.ToList();
            MachineErrorStates.UpdateDancers(dansersInError);
            var btsrsInErrors = status.BtsrsInError.ToList();
            MachineErrorStates.UpdateBTSRs(btsrsInErrors);
        }

        private void MachineOperator_InkFillingStatusChanged(object sender, InkFillingStatusChangedEventArgs e)
        {
            //foreach (var cartridge in e.Status.CartridgesStatuses.Where(x => x.Cartridge.Slot != CartridgeSlot.Ink))
            //{
            //    var wasteState = WasteStates.SingleOrDefault(x => x.Slot == cartridge.Cartridge.Slot);

            //    if (wasteState != null)
            //    {
            //        wasteState.State = cartridge.State;
            //    }
            //}
        }

        private void _productiondata_timer_Tick(object sender, EventArgs e)
        {
           var  CurrentDateTime = DateTime.Now;
        }
        #endregion

        #region printing

        public override void OnApplicationStarted()
        {
            MachineProvider.MachineOperator.PrintingStarted += MachineOperator_PrintingStarted;
            MachineProvider.MachineOperator.PrintingEnded += MachineOperator_PrintingEnded;
            MachineProvider.MachineOperator.StatusChanged += MachineOperator_StatusChanged;

            DefaultDiagnosticsFrameProvider.FrameReceived += DefaultDiagnosticsFrameProvider_FrameReceived;

            JobResumeManager.JobResumeUpdated += JobResumeManager_JobResumeUpdated;
            JobResumeManager.JobResumeDropped += JobResumeManager_JobResumeDropped;
        }

        
        private void DefaultDiagnosticsFrameProvider_FrameReceived(object sender, PMR.Diagnostics.StartDiagnosticsResponse e)
        {
            OverviewModel.Update(e, this.Job != null ? Job.Rml : null, null);
        }

        private void MachineOperator_PrintingStarted(object sender, PrintingEventArgs e)
        {
            _handler = e.JobHandler;
            Job = e.Job;
            try
            {
                ResumeModel = JobResumeManager.GetJobResumeModel(Job.Guid);

                if (ResumeModel != null)
                {
                    LogManager.Log($"Job resume info found:\n{ResumeModel.ToJsonString()}");
                }
            }
            catch (Exception ex)
            {
                LogManager.Log(ex, "Error retrieving job resume info from db.");
            }

            e.JobHandler.StatusChanged += JobHandler_StatusChanged;
            //e.JobHandler.SpoolChangeRequired += JobHandler_SpoolChangeRequired;
            e.JobHandler.Stopped += JobHandler_Stopped;
            e.JobHandler.CanCancelChanged += JobHandler_CanCancelChanged;
            InvokeUI(() =>
            {
                IsPrinting = true;
                StopCommand.RaiseCanExecuteChanged();
                AbortCommand.RaiseCanExecuteChanged();
            });


        }

        private void JobHandler_Stopped(object sender, EventArgs e)
        {
            if (_handler != null)
            {
                _handler.StatusChanged -= JobHandler_StatusChanged;
                //_handler.SpoolChangeRequired -= JobHandler_SpoolChangeRequired;
                _handler.Stopped -= JobHandler_Stopped;
                _handler.StatusChanged -= JobHandler_StatusChanged;
                _handler.CanCancelChanged -= JobHandler_CanCancelChanged;
            }
        }

        private void MachineOperator_PrintingEnded(object sender, PrintingEventArgs e)
        {
            LogManager.Log("Printing ended");
            InvokeUI(() =>
            {
                IsPrinting = false;
                StopCommand.RaiseCanExecuteChanged();
                AbortCommand.RaiseCanExecuteChanged();
            });
        }

        private void JobHandler_StatusChanged(object sender, RunningJobStatus e)
        {
            RunningJobStatus = e;
            if(RunningJobStatus != null && RunningJobStatus.IsFailed)
            {
                ShowSetButtons = ShowSetButtonsEnum.ShowROnErrorsJob;
            }
            else if(RunningJobStatus != null && RunningJobStatus.IsCompleted)
            {
                ShowSetButtons = ShowSetButtonsEnum.ShowOnCompleteJob;
            }

            IsDyeingProcess = (RunningJobStatus != null && RunningJobStatus.CurrentSegment != null);
            if (RunningJobStatus != null && RunningJobStatus.CurrentSegment != null)
            {
                if(_runningJobStatus.CurrentSegment.IsInterSegment)
                {
                    CurrentBrushStop = _runningJobStatus.CurrentSegment.BrushStops.FirstOrDefault();
                    JobBrushStop = null;
                }
                else
                {
                    var realsegmIndex = 1;
                    if (Job.EnableInterSegment && Job.InterSegmentLength > 0)
                    {
                        int segmentIndex = _runningJobStatus.CurrentSegment.SegmentIndex - (Job.EffectiveSegments.Count * RunningJobStatus.CurrentUnit);
                        if(RunningJobStatus.CurrentUnit > 0)
                        {
                            segmentIndex -= RunningJobStatus.CurrentUnit;// inter segment between units
                        }
                        realsegmIndex = (int)(segmentIndex/2) + 1;
                    }
                    else
                    {
                        realsegmIndex = Math.Max(_runningJobStatus.CurrentSegment.SegmentIndex - (Job.Segments.Count * RunningJobStatus.CurrentUnit), 0);
                    }
                    
                    var segment = Job.Segments.FirstOrDefault(x => x.SegmentIndex == realsegmIndex);
                    if (segment != null)
                    {
                        if (_handler.JobTicket.Segments.Count > 0)
                        {
                            JobBrushStop = _handler.JobTicket.Segments[Job.OrderedSegments.IndexOf(segment)].BrushStops.First();
                        }
                    }
                    CurrentBrushStop = RunningJobStatus.CurrentSegment.FirstBrushStop;
                }
            }
        }

        private void JobHandler_CanCancelChanged(object sender, EventArgs e)
        {
            InvokeUI(() =>
           {
               IsPrinting = _handler.CanCancel;
               StopCommand.RaiseCanExecuteChanged();
               AbortCommand.RaiseCanExecuteChanged();
           });
        }

        private void MachineOperator_StatusChanged(object sender, MachineStatuses e)
        {
            InvokeUI(() =>
            {
                ResumeCommand.RaiseCanExecuteChanged();
                RestartJobCommand.RaiseCanExecuteChanged();
            });
        }

        #endregion

        #region Methods

        private bool IsEnableGoToJob()
        {
            return Job != null && _handler != null;
        }

        private void GoToJob()
        {

            NavigationManager.NavigateWithObject<JobsV2Module, JobEurekaView, JobNavigationObject>(new JobNavigationObject() { Job = _handler.Job });
            NavigationManager.ClearHistoryExcept<JobsView>();

        }
        /// <summary>
        /// Toggles the application technician mode.
        /// </summary>
        public void ToggleTechnicianMode()
        {
            if (!ApplicationManager.IsInTechnicianMode)
            {
                ApplicationManager.EnterTechnicianMode();
            }
            else
            {
                ApplicationManager.ExitTechnicianMode();
            }
        }

        protected void JobStatusView()
        {
            IsJobStatusViewEnable = true;
        }

        protected void OverviewView()
        {
            IsJobStatusViewEnable = false;
        }

        private double GetVolumeLiquidType(LiquidTypes liquidType)
        {
            if (JobBrushStop != null && JobBrushStop.Dispensers != null && JobBrushStop.Dispensers.Count > 0)
            {
                var lt = JobBrushStop.Dispensers.FirstOrDefault(x => x.DispenserLiquidType == (DispenserLiquidType)liquidType);

                if (lt != null)
                {
                    return Math.Round(lt.Volume, 2);
                }
            }
            return 0;
        }

        private bool CanStopped()
        {
            return IsPrinting;
        }

        private void StopJob()
        {
            _handler?.Cancel();
        }

        private void AbortJob()
        {
            _handler?.Cancel();
            if (Job != null && HasResumeModel)
            {
                JobResumeManager.DropResume(Job.Guid);
                
            }
        }

        private  void ResumeJob()
        {
            ShowSetButtons = ShowSetButtonsEnum.ShowDefault;
            if (Job != null && HasResumeModel)
            {
                StartJob();
            }
        }

        private async void StartJob()
        {
            
            if (startingJob) return;

            RunningJobStatus = null;

            try
            {
                startingJob = true;
                LogManager.Log("Start job command pressed. Starting job and navigating to job progress view...");
                
                var printConfig = new PrintingConfiguration();

                if (HasResumeModel)
                {
                    printConfig.FirstUnitStartPosition = ResumeModel.FirstUnitStartPosition;
                    printConfig.GlobalStartPosition = ResumeModel.GlobalStartPosition;
                    printConfig.RemainingUnits = ResumeModel.RemainingUnits;
                }
                using (var db = ObservablesContext.CreateDefault())
                {
                    var handler = await PrintingManager.Print(Job, db, printConfig);
                }
                
                startingJob = false;
            }
            catch (InsufficientLiquidQuantityException)
            {
                //Ignore..
            }
            catch (OperationCanceledException)
            {
                //Ignore..
            }
            catch (Exception ex)
            {
                LogManager.Log(ex, "Could not start the current job.");
                await NotificationProvider.ShowError($"{ex.Message}.");
            }
            finally
            {
                startingJob = false;
            }
        }

        private void CaancelJob()
        {
            ClearJob();
        }

        private void RestartJob()
        {
            ShowSetButtons = ShowSetButtonsEnum.ShowDefault;
            if (Job != null )
            {
                if(HasResumeModel)
                {
                    DropResume();
                }
                RunningJobStatus = null;
                StartJob();
            }
        }

        private void ClearJob()
        {
            ShowSetButtons = ShowSetButtonsEnum.ShowDefault;
            DropResume();
            RunningJobStatus = null;
            Job = null;
        }

        protected void ClearAllNotifications()
        {
            NotificationProvider.NotificationItems.Where(x => x.CanClose).ToList().ForEach(y => NotificationProvider.PopNotification(y));
        }

        protected void OnUpdateCurrentBrush()
        {
            RaisePropertyChanged(nameof(CyanOutput));
            RaisePropertyChanged(nameof(LightCyanOutput));
            RaisePropertyChanged(nameof(MagentaOutput));
            RaisePropertyChanged(nameof(LightMagentaOutput));
            RaisePropertyChanged(nameof(YellowOutput));
            RaisePropertyChanged(nameof(LightYellowOutput));
            RaisePropertyChanged(nameof(BlackOutput));
        }

        private void HideJobOutline()
        {
            IsDisplayJobOutline = false;
        }

        private void DisplayJobOutline()
        {
            if(_handler != null && _handler.JobTicket != null)
            {
                JobOutlineTicket = _handler.JobTicket;
                IsDisplayJobOutline = true;
            }
        }
        
        #endregion

        #region graph

        public TimeToDyeValueCollection graphDyeingValuesCollection = new TimeToDyeValueCollection();

        private WpfGraphController<DateTimeDataPoint, DoubleDataPoint> CreateController(params WpfGraphDataSeries[] seriesCollection)
        {
            var controller = new WpfGraphController<DateTimeDataPoint, DoubleDataPoint>();

            foreach (var series in seriesCollection)
            {
                controller.DataSeriesCollection.Add(series);
            }

            controller.Range.AutoY = true;
            controller.Range.MaximumY = 100;
            controller.Range.MinimumY = 0;
            controller.Range.MaximumX = new DateTime(0).AddMinutes(30);

            controller.RefreshRate = TimeSpan.FromMilliseconds(300000);//5 min

            return controller;
        }

        private WpfGraphDataSeries CreateSeries(String name, GraphHelper.GraphColor fill)
        {
            WpfGraphDataSeries series = new WpfGraphDataSeries()
            {
                Stroke = Colors.DodgerBlue,
            };
            series.Name = name;
            series.Fill = GraphHelper.GetGraphBrush(fill);
            series.StrokeThickness = 1;
            series.Stroke = GraphHelper.GetGraphStrokeColor();
            return series;
        }

        public async void GetCollectionDyePropByStartTime(DateTime starttime)
        {
            try
            {
                using (ObservablesContext db = ObservablesContext.CreateDefault())
                {
                    var jobRuns = await db.JobRuns.Where(x => x.StartDate >= starttime).Select(x => new { x.StartDate, x.EndDate, x.EndPosition }).OrderBy(y => y.StartDate).ToListAsync();
                    double allvalues = 0;
                    graphDyeingValuesCollection.StartTime = starttime;
                    for ( int i = 0; i < jobRuns.Count; i++)
                    {
                        JobController.PushData(jobRuns[i].StartDate, allvalues);
                        if (i > 0)
                        {
                            allvalues += jobRuns[i-1].EndPosition;
                        }
                        graphDyeingValuesCollection.items.Add( new TimeToDyeValueItem(){ startTime = jobRuns[i].StartDate, endTime = jobRuns[i].EndDate, totalValue = allvalues });
                        JobController.PushData(jobRuns[i].EndDate, allvalues);
                    }
                }
            }
            catch (Exception ex)
            {
                LogManager.Log(ex, "Error loading machine counters.");

            }
        }
        #endregion

        #region Resume

        private void JobResumeManager_JobResumeUpdated(object sender, Common.Resume.JobResumeUpdatedEventArgs e)
        {
            if (Job != null && Job.Guid == e.JobGuid)
            {
                ResumeModel = e.ResumeModel;
            }
        }

        private void JobResumeManager_JobResumeDropped(object sender, Common.Resume.JobResumeDroppedEventArgs e)
        {
            if (Job != null && Job.Guid == e.JobGuid)
            {
                ResumeModel = null;
            }
        }

        private async void DropResume()
        {
            if (Job != null && HasResumeModel)
            {
               // if (await NotificationProvider.ShowQuestion("Drop resume information and enable job editing?"))
                {
                    JobResumeManager.DropResume(Job.Guid);
                }
            }
        }

        #endregion
    }
}