/// <summary>
 /// Constructor, initialize background worker evens and information about database
 /// </summary>
 public MainWindowsViewModel()
 {
     InstigateWorkCommand = new
                            RelayCommand(o => _worker.RunWorkerAsync(), o => !_worker.IsBusy);
     _worker                     = new BackgroundWorker();
     _worker.DoWork             += DoFillDataBaseWork;
     _worker.RunWorkerCompleted += EndFillDataBaseWork;
     _worker.ProgressChanged    += ProgressChanged;
     _dataBaseStartSize          = DataBaseAccessFactory.GetDataBaseOperationClass().GetDataBaseCount();
     DatabseCountValue           = $"{_dataBaseStartSize}\t {Math.Round((double)_dataBaseStartSize / (MaximumDocumentDatabaseSize/100), 2)}%";
 }
        /// <summary>
        /// Main funcion, draws document number from specified range, save them to local database
        /// </summary>
        /// <param name="minimumNumber"></param>
        /// <param name="biggestNumber"></param>
        /// <param name="fillSize"></param>
        /// <returns>Time in milisec that task endure</returns>
        public long FillDataTableRecursive(int minimumNumber = MaximumDocumentNumber,
                                           int biggestNumber = MaximumDocumentNumber, int fillSize = PackToSaveSize)
        {
            try
            {
                if (fillSize >= MaximumDocumentDatabaseSize || fillSize <= 0)
                {
                    throw new DocumentNumberGeneratorLogicException($"Range of documents can be from 0 to {MaximumDocumentNumber - MinimumDocumentNumber}");
                }
                var watch      = Stopwatch.StartNew();
                var maxNumbers = fillSize;
                var numbers    = new List <int>(maxNumbers);
                var r          = new Random();
                //count of document in database in processed range
                var allStuff = DataBaseAccessFactory.GetDataBaseOperationClass()
                               .GetDataBaseCount(minimumNumber, biggestNumber);
                //size of unique numbers in first half of processed range
                var firstPartStuff = DataBaseAccessFactory.GetDataBaseOperationClass()
                                     .GetDataBaseCount(minimumNumber, ((biggestNumber + minimumNumber) / 2));
                //size of unique numbers in second half of processed range
                var secondPartStuff = allStuff - firstPartStuff;
                if (fillSize > MaximumDocumentDatabaseSize - allStuff)
                {
                    throw new DocumentNumberGeneratorLogicException($"Number of documents can be saved is {MaximumDocumentDatabaseSize - allStuff}");
                }


                //if the range of possible use of the unique number is twice the amount
                //of numbers you want to generate this range can be divided into two,
                //choose a larger scope and cause recursive
                if ((((biggestNumber - minimumNumber) - allStuff) > 2 * fillSize))
                {
                    if (firstPartStuff > secondPartStuff)
                    {
                        return(FillDataTableRecursive((biggestNumber + minimumNumber) / 2, biggestNumber,
                                                      fillSize));
                    }
                    else
                    {
                        return(FillDataTableRecursive(minimumNumber, ((biggestNumber + minimumNumber) / 2),
                                                      fillSize));
                    }
                }


                //Start MAIN STUFF...
                //
                while (maxNumbers > 0)
                {
                    //We can change logic in this section, random pack of documents number trying to
                    //save in database by "INSERT OR IGNORE" statment, then we check how many document number wasnt saved
                    //and we proccess all logic in full range with number ot not inserted document number
                    //to change this, need to uncomment and we guarante to there is no document number in database
                    //and need to comment/remove code lines when we check how many document number didnt save
                    var testValue = r.Next(minimumNumber, biggestNumber);
                    if ((!numbers.Exists(number => number == testValue)))
                    {
                        //  && !DataBaseAccessFactory.GetDataBaseOperationClass()
                        // .GetDataDaseExistElement(testValue))
                        numbers.Add(testValue);
                    }

                    if ((numbers.Count >= PackToSaveSize) || (maxNumbers == numbers.Count))
                    {
                        var countInsertedValues =
                            DataBaseAccessFactory.GetDataBaseOperationClass().FillDataTable(numbers);
                        _dataBaseStartSize += countInsertedValues;
                        maxNumbers         -= countInsertedValues;
                        CurrentProgress    += (decimal)(100 * (countInsertedValues)) / _elementsToFill;
                        DatabseCountValue   = $"{_dataBaseStartSize}\t{Math.Round((double)(_dataBaseStartSize) / ((MaximumDocumentDatabaseSize) / 100), 2)}%";

                        numbers.Clear();
                        if (maxNumbers > 0)
                        {
                            FillDataTableRecursive(MinimumDocumentNumber, MaximumDocumentNumber, maxNumbers);
                            break;
                        }
                    }
                }
                watch.Stop();
                return(watch.ElapsedMilliseconds);
            }
            catch (DocumentNumberGeneratorLogicException ex)
            {
                throw new Exception($@"Some Exception error: {ex.Message}.");
            }
            catch (Exception ex)
            {
                throw new Exception($@"Some Exception error: {ex.Message}.");
            }
        }