/// <summary>
        ///     Start uploading and watching for new replays
        /// </summary>
        public void Start()
        {
            if (_initialized)
            {
                return;
            }

            _initialized = true;

            _bpHelperUploader = new BpHelperUploader(_restApi);
            _hotsApiUploader  = new HotsApiUploader();

            _analyzer = new Analyzer();
            _monitor  = new Monitor();

            var replays = ScanReplays();

            Files.AddRange(replays.OrderByDescending(l => l.Created));
            if (replays.Any())
            {
                Monitor.LatestReplayTime = replays.Max(l => l.Created);
            }
            _uploadStrategy   = App.CustomConfigurationSettings.UploadStrategy;
            _uploadToHotsApi  = UploadToHotsApi;
            _uploadToHotsweek = UploadToHotsweek;
            if (App.CustomConfigurationSettings.UploadStrategy == UploadStrategy.UploadAll)
            {
                replays.Where(x => x.NeedHotsApiUpdate()).Reverse().Map(x => _hotsApiProcessingQueue[x]   = ProcessingStatus.None);
                replays.Where(x => x.NeedHotsweekUpdate()).Reverse().Map(x => _hotsweekProcessingQueue[x] = ProcessingStatus.None);
            }

            _monitor.ReplayAdded += async(_, e) =>
            {
                await EnsureFileAvailable(e.Data, 3000);

                var replay = new ReplayFile(e.Data);
                Files.Insert(0, replay);

                _hotsApiProcessingQueue[replay]  = ProcessingStatus.None;
                _hotsweekProcessingQueue[replay] = ProcessingStatus.None;

                OnReplayFileStatusChanged(new EventArgs <ReplayFile>(replay));
                OnStatusChanged();
            };

            _monitor.Start();

            _analyzer.MinimumBuild = Const.ReplayMinimumBuild;
            Task.Run(UploadHotsApiLoop).Forget();
            Task.Run(UploadHotsweekLoop).Forget();
        }