private void button_JobReload_Click(object sender, RoutedEventArgs e)
        {
            if (job != null)
            {
                job = App.jobStore.getJobById(job.id);
                parent.updateScheduledJobs(job);

                // Force
                setJob(job);
            }
        }
        private void buttonDelete_Click(object sender, RoutedEventArgs e)
        {
            MessageBoxResult result = MessageBox.Show($"Are you sure you want to delete this job ?", "Confirmation", MessageBoxButton.YesNo, MessageBoxImage.Question);

            if (result == MessageBoxResult.No)
            {
                return;
            }

            job = App.jobStore.getJobById(job.id);

            if (job.status == JobStatus.TERMINATED || job.status == JobStatus.CANCELLED)
            {
                App.jobStore.deleteJob(job);
            }

            reset();
            parent.updateScheduledJobs();
        }
        private void buttonCancel_Click(object sender, RoutedEventArgs e)
        {
            MessageBoxResult result = MessageBox.Show($"Are you sure you want to cancel this job ?", "Confirmation", MessageBoxButton.YesNo, MessageBoxImage.Question);

            if (result == MessageBoxResult.No)
            {
                return;
            }

            job = App.jobStore.getJobById(job.id);

            if (job.status == JobStatus.CREATED || job.status == JobStatus.SCHEDULED)
            {
                job.unSchedule();
                job.status = JobStatus.CANCELLED;
                App.jobStore.updateJob(job);
            }

            setJob(job);
            parent.updateScheduledJobs();
        }
        /// <summary>
        /// Show a job in the panel. If the job is null, the panel will be reset
        /// </summary>
        /// <param name="job">The job to show</param>
        public void setJob(Scheduling.Job job)
        {
            this.job = job;

            if (job == null)
            {
                reset();
                return;
            }

            if (job.status == JobStatus.CREATED)
            {
                elementToDisable.ForEach(element => element.IsEnabled = true);
            }
            else
            {
                elementToDisable.ForEach(element => element.IsEnabled = false);
            }

            label_jobDetailsTitle.Content = "Selected Job";
            textBox_TaskName.Text         = job.name;

            if (job.executeNow)
            {
                jobNowCheckbox.IsChecked    = true;
                jobCyclicCheckbox.IsChecked = false;
                textBox_plannedTrigger.Text = string.Empty;
            }
            else
            {
                jobNowCheckbox.IsChecked    = false;
                jobCyclicCheckbox.IsChecked = job.cyclic;
                textBox_plannedTrigger.Text = job.triggerDescription;
            }

            // Selected computers
            selectedComputersGrid.SelectedItems.Clear();
            foreach (Computer c in selectedComputersGrid.Items)
            {
                foreach (ComputerInfo ci in job.computers)
                {
                    if (ci.name == c.nameLong)
                    {
                        selectedComputersGrid.SelectedItems.Add(c);
                        break;
                    }
                }
            }

            // Tasks
            tasksPanel.Children.Clear();
            foreach (JobTask task in job.tasks)
            {
                dynamic panel = null;

                switch (task.type)
                {
                case JobTaskType.INSTALL_SOFTWARE:
                    panel = new TaskInstall();
                    break;

                case JobTaskType.REBOOT:
                    panel = new TaskReboot();
                    break;

                case JobTaskType.SHUTDOWN:
                    panel = new TaskShutdown();
                    break;

                case JobTaskType.WAKE_ON_LAN:
                    panel = new TaskWakeOnLan();
                    break;
                }

                if (panel != null)
                {
                    panel.initFromTask(task);
                    tasksPanel.Children.Add(panel);
                }
            }

            // Actions accordingly to the status
            switch (job.status)
            {
            case JobStatus.CANCELLED:
            case JobStatus.TERMINATED:
                buttonShowReport.Visibility = Visibility.Visible;
                buttonCancel.Visibility     = Visibility.Collapsed;
                buttonDelete.Visibility     = Visibility.Visible;
                parent.jobReportDetails.setJob(job);
                break;

            case JobStatus.SCHEDULED:
                buttonShowReport.Visibility = Visibility.Visible;
                buttonDelete.Visibility     = Visibility.Collapsed;
                buttonCancel.Visibility     = Visibility.Visible;
                buttonCancel.IsEnabled      = true;
                parent.jobReportDetails.setJob(job);
                break;

            case JobStatus.IN_PROGRESS:
                buttonShowReport.Visibility = Visibility.Visible;
                buttonDelete.Visibility     = Visibility.Collapsed;
                buttonCancel.Visibility     = Visibility.Visible;
                buttonCancel.IsEnabled      = false;
                break;

            case JobStatus.CREATED:
            default:
                buttonShowReport.Visibility = Visibility.Collapsed;
                buttonDelete.Visibility     = Visibility.Collapsed;
                buttonCancel.Visibility     = Visibility.Collapsed;
                break;
            }
            buttonCreateJob.Visibility = Visibility.Collapsed;
        }
        private void buttonCreateJob_Click(object sender, RoutedEventArgs e)
        {
            // If a trigger is defined
            if (trigger == null && !jobNowCheckbox.IsChecked.Value)
            {
                MessageBox.Show("Error : An execution trigger must be provided to the job", "Job creation error");
                return;
            }

            // Get the selected computers
            if (selectedComputersGrid.SelectedItems.Count <= 0)
            {
                MessageBox.Show("Error : No computer selected. At least one computer should be selected", "Job creation error");
                return;
            }

            var selectedComputers = new List <ComputerInfo>();

            foreach (Computer c in selectedComputersGrid.SelectedItems)
            {
                selectedComputers.Add(App.computerInfoStore.getComputerInfoByName(c.nameLong));
            }

            // Get the tasks
            var tasks = new List <JobTask>();

            foreach (dynamic element in tasksPanel.Children)
            {
                JobTask jobTask = element.createTask();

                if (jobTask == null)
                {
                    return; // Error during jobtask creation
                }
                tasks.Add(jobTask);
            }

            if (tasks.Count <= 0)
            {
                MessageBox.Show("Error : No task defined. At least one taks should be defined", "Job creation error");
                return;
            }

            // OK, create the job
            var job = new Scheduling.Job {
                creationDateTime   = DateTime.Now,
                cyclic             = jobCyclicCheckbox.IsChecked.Value,
                executeNow         = trigger == null,
                triggerDescription = trigger != null?trigger.ToString() : "As soon as possible",
                                         computers = selectedComputers,
                                         status    = JobStatus.SCHEDULED,
                                         tasks     = tasks,
                                         name      = textBox_TaskName.Text
            };

            // Insert into the job store
            App.jobStore.insertJob(job);

            // Create a windows task
            if (jobNowCheckbox.IsChecked.Value)
            {
                job.schedule();
            }
            else
            {
                job.schedule(trigger);
            }

            parent.updateScheduledJobs();

            reset();
        }
        public void setJob(Scheduling.Job job)
        {
            this.job = job;

            textBox_CreationDate.Text = job.creationDateTime.ToString("f",
                                                                      CultureInfo.CreateSpecificCulture("fr-FR"));

            textBox_LastExecutionDate.Text = job.lastExecutionDateTime != DateTime.MinValue ? job.lastExecutionDateTime.ToString("f",
                                                                                                                                 CultureInfo.CreateSpecificCulture("fr-FR")) : "Never";

            textBox_StartTrigger.Text = job.triggerDescription;

            float  success = job.reports.Aggregate(0, (sum, jr) => jr.error ? sum : sum + 1) / (float)job.reports.Count * 100f;
            string message = null;

            foreach (var msg in messages)
            {
                if (success >= msg.Item1)
                {
                    message = msg.Item2;
                    break;
                }
            }

            if (success < 0 || float.IsNaN(success))
            {
                textBox_SuccessRate.Content = "-";
            }
            else
            {
                textBox_SuccessRate.Content = $"{message} ({(int)success}%)";
            }

            // Grid clear
            detailsGrid.Items.Clear();
            detailsGrid.Columns.Clear();

            // Column creation
            detailsGrid.Columns.Add(new DataGridTextColumn {
                Header  = "Computer Name",
                Binding = new Binding("computerName")
            });
            detailsGrid.Columns.Add(new DataGridTextColumn {
                Header  = "Start",
                Binding = new Binding("startDateTime")
            });
            detailsGrid.Columns.Add(new DataGridTextColumn {
                Header  = "End",
                Binding = new Binding("endDateTime")
            });
            detailsGrid.Columns.Add(new DataGridTextColumn {
                Header  = "Duration",
                Binding = new Binding("duration")
            });

            int i = 0;

            foreach (var task in job.tasks)
            {
                detailsGrid.Columns.Add(new DataGridTextColumn {
                    Header  = headers.GetValueOrDefault(task.type),
                    Binding = new Binding($"task{i}")
                });

                i++;
            }

            // Row creations
            foreach (var report in job.reports)
            {
                var dynamicObject = new ExpandoObject() as IDictionary <string, object>;

                dynamicObject.Add("computerName", report.computerName);
                dynamicObject.Add("startDateTime", report.startDateTime.ToString("dd/MM/yyyy HH:mm:ss"));
                dynamicObject.Add("endDateTime", report.endDateTime.ToString("dd/MM/yyyy HH:mm:ss"));

                var diff = (report.endDateTime - report.startDateTime);
                dynamicObject.Add("duration", (int)diff.TotalMinutes + " minutes " + (int)(diff.TotalSeconds % 60) + " seconds");

                for (i = 0; i < job.tasks.Count; i++)
                {
                    if (report.tasksReports.Count > i)
                    {
                        dynamicObject.Add($"task{i}", report.tasksReports[i].error ? "Failed" : "Success");
                    }
                    else
                    {
                        dynamicObject.Add($"task{i}", "-");
                    }
                }

                detailsGrid.Items.Add(dynamicObject);
            }

            // Row styling
            for (i = 0; i < job.reports.Count; i++)
            {
                for (int j = 0; j < job.reports[i].tasksReports.Count; j++)
                {
                    var cell = detailsGrid.GetCell(i, j + 4);

                    if (cell != null)
                    {
                        switch ((cell.Content as TextBlock).Text)
                        {
                        case "-":
                            cell.Background = Brushes.LightYellow;
                            break;

                        case "Failed":
                            cell.Background = Brushes.Red;
                            break;

                        case "Success":
                            cell.Background = Brushes.LightGreen;
                            break;
                        }
                    }
                }
            }
        }