private void InitImportMovieOption()
        {
            ImportProgressVisibility = Visibility.Hidden;
            ImportProgressValue      = 0;
            ImportStatusMessage      = "";
            ImportButtonIsEnabled    = false;

            if (!string.IsNullOrEmpty(Sys.Settings.FF7Exe) & File.Exists(Sys.Settings.FF7Exe))
            {
                ImportButtonIsEnabled = !GameConverter.AllMovieFilesExist(Sys.Settings.MovieFolder);

                Dictionary <string, string[]> missingMovies = GameConverter.GetMissingMovieFiles(Sys.Settings.MovieFolder);

                if (missingMovies.Count > 0)
                {
                    List <string> discsToInsert = GetDiscsToInsertForMissingMovies(missingMovies);

                    ImportStatusMessage = string.Format(ResourceHelper.Get(StringKey.InsertAndClickImport), discsToInsert[0]);
                }
                else
                {
                    ImportStatusMessage = ResourceHelper.Get(StringKey.AllMovieFilesAlreadyImported);
                }
            }
            else
            {
                ImportStatusMessage = ResourceHelper.Get(StringKey.Ff7ExeNotFoundYouMayNeedToConfigure);
            }
        }
        private void InitImportMovieOption()
        {
            ImportProgressVisibility = Visibility.Hidden;
            ImportProgressValue      = 0;
            ImportStatusMessage      = "";
            ImportButtonIsEnabled    = !GameConverter.AllMovieFilesExist(Sys.Settings.MovieFolder);

            Dictionary <string, string[]> missingMovies = GameConverter.GetMissingMovieFiles(Sys.Settings.MovieFolder);

            if (missingMovies.Count > 0)
            {
                List <string> discsToInsert = GetDiscsToInsertForMissingMovies(missingMovies);

                ImportStatusMessage = $"Insert {discsToInsert[0]} and click 'Import'.";
            }
        }
        internal void ImportMissingMovies()
        {
            string warningMessage         = string.Format(ResourceHelper.Get(StringKey.ImportMissingMoviesWarningMessage), Sys.Settings.MovieFolder);
            MessageDialogViewModel result = MessageDialogWindow.Show(warningMessage, ResourceHelper.Get(StringKey.Warning), MessageBoxButton.YesNo, MessageBoxImage.Warning);

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

            ImportButtonIsEnabled    = false;
            ImportProgressVisibility = Visibility.Visible;

            bool cancelProcess = false;
            int  totalFiles    = 0;
            int  filesCopied   = 0;

            Task importTask = Task.Factory.StartNew(() =>
            {
                Dictionary <string, string[]> missingMovies = GameConverter.GetMissingMovieFiles(Sys.Settings.MovieFolder);
                List <string> discsToInsert = GetDiscsToInsertForMissingMovies(missingMovies);

                totalFiles = missingMovies.Count;

                foreach (string disc in discsToInsert)
                {
                    List <string> driveLetters;

                    do
                    {
                        SetImportStatus($"{ResourceHelper.Get(StringKey.LookingFor)} {disc} ...");
                        driveLetters = GameLauncher.GetDriveLetters(disc);

                        if (driveLetters.Count == 0)
                        {
                            SetImportStatus(string.Format(ResourceHelper.Get(StringKey.InsertToContinue), disc));

                            App.Current.Dispatcher.Invoke(() =>
                            {
                                string discNotFoundMessage = string.Format(ResourceHelper.Get(StringKey.PleaseInsertToContinueCopying), disc);
                                MessageDialogViewModel insertDiscResult = MessageDialogWindow.Show(discNotFoundMessage, ResourceHelper.Get(StringKey.InsertDisc), MessageBoxButton.OKCancel, MessageBoxImage.Warning);

                                cancelProcess = (insertDiscResult.Result == MessageBoxResult.Cancel);
                            });
                        }

                        if (cancelProcess)
                        {
                            return;
                        }
                    } while (driveLetters.Count == 0);

                    SetImportStatus($"{string.Format(ResourceHelper.Get(StringKey.FoundDiscAt), disc)} {string.Join("  ", driveLetters)} ...");

                    // loop over missing files on the found disc and copy to data/movies destination
                    foreach (string movieFile in missingMovies.Where(kv => kv.Value.Any(s => s.Equals(disc, StringComparison.InvariantCultureIgnoreCase)))
                             .Select(kv => kv.Key))
                    {
                        foreach (string drive in driveLetters)
                        {
                            string fullTargetPath = Path.Combine(Sys.Settings.MovieFolder, movieFile);
                            string sourceFilePath = Path.Combine(drive, "ff7", "movies", movieFile);

                            if (File.Exists(sourceFilePath))
                            {
                                if (File.Exists(fullTargetPath))
                                {
                                    SetImportStatus($"{ResourceHelper.Get(StringKey.Overwriting)} {movieFile} ...");
                                }
                                else
                                {
                                    SetImportStatus($"{ResourceHelper.Get(StringKey.Copying)} {movieFile} ...");
                                }

                                File.Copy(sourceFilePath, fullTargetPath, true);
                                filesCopied++;
                                UpdateImportProgress(filesCopied, totalFiles);
                                break;
                            }
                            else
                            {
                                SetImportStatus(string.Format(ResourceHelper.Get(StringKey.FailedToFindAt), movieFile, sourceFilePath));
                            }
                        }
                    }
                }
            });

            importTask.ContinueWith((taskResult) =>
            {
                if (taskResult.IsFaulted)
                {
                    Logger.Error(taskResult.Exception);
                    SetImportStatus($"{ResourceHelper.Get(StringKey.AnErrorOccurredCopyingMovies)}: {taskResult.Exception.GetBaseException().Message}");
                }
                else if (cancelProcess)
                {
                    InitImportMovieOption();
                }
                else
                {
                    if (filesCopied == totalFiles)
                    {
                        SetImportStatus(ResourceHelper.Get(StringKey.SuccessfullyCopiedMovies));
                    }
                    else
                    {
                        SetImportStatus(ResourceHelper.Get(StringKey.FinishedCopyingMoviesSomeFailed));
                    }

                    ImportButtonIsEnabled    = !GameConverter.AllMovieFilesExist(Sys.Settings.MovieFolder);
                    ImportProgressValue      = 0;
                    ImportProgressVisibility = Visibility.Hidden;
                }
            });
        }
        internal void ImportMissingMovies()
        {
            string warningMessage         = $"This will copy missing movie files from your game discs to your movie path in 'General Settings'.\n\nThis process will overwrite any movie files already in {Sys.Settings.MovieFolder}.\n\nDo you want to proceed?";
            MessageDialogViewModel result = MessageDialogWindow.Show(warningMessage, "Import Warning", MessageBoxButton.YesNo, MessageBoxImage.Warning);

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

            ImportButtonIsEnabled    = false;
            ImportProgressVisibility = Visibility.Visible;

            bool cancelProcess = false;
            int  totalFiles    = 0;
            int  filesCopied   = 0;

            Task importTask = Task.Factory.StartNew(() =>
            {
                Dictionary <string, string[]> missingMovies = GameConverter.GetMissingMovieFiles(Sys.Settings.MovieFolder);
                List <string> discsToInsert = GetDiscsToInsertForMissingMovies(missingMovies);

                totalFiles = missingMovies.Count;

                foreach (string disc in discsToInsert)
                {
                    List <string> driveLetters;

                    do
                    {
                        SetImportStatus($"Looking for {disc} ...");
                        driveLetters = GameLauncher.GetDriveLetters(disc);

                        if (driveLetters.Count == 0)
                        {
                            SetImportStatus($"Insert {disc} to continue.");

                            App.Current.Dispatcher.Invoke(() =>
                            {
                                string discNotFoundMessage = $"Please insert {disc} to continue copying missing movie files.\n\nClick 'Cancel' to stop the process.";
                                MessageDialogViewModel insertDiscResult = MessageDialogWindow.Show(discNotFoundMessage, "Insert Disc", MessageBoxButton.OKCancel, MessageBoxImage.Warning);

                                cancelProcess = (insertDiscResult.Result == MessageBoxResult.Cancel);
                            });
                        }

                        if (cancelProcess)
                        {
                            return;
                        }
                    } while (driveLetters.Count == 0);

                    SetImportStatus($"Found {disc} at {string.Join("  ", driveLetters)} ...");

                    // loop over missing files on the found disc and copy to data/movies destination
                    foreach (string movieFile in missingMovies.Where(kv => kv.Value.Any(s => s.Equals(disc, StringComparison.InvariantCultureIgnoreCase)))
                             .Select(kv => kv.Key))
                    {
                        foreach (string drive in driveLetters)
                        {
                            string fullTargetPath = Path.Combine(Sys.Settings.MovieFolder, movieFile);
                            string sourceFilePath = Path.Combine(drive, "ff7", "movies", movieFile);

                            if (File.Exists(sourceFilePath))
                            {
                                if (File.Exists(fullTargetPath))
                                {
                                    SetImportStatus($"Overwriting {movieFile} ...");
                                }
                                else
                                {
                                    SetImportStatus($"Copying {movieFile} ...");
                                }

                                File.Copy(sourceFilePath, fullTargetPath, true);
                                filesCopied++;
                                UpdateImportProgress(filesCopied, totalFiles);
                                break;
                            }
                            else
                            {
                                SetImportStatus($"Failed to find {movieFile} at {sourceFilePath}");
                            }
                        }
                    }
                }
            });

            importTask.ContinueWith((taskResult) =>
            {
                if (taskResult.IsFaulted)
                {
                    Logger.Error(taskResult.Exception);
                    SetImportStatus($"An error occurred while copying movies: {taskResult.Exception.GetBaseException().Message}");
                }
                else if (cancelProcess)
                {
                    InitImportMovieOption();
                }
                else
                {
                    if (filesCopied == totalFiles)
                    {
                        SetImportStatus("Successfully copied movies.");
                    }
                    else
                    {
                        SetImportStatus("Finished copying movies. Some movies failed to copy. Check app log for details.");
                    }

                    ImportButtonIsEnabled    = !GameConverter.AllMovieFilesExist(Sys.Settings.MovieFolder);
                    ImportProgressValue      = 0;
                    ImportProgressVisibility = Visibility.Hidden;
                }
            });
        }