/**
         *  The scanner read the QR-code and than searches the equipment.
         */
        public async Task ScanItemAsync()
        {
            try
            {
                IBarcodeScannerReport scanReport;
                using (CancellationTokenSource cancellationSource = new CancellationTokenSource())
                {
                    using (var dialog = UserDialogs.Instance.Loading("Scanning", () => cancellationSource.Cancel()))
                    {
                        sLogger.Scanning();
                        var scanner = await GetService <IBarcodeScannerService>().GetDefaultAsync();

                        scanReport = await scanner.ScanAsync(cancellationSource.Token);

                        dialog.Hide();
                        sLogger.ScanningCompleted();
                    }
                }

                if (scanReport != null)
                {
                    UserDialogs.Instance.Toast(scanReport.ScanDataLabel);

                    if (DevicesToInspect.Count != 0)
                    {
                        SelectedItem = DevicesToInspect.FirstOrDefault(x => x.Equipment.EquipmentIdentifications.Any(z => z.Value == scanReport.ScanDataLabel));

                        if (SelectedItem == null)
                        {
                            SelectedItem = DevicesInspected.FirstOrDefault(x => x.Equipment.EquipmentIdentifications.Any(z => z.Value == scanReport.ScanDataLabel));
                            if (SelectedItem != null)
                            {
                                var goDetail = await UserDialogs.Instance.ConfirmAsync("U hebt dit toestel al eens gecontroleerd wilt u de details bekijken?", "Detail toestel", "Ja", "Neen", null);

                                if (goDetail)
                                {
                                    await NavigateAsync();
                                }
                            }
                            else
                            {
                                UserDialogs.Instance.Alert("Dit toestel zit niet in deze controle ronde", "verkeerd toestel", "ok");
                            }
                        }
                        else
                        {
                            await NavigateAsync();
                        }
                    }
                }
            }
            catch (Exception e)
            {
                UserDialogs.Instance.Alert("Het scannen is niet gelukt", "scanner error", "ok");
                sLogger.ScanningFailed(e);
            }
        }
 /**
  * This method refresh the display list afther an equipment is checked.
  */
 private async Task RefreshOverviewAsync(InspectionItemModel device)
 {
     sLogger.RefreshingOverview();
     device.Equipment.DateVisualInspection = DateTime.Now;
     DevicesInspected.Add(device);
     DevicesToInspect.Remove(device);
     ControleProgress = Math.Round((double)(DevicesInspected.Count) / (double)(DevicesInspected.Count + DevicesToInspect.Count), 4);
     DisplayedDevices = new ObservableCollection <InspectionItemModel>(DevicesToInspect);
     TotalString      = DisplayedDevices.Count + "/" + (DevicesInspected.Count + DevicesToInspect.Count);
     await CheckEndControlAsync();
 }
        /**
         * In this method the equipment feedback is saved to the database.
         */
        private async Task SaveToDatabase(InspectionItemModel device, InspectionResult result, bool vera, ObservableCollection <MediaFile> photos, double?weight, int?FeedbackTypeId = null, string remarks = null)
        {
            try
            {
                sLogger.SavedFeedbackToDatabaseStarted();
                var equipmentFeedback = new InspectionEquipmentFeedbackRepresentationForCreation();
                equipmentFeedback.EquipmentId                  = SelectedItem.Equipment.EquipmentId;
                equipmentFeedback.Weight                       = weight;
                equipmentFeedback.Status                       = result.ToString();
                equipmentFeedback.FeedbackTypeId               = FeedbackTypeId;
                equipmentFeedback.Remark                       = remarks;
                equipmentFeedback.TimeCompleted                = DateTime.Now;
                equipmentFeedback.OperatorId                   = UserService.Operator.UserId;
                equipmentFeedback.EquipmentLocationName        = SelectedItem.Equipment.EquipmentLocation.Name;
                equipmentFeedback.EquipmentLocationDescription = SelectedItem.Equipment.EquipmentLocation.Description;
                equipmentFeedback.Vera = vera;
                var response = await Client.PostEnsureAsync("fire-safety/inspectionequipmentfeedback", equipmentFeedback);

                var href = response.Links.GetLink(WebApi.InspectionEquipmentFeedbacks.HypermediaLinks.Attachment);
                DevicesInspected.Where(x => x.Equipment.EquipmentId == device.Equipment.EquipmentId).SingleOrDefault().Equipment.LastFeedbackID = Int32.Parse(href.Href.Split('/')[4]);;
                sLogger.SavedFeedbackToDatabaseCompleted();
                if (photos != null)
                {
                    sLogger.SaveFeedbackPhotosToDatabaseStarted();
                    var config = new MapperConfiguration(cfg => { cfg.CreateMap <IFileInfo, InspectionEquipmentFeedbackAttachmentRepresentationForCreation>().ForMember(dest => dest.DateCreated, opt => opt.MapFrom(src => src.CreationTime)).ForMember(dest => dest.FileName, opt => opt.MapFrom(src => src.Name)).ForMember(dest => dest.Size, opt => opt.MapFrom(src => src.Length)); });
                    mapper = config.CreateMapper();
                    foreach (MediaFile photo in photos)
                    {
                        IFileInfo metaData           = GetService <IFileSystemService>().GetFileInfo(photo.Path);
                        var       attachment         = mapper.Map <InspectionEquipmentFeedbackAttachmentRepresentationForCreation>(metaData);
                        byte[]    bytes              = File.ReadAllBytes(photo.Path);
                        var       ms                 = photo.GetStream();
                        var       attachmentresponse = await Client.PostMultipartAsync(href.AsUri(), attachment, ms, CancellationToken.None);
                    }
                    sLogger.SaveFeedbackPhotosToDatabaseCompleted();
                }
            }
            catch (Exception e)
            {
                UserDialogs.Instance.Alert("Er is een probleem opgelopen tijdens het opslaan", "Save Error", "ok");
                sLogger.SavedFeedbackToDatabaseFailed(e);
            }
        }
        /**
         * In this method the user enter a code in and it searches the equipment
         */
        private async Task TypeItemAsync()
        {
            try
            {
                sLogger.SearchingEquipmentStared();
                var code = await UserDialogs.Instance.PromptAsync("", "", "zoeken", null, "Vul code in");

                if (code.Ok)
                {
                    if (DevicesToInspect.Count != 0)
                    {
                        SelectedItem = DevicesToInspect.FirstOrDefault(x => x.Equipment.EquipmentIdentifications.Any(z => z.Value == code.Text.ToUpper()));

                        if (SelectedItem == null)
                        {
                            SelectedItem = DevicesInspected.FirstOrDefault(x => x.Equipment.EquipmentIdentifications.Any(z => z.Value == code.Text.ToUpper()));
                            if (SelectedItem != null)
                            {
                                var goDetail = await UserDialogs.Instance.ConfirmAsync("U hebt dit toestel al eens gecontroleerd wilt u de details bekijken?", "Detail toestel", "Ja", "Neen", null);

                                if (goDetail)
                                {
                                    await NavigateAsync();
                                }
                            }
                            else
                            {
                                UserDialogs.Instance.Alert("Dit toestel zit niet in deze controle ronde", "verkeerd toestel", "ok");
                            }
                        }
                        else
                        {
                            await NavigateAsync();
                        }
                    }
                }
            }
            catch (Exception e)
            {
                sLogger.FailedToFindEquipment(e);
            }
        }
        /**
         * If the user press the stop icon this method is called to safe a summery to the database
         */
        public async Task InspectionStopedAsync()
        {
            try
            {
                Stop = DateTime.Now;
                var TotalInspected   = DevicesInspected.Count();
                var TotalApproved    = DevicesOk.Count();
                var TotalDisApproved = DevicesNotOk.Count();
                var remark           = await UserDialogs.Instance.PromptAsync("", "", "stoppen", null, "reden van afsluiten");

                sLogger.ControlRoundHasStopped(remark.Text);
                if (remark.Ok)
                {
                    var inspectionSummary = new InspectionSummaryRepresentationForCreation();
                    inspectionSummary.OperatorId         = UserService.Operator.UserId;
                    inspectionSummary.BackupOperatorId   = UserService.BackupOperator?.UserId;
                    inspectionSummary.OrganisationUnitId = OrganisationUnitId;
                    inspectionSummary.LocationId         = LocationId;
                    inspectionSummary.DateStarted        = Start;
                    inspectionSummary.DateFinished       = Stop;
                    inspectionSummary.Completed          = false;
                    inspectionSummary.TotalToInspect     = DevicesInspected.Count + DevicesToInspect.Count;
                    inspectionSummary.TotalInspected     = DevicesInspected.Count;
                    inspectionSummary.TotalApproved      = DevicesOk.Count;
                    inspectionSummary.TotalDisApproved   = DevicesNotOk.Count;
                    inspectionSummary.Remarks            = remark.Text;
                    var config = new MapperConfiguration(cfg => { cfg.CreateMap <EquipmentReportItemModel, EquipmentReportItemRepresentation>(); });
                    mapper = config.CreateMapper();
                    inspectionSummary.ReportItems = mapper.Map <List <EquipmentReportItemRepresentation> >(ReportItems);
                    inspectionSummary.PLG_Mail    = UserService.Operator.PLG_Mail;
                    var response = await Client.PostEnsureAsync("fire-safety/inspectionsummary", inspectionSummary);

                    DependencyService.Get <IApplicationService>().CloseApplication();
                }
            }catch (Exception e)
            {
                sLogger.SendStopSummeryFailed(e);
            }
        }
        /**
         * This method handle the message send from the ok page or not ok page
         */
        public async Task HandleAsync(InspectionCompleteMessage message, CancellationToken cancellationToken)
        {
            sLogger.FeedbackMessageSended();
            UserDialogs.Instance.ShowLoading("opslaan...");
            var device = DevicesToInspect.FirstOrDefault(x => x.Equipment.EquipmentId == message.EquipmentId);

            if (device == null)
            {
                device = DevicesInspected.FirstOrDefault(x => x.Equipment.EquipmentId == message.EquipmentId);
                if (device == null)
                {
                    await UserDialogs.Instance.AlertAsync("Dit toestel is niet gevonden", "save error", "ok");

                    return;
                }
                device.Equipment.DateVisualInspection = DateTime.Now;
                if (device.Status == StatusTypes.Ok)
                {
                    DevicesOk.Remove(device);
                    device.Color  = Color.Red;
                    device.Status = StatusTypes.Not_Ok;
                    DevicesNotOk.Add(device);
                    await UpdateToDatabase(device, message.Result, message.Vera, message.Photos, message.Weight, message.FeedbackType.FeedbackTypeId, message.Remarks);
                }
                else
                {
                    DevicesNotOk.Remove(device);
                    device.Status = StatusTypes.Ok;
                    device.Color  = Color.Green;
                    DevicesOk.Add(device);
                    await UpdateToDatabase(device, message.Result, message.Vera, message.Photos, message.Weight);
                }
                Filter();
            }
            else
            {
                if (message.Result == InspectionResult.Ok)
                {
                    device.Status = StatusTypes.Ok;
                    device.Color  = Color.Green;
                    DevicesOk.Add(device);
                    await RefreshOverviewAsync(device);
                    await SaveToDatabase(device, message.Result, message.Vera, message.Photos, message.Weight);
                }
                if (message.Result == InspectionResult.NotOk)
                {
                    device.Color  = Color.Red;
                    device.Status = StatusTypes.Not_Ok;
                    DevicesNotOk.Add(device);
                    var equipmentRaportItem = new EquipmentReportItemModel();
                    equipmentRaportItem.Equipment           = device.Equipment.EquipmentLocation.Name;
                    equipmentRaportItem.LocationDescription = device.Equipment.EquipmentLocation.Description;
                    equipmentRaportItem.QRCode   = device.Equipment.EquipmentIdentifications[0].Value;
                    equipmentRaportItem.FeedBack = message.FeedbackType.Description;
                    equipmentRaportItem.Remark   = message.Remarks;
                    equipmentRaportItem.Vera     = message.Vera;
                    ReportItems.Add(equipmentRaportItem);
                    await RefreshOverviewAsync(device);
                    await SaveToDatabase(device, message.Result, message.Vera, message.Photos, message.Weight, message.FeedbackType.FeedbackTypeId, message.Remarks);
                }
            }

            UserDialogs.Instance.HideLoading();
        }