public async Task RefreshFilms(string cinemaId) { var externalFilms = await _apiClient.GetFilmsForCinema(cinemaId); var localFilms = await GetLocalFilms(); var allFilms = await _apiClient.GetAllFilms(); await CheckForUnlimitedScreenings(); var isFirstRun = !localFilms.Any(); var existingLocalFilms = localFilms .Where(x => externalFilms.Any(y => y.FilmId == x.Code)) .ToList(); var localFilmsChanged = CorrectWeightingOfExistingFilms(existingLocalFilms, allFilms); var existingExternalFilms = externalFilms .Where(x => localFilms.Any(y => y.Code == x.FilmId)) .ToList(); var filmsToRemove = localFilms .Where(x => existingLocalFilms.All(y => y.Code != x.Code)) .ToList(); if (filmsToRemove.Any()) { RemoveFilms(localFilms, filmsToRemove); localFilmsChanged = true; } var addedExternalFilms = externalFilms .Except(existingExternalFilms) .ToList(); var addedLocalFilms = allFilms .Where(x => addedExternalFilms.Any(y => y.FilmId == x.Code)) .ToList(); if (addedExternalFilms.Any()) { if (!isFirstRun) { await _toastService.DisplayToasts(addedLocalFilms); } localFilms.AddRange(addedLocalFilms); localFilmsChanged = true; } if (localFilmsChanged) { localFilms = localFilms.OrderBy(x => x.Weight).ToList(); await WriteFilmsToFile(FilmCacheFile, localFilms); _filmCache.ClearCache(FilmCacheFile); } await WriteFilmsToFile(AllFilmCacheFile, allFilms); }