public static void InitializeOrUpdateDatabase(string databasePath,
                                                      InitializationStep steps,
                                                      CancellationToken cancellationToken,
                                                      IDbInitProgressHandler progressHandler)
        {
            using (var conn = new SQLiteConnection($"Data Source={databasePath}"))
            {
                conn.Open();

                int totalSteps = 0;

                foreach (InitializationStep step in Enum.GetValues(typeof(InitializationStep)))
                {
                    if (step != InitializationStep.All && steps.HasFlag(step))
                    {
                        totalSteps++;
                    }
                }

                progressHandler?.OnInitImportTask(totalSteps);

                if (steps.HasFlag(InitializationStep.LddPartsAndElements))
                {
                    var lddImporter = new LddDataImporter(conn, LDDEnvironment.Current, cancellationToken);
                    lddImporter.ProgressHandler = progressHandler;
                    lddImporter.ImportAllData();
                }

                if (cancellationToken.IsCancellationRequested)
                {
                    return;
                }

                if (steps.HasFlag(InitializationStep.RebrickableBaseData) ||
                    steps.HasFlag(InitializationStep.RebrickablePartsAndRelationships) ||
                    steps.HasFlag(InitializationStep.RebrickableSets) ||
                    steps.HasFlag(InitializationStep.RebrickableSetParts))
                {
                    var rbImporter = new RebrickableDataImporter(conn, LDDEnvironment.Current, cancellationToken);
                    rbImporter.ProgressHandler       = progressHandler;
                    rbImporter.InventoriesCsvFile    = @"C:\Users\JWTurner\Downloads\inventories.csv";
                    rbImporter.InventoryPartsCsvFile = @"C:\Users\JWTurner\Downloads\inventory_parts.csv";

                    if (steps.HasFlag(InitializationStep.RebrickableBaseData))
                    {
                        rbImporter.ImportBaseData();
                    }

                    if (cancellationToken.IsCancellationRequested)
                    {
                        return;
                    }

                    if (steps.HasFlag(InitializationStep.RebrickablePartsAndRelationships))
                    {
                        rbImporter.ImportPartsAndRelationships();
                    }

                    if (cancellationToken.IsCancellationRequested)
                    {
                        return;
                    }

                    if (steps.HasFlag(InitializationStep.RebrickableSets))
                    {
                        rbImporter.ImportSets();
                    }

                    if (cancellationToken.IsCancellationRequested)
                    {
                        return;
                    }

                    if (steps.HasFlag(InitializationStep.RebrickableSetParts))
                    {
                        rbImporter.ImportSetParts();
                    }
                }

                if (cancellationToken.IsCancellationRequested)
                {
                    return;
                }

                if (steps.HasFlag(InitializationStep.RebrickableLddMappings))
                {
                    InitializeDefaultMappings(databasePath, progressHandler);
                }
            }
        }
        public static void InitializeOrUpdateDatabase(string databasePath,
                                                      InitializationStep steps,
                                                      CancellationToken cancellationToken,
                                                      IDbInitProgressHandler progressHandler)
        {
            using (var conn = new SQLiteConnection($"Data Source={databasePath}"))
            {
                conn.Open();

                int totalSteps = 0;

                foreach (InitializationStep step in Enum.GetValues(typeof(InitializationStep)))
                {
                    if (step == InitializationStep.All ||
                        step == InitializationStep.RebrickableData ||
                        step == InitializationStep.RebrickablePartsAndRelationships)
                    {
                        continue;
                    }

                    if (steps.HasFlag(step))
                    {
                        totalSteps++;
                    }
                }

                progressHandler?.OnInitImportTask(totalSteps);

                if (steps.HasFlag(InitializationStep.LddPartsAndElements))
                {
                    var lddImporter = new LddDataImporter(conn, LDDEnvironment.Current, cancellationToken);
                    lddImporter.ProgressHandler = progressHandler;
                    lddImporter.ImportAllData();
                }

                if (cancellationToken.IsCancellationRequested)
                {
                    return;
                }

                if (steps.HasFlag(InitializationStep.RebrickableBaseData) ||
                    steps.HasFlag(InitializationStep.RebrickableParts) ||
                    steps.HasFlag(InitializationStep.RebrickablePartsAndRelationships) ||
                    steps.HasFlag(InitializationStep.RebrickableSets) ||
                    steps.HasFlag(InitializationStep.RebrickableSetParts))
                {
                    var rbImporter = new RebrickableDataImporter(conn, LDDEnvironment.Current, cancellationToken);
                    rbImporter.ProgressHandler   = progressHandler;
                    rbImporter.DownloadDirectory = Path.Combine(Settings.SettingsManager.AppDataFolder, "Downloads");

                    if (steps.HasFlag(InitializationStep.RebrickableBaseData))
                    {
                        rbImporter.ImportBaseData();
                    }

                    if (cancellationToken.IsCancellationRequested)
                    {
                        return;
                    }

                    if (steps.HasFlag(InitializationStep.RebrickableParts))
                    {
                        rbImporter.ImportRebrickableParts();
                    }

                    if (cancellationToken.IsCancellationRequested)
                    {
                        return;
                    }

                    if (steps.HasFlag(InitializationStep.RebrickablePartRelationships))
                    {
                        rbImporter.ImportRebrickableRelationships();
                    }

                    if (cancellationToken.IsCancellationRequested)
                    {
                        return;
                    }

                    if (steps.HasFlag(InitializationStep.RebrickableSets))
                    {
                        rbImporter.ImportSets();
                    }

                    if (cancellationToken.IsCancellationRequested)
                    {
                        return;
                    }

                    if (steps.HasFlag(InitializationStep.RebrickableSetParts))
                    {
                        rbImporter.ImportSetParts();
                    }
                }

                if (cancellationToken.IsCancellationRequested)
                {
                    return;
                }

                if (steps.HasFlag(InitializationStep.RebrickableLddMappings))
                {
                    InitializeDefaultMappings(databasePath, progressHandler);
                }
            }
        }