Exemple #1
0
        private void btnProcent_Click(object sender, EventArgs e)
        {
            textBox1Focus();
            if (Prevzema)
            {
                return;
            }
            Prevzema = true;
            if (CurrSortiranje.Equals(Sortiranje.ProcentOpagjacki))
            {
                pbProcent.Image = Resources.LightArrowUp;
                CurrSortiranje  = Sortiranje.ProcentRastecki;
            }
            else
            {
                pbProcent.Image = Resources.LightArrowDown;
                pbStara.Image   = Resources.DarkArrowDown;
                pbNova.Image    = Resources.DarkArrowDown;
                pbIme.Image     = Resources.DarkArrowDown;
                CurrSortiranje  = Sortiranje.ProcentOpagjacki;
            }
            Thread oThread = new Thread(new ThreadStart(PrevzemiStavki));

            oThread.Start();
            LoadingSemaphore.Release();
        }
Exemple #2
0
        /// <summary>
        /// Search movies asynchronously
        /// </summary>
        public override async Task LoadMoviesAsync(bool reset = false)
        {
            await LoadingSemaphore.WaitAsync(CancellationLoadingMovies.Token);

            StopLoadingMovies();
            if (reset)
            {
                Movies.Clear();
                Page           = 0;
                VerticalScroll = 0d;
            }

            var watch = Stopwatch.StartNew();

            Page++;
            if (Page > 1 && Movies.Count == MaxNumberOfMovies)
            {
                Page--;
                LoadingSemaphore.Release();
                return;
            }

            Logger.Info(
                $"Loading search page {Page} with criteria: {SearchFilter}");
            HasLoadingFailed = false;
            try
            {
                IsLoadingMovies = true;
                var result =
                    await MovieService.SearchMoviesAsync(SearchFilter,
                                                         Page,
                                                         MaxMoviesPerPage,
                                                         Genre,
                                                         Rating,
                                                         CancellationLoadingMovies.Token);

                Movies.AddRange(result.movies.Except(Movies, new MovieLightComparer()));
                IsLoadingMovies       = false;
                IsMovieFound          = Movies.Any();
                CurrentNumberOfMovies = Movies.Count;
                MaxNumberOfMovies     = result.nbMovies;
                UserService.SyncMovieHistory(Movies);
            }
            catch (Exception exception)
            {
                Page--;
                Logger.Error(
                    $"Error while loading search page {Page} with criteria {SearchFilter}: {exception.Message}");
                HasLoadingFailed = true;
                Messenger.Default.Send(new ManageExceptionMessage(exception));
            }
            finally
            {
                watch.Stop();
                var elapsedMs = watch.ElapsedMilliseconds;
                Logger.Info(
                    $"Loaded search page {Page} with criteria {SearchFilter} in {elapsedMs} milliseconds.");
                LoadingSemaphore.Release();
            }
        }
Exemple #3
0
        private void LoadLogo()
        {
            // Доколку нема линк постави ја предодредената слика
            if (Restoran.LogoUrl == null)
            {
                return;
            }
            Image img;

            try
            {
                // Пробај да ја вчиташ сликата
                img = ImageFromURL(Restoran.LogoUrl);

                // Забелешка: Вчитување со посебен метод за да се земе Image објект. Можно е и директно во PictureBox
                // но така не е можно да се обезбеди паралелизам, а да не се примети кочење, бидејќи самите контроли
                // синхронизираат и не дозволуваат во исто време две нишки да прават измени.
            }
            catch (Exception)
            {
                // Доколку не може да се вчита постави предодредена слика
                img = Resources.FASAP_LOGO;
            }

            // Чекај додека не заврши почетното исцртување на формата (важно за да не се приметува сецкање при појавувањето на формата)
            LoadingSemaphore.WaitOne();

            // Постави ја сликата на pictureBoxLogo
            SetPbDefaultLogo(pictureBoxLogo, img);
        }
Exemple #4
0
        public void PostaviNarackiPorast()
        {
            string sql = @"with t as (select r.restoran_id, r.ime_restoran, pret.pret_mesec, tek.tek_mesec, tek.tek_mesec / pret.pret_mesec as koef
		                               from restoran r left outer join
				                            (select r.restoran_id, r.ime_restoran, count(*) as tek_mesec
				                             from narachka n, restoran r
				                             where n.restoran_id = r.restoran_id and to_char(n.vreme, 'mm.yyyy') like to_char(sysdate, 'mm.yyyy')
				                             group by r.restoran_id, r.ime_restoran) tek on r.ime_restoran = tek.ime_restoran 
				                            left outer join
				                             (select r.restoran_id, r.ime_restoran, count(*) as pret_mesec
				                              from narachka n, restoran r
				                              where n.restoran_id = r.restoran_id and to_char(n.vreme, 'mm.yyyy') like to_char( add_months(sysdate, -1), 'mm.yyyy')
				                              group by r.restoran_id, r.ime_restoran) pret on tek.ime_restoran = pret.ime_restoran
		                              )
                            select Претходен_месец, Тековен_месец, Пораст
                            from
	                            ((select t.restoran_id, t.ime_restoran as Ресторан, NVL(t.pret_mesec, 0) || ' нарачки' as Претходен_месец, NVL(t.tek_mesec, 0) || ' нарачки' as Тековен_месец, round((koef - 1) * 100, 1) || '%' as Пораст
	                            from t
	                            where t.koef <= 1 or t.koef is null)
	                            union
	                            (select t.restoran_id, t.ime_restoran as Ресторан, NVL(t.pret_mesec, 0) || ' нарачки' as Претходен_месец, NVL(t.tek_mesec, 0) || ' нарачки' as Тековен_месец, round(koef * 100, 1) || '%' as Пораст
	                            from t
	                            where t.koef > 1 or t.koef is null)) tmp
                            where restoran_id = :RES_ID";

            OracleCommand cmd = new OracleCommand(sql, Conn);

            OracleParameter prm = new OracleParameter("RES_ID", OracleDbType.Int32);

            prm.Value = Restoran.RestoranID;
            cmd.Parameters.Add(prm);

            cmd.CommandType = CommandType.Text;
            string predhoden = null;
            string tekoven   = null;
            string procent   = null;

            try
            {
                OracleDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    predhoden = dr.GetString(0);
                    tekoven   = dr.GetString(1);
                    procent   = dr.GetString(2);
                    break;
                }
            }
            catch (Exception)
            {
                SetText(lblErrorMessage, "Имате проблем со поврзување на конекцијата");
                SetVisible(lblErrorMessage, true);
            }

            LoadingSemaphore.WaitOne();
            SetObject(lblPredhoden, predhoden);
            SetObject(lblTekoven, tekoven);
            SetObject(lblProcent, procent);
        }
Exemple #5
0
        private void buttonFASAP1_Click(object sender, EventArgs e)
        {
            buttonFASAP1.Enabled = false;
            Thread oThread = new Thread(new ThreadStart(KreirajMeni));

            oThread.Start();
            indMeni = 0;
            LoadingSemaphore.Release();
            buttonFASAP1.Enabled = true;
        }
Exemple #6
0
        public void PostaviDatum()
        {
            if (!ValidateChildren() || Postavuva)
            {
                return;
            }
            Postavuva       = true;
            pbProcent.Image = Resources.LightArrowDown;
            pbRegion.Image  = Resources.DarkArrowDown;
            Thread oThread = new Thread(new ThreadStart(PrevzemiPodatociZaRegioni));

            oThread.Start();
            LoadingSemaphore.Release();
        }
Exemple #7
0
        public void PostaviNajverenKlient()
        {
            string        sql = @"SELECT *
                        FROM (
                        SELECT ONL.IME_KLIENT AS IME, ONL.PREZIME_KLIENT AS PREZIME, ONL.ADRESA_ZA_DOSTAVA AS ADRESA, SUM(VKUPNA_CENA) AS SUMA
                        FROM RESTORAN RES JOIN NARACHKA NAR ON RES.RESTORAN_ID = NAR.RESTORAN_ID
                        JOIN ONLINE_NARACHKA ONL ON NAR.RESTORAN_ID = ONL.RESTORAN_ID AND NAR.NARACHKA_ID = ONL.NARACHKA_ID
                        WHERE RES.RESTORAN_ID = :RES_ID
                        GROUP BY (RES.RESTORAN_ID, ONL.ADRESA_ZA_DOSTAVA, ONL.IME_KLIENT, ONL.PREZIME_KLIENT)
                        ORDER BY SUM(VKUPNA_CENA) DESC
                        )";
            OracleCommand cmd = new OracleCommand(sql, Conn);

            OracleParameter prm = new OracleParameter("RES_ID", OracleDbType.Int64);

            prm.Value = Restoran.RestoranID;
            cmd.Parameters.Add(prm);

            cmd.CommandType = CommandType.Text;
            string ime     = null;
            string prezime = null;
            string suma    = null;
            string adresa  = null;

            try
            {
                OracleDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    ime     = dr.GetString(0);
                    prezime = dr.GetString(1);
                    suma    = dr.GetInt32(3).ToString();
                    adresa  = dr.GetString(2).ToString();
                    break;
                }
            }
            catch (Exception)
            {
                SetText(lblErrorMessage, "Имате проблем со поврзување на конекцијата");
                SetVisible(lblErrorMessage, true);
            }
            LoadingSemaphore.WaitOne();
            SetObject(lblIme, ime);
            SetObject(lblPrezime, prezime);
            SetObject(lblSuma, suma);
            SetObject(lblAdresa, adresa);
        }
Exemple #8
0
        /// <summary>
        /// Search shows asynchronously
        /// </summary>
        public override async Task LoadShowsAsync(bool reset = false)
        {
            await LoadingSemaphore.WaitAsync(CancellationLoadingShows.Token);

            await Task.Run(async() =>
            {
                StopLoadingShows();
                if (reset)
                {
                    DispatcherHelper.CheckBeginInvokeOnUI(() =>
                    {
                        Shows.Clear();
                        Page           = 0;
                        VerticalScroll = 0d;
                    });
                }

                var watch = Stopwatch.StartNew();
                Page++;
                if (Page > 1 && Shows.Count == MaxNumberOfShows)
                {
                    Page--;
                    LoadingSemaphore.Release();
                    return;
                }

                Logger.Info(
                    $"Loading search page {Page} with criteria: {SearchFilter}");
                HasLoadingFailed = false;
                try
                {
                    IsLoadingShows = true;
                    var result     =
                        await ShowService.SearchShowsAsync(SearchFilter,
                                                           Page,
                                                           MaxNumberOfShows,
                                                           Genre,
                                                           Rating * 10,
                                                           CancellationLoadingShows.Token);

                    DispatcherHelper.CheckBeginInvokeOnUI(() =>
                    {
                        Shows.AddRange(result.shows.Except(Shows, new ShowLightComparer()));
                        IsLoadingShows       = false;
                        IsShowFound          = Shows.Any();
                        CurrentNumberOfShows = Shows.Count;
                        MaxNumberOfShows     = result.nbShows;
                        UserService.SyncShowHistory(Shows);
                    });
                }
                catch (Exception exception)
                {
                    Page--;
                    Logger.Error(
                        $"Error while loading search page {Page} with criteria {SearchFilter}: {exception.Message}");
                    HasLoadingFailed = true;
                    Messenger.Default.Send(new ManageExceptionMessage(exception));
                }
                finally
                {
                    watch.Stop();
                    var elapsedMs = watch.ElapsedMilliseconds;
                    Logger.Info(
                        $"Loaded search page {Page} with criteria {SearchFilter} in {elapsedMs} milliseconds.");
                    LoadingSemaphore.Release();
                }
            });
        }
Exemple #9
0
        private void SocuvajPromeni()
        {
            if (!ValidateChildren())
            {
                timer1.Stop();
                ButtonFasapSetText(lblErrorMessage, "Лошо внесени податоци, промените се одбиени");
                ButtonFasapSetVisible(lblErrorMessage, true);
                timer1.Start();
                IsChanged = false;
                return;
            }
            if (SelectedComponent != null)
            {
                try
                {
                    SelectedComponent.SqlDelete(Conn, Restoran.RestoranID);
                }
                catch (Exception ex)
                {
                    timer1.Stop();
                    ButtonFasapSetText(lblErrorMessage, ex.Message);
                    ButtonFasapSetVisible(lblErrorMessage, true);
                    timer1.Start();
                    return;
                }
                if (IsDecorator)
                {
                    Dodatok dodatok = new Dodatok((SelectedComponent as Stavka).ID, tbIme.Text, int.Parse(tbCena.Text), tbOpis.Text);
                    dodatok.Parent    = SelectedComponent.Parent;
                    SelectedComponent = dodatok;
                }
                else
                {
                    Stavka dodatok = new Stavka((SelectedComponent as Stavka).ID, tbIme.Text, int.Parse(tbCena.Text), tbOpis.Text);
                    dodatok.Parent    = SelectedComponent.Parent;
                    SelectedComponent = dodatok;
                }

                try
                {
                    SelectedComponent.SqlInsert(Conn, Restoran.RestoranID);
                    IsChanged = false;
                    Thread oThread = new Thread(new ThreadStart(KreirajMeni));
                    oThread.Start();
                    LoadingSemaphore.Release();
                }
                catch (Exception ex)
                {
                    timer1.Stop();
                    ButtonFasapSetText(lblErrorMessage, ex.Message);
                    ButtonFasapSetVisible(lblErrorMessage, true);
                    timer1.Start();
                }
            }
            else
            {
                if (DodadiStavka)
                {
                    MenuComponent mc;
                    if (IsDecorator)
                    {
                        mc = new Dodatok(-1, tbIme.Text, int.Parse(tbCena.Text), tbOpis.Text);
                    }
                    else
                    {
                        mc = new Stavka(-1, tbIme.Text, int.Parse(tbCena.Text), tbOpis.Text);
                    }
                    mc.Parent = CurrMenu;
                    try
                    {
                        mc.SqlInsert(Conn, Restoran.RestoranID);
                        IsChanged = false;
                        Thread oThread = new Thread(new ThreadStart(KreirajMeni));
                        oThread.Start();
                        LoadingSemaphore.Release();
                        tbIme.Visible      = false;
                        lblIme.Visible     = false;
                        lblOpis.Visible    = false;
                        tbOpis.Visible     = false;
                        lblDodatok.Visible = false;
                        btnDodatok.Visible = false;
                        lblCena.Visible    = false;
                        tbCena.Visible     = false;
                    }
                    catch (DuplicatePrimaryKeyException ex)
                    {
                        MessageBoxForm mf = new MessageBoxForm(ex.Message, false);
                        if (mf.ShowDialog() == DialogResult.Yes)
                        {
                            tbIme.Text = "";
                        }
                        else
                        {
                            tbIme.Visible      = false;
                            lblIme.Visible     = false;
                            lblOpis.Visible    = false;
                            tbOpis.Visible     = false;
                            lblDodatok.Visible = false;
                            btnDodatok.Visible = false;
                            lblCena.Visible    = false;
                            tbCena.Visible     = false;
                            IsChanged          = false;
                            SelectedComponent  = null;
                        }
                    }
                    catch (Exception ex)
                    {
                        timer1.Stop();
                        ButtonFasapSetText(lblErrorMessage, ex.Message);
                        ButtonFasapSetVisible(lblErrorMessage, true);
                        timer1.Start();
                    }
                }
                else
                {
                    MenuComponent mc = new Meni(tbIme.Text);
                    mc.Parent = CurrMenu;
                    try
                    {
                        mc.SqlInsert(Conn, Restoran.RestoranID);
                        IsChanged = false;
                        Thread oThread = new Thread(new ThreadStart(KreirajMeni));
                        oThread.Start();
                        LoadingSemaphore.Release();
                        tbIme.Visible  = false;
                        lblIme.Visible = false;
                    }
                    catch (DuplicatePrimaryKeyException ex)
                    {
                        MessageBoxForm mf = new MessageBoxForm(ex.Message, false);
                        if (mf.ShowDialog() == DialogResult.Yes)
                        {
                            tbIme.Text = "";
                        }
                        else
                        {
                            tbIme.Visible     = false;
                            lblIme.Visible    = false;
                            IsChanged         = false;
                            SelectedComponent = null;
                        }
                    }
                    catch (Exception ex)
                    {
                        timer1.Stop();
                        ButtonFasapSetText(lblErrorMessage, ex.Message);
                        ButtonFasapSetVisible(lblErrorMessage, true);
                        timer1.Start();
                    }
                }
            }
        }
        /// <summary>
        /// Load movies asynchronously
        /// </summary>
        public override async Task LoadMoviesAsync(bool reset = false)
        {
            await LoadingSemaphore.WaitAsync(CancellationLoadingMovies.Token);

            if (reset)
            {
                Movies.Clear();
                Page           = 0;
                VerticalScroll = 0d;
            }

            var watch = Stopwatch.StartNew();

            Page++;
            if (Page > 1 && Movies.Count == MaxNumberOfMovies)
            {
                Page--;
                LoadingSemaphore.Release();
                return;
            }

            StopLoadingMovies();
            Logger.Info(
                $"Loading page {Page}...");
            HasLoadingFailed = false;
            try
            {
                IsLoadingMovies = true;
                await Task.Run(async() =>
                {
                    var getMoviesWatcher = new Stopwatch();
                    getMoviesWatcher.Start();
                    var seen      = UserService.GetSeenMovies(Page);
                    var favorites = UserService.GetFavoritesMovies(Page);
                    var movies    = seen.allMovies.Union(favorites.allMovies).Distinct().ToList();
                    var result    = await MovieService
                                    .GetSimilarAsync(Page, Utils.Constants.MaxMoviesPerPage, movies,
                                                     CancellationLoadingMovies.Token).ConfigureAwait(false);
                    getMoviesWatcher.Stop();
                    var getMoviesEllapsedTime = getMoviesWatcher.ElapsedMilliseconds;
                    if (reset && getMoviesEllapsedTime < 500)
                    {
                        // Wait for VerticalOffset to reach 0 (animation lasts 500ms)
                        await Task.Delay(500 - (int)getMoviesEllapsedTime, CancellationLoadingMovies.Token).ConfigureAwait(false);
                    }

                    DispatcherHelper.CheckBeginInvokeOnUI(() =>
                    {
                        Movies.AddRange(result.movies.Except(Movies, new MovieLightComparer()));
                        IsLoadingMovies       = false;
                        IsMovieFound          = Movies.Any();
                        CurrentNumberOfMovies = Movies.Count;
                        MaxNumberOfMovies     = result.nbMovies == 0 ? Movies.Count : result.nbMovies;
                        UserService.SyncMovieHistory(Movies);
                    });
                }, CancellationLoadingMovies.Token).ConfigureAwait(false);
            }
            catch (Exception exception)
            {
                Page--;
                Logger.Error(
                    $"Error while loading page {Page}: {exception.Message}");
                HasLoadingFailed = true;
                Messenger.Default.Send(new ManageExceptionMessage(exception));
            }
            finally
            {
                watch.Stop();
                var elapsedMs = watch.ElapsedMilliseconds;
                Logger.Info(
                    $"Loaded page {Page} in {elapsedMs} milliseconds.");
                LoadingSemaphore.Release();
            }
        }
        /// <summary>
        /// Load movies asynchronously
        /// </summary>
        public override async Task LoadMoviesAsync(bool reset = false)
        {
            await LoadingSemaphore.WaitAsync();

            StopLoadingMovies();
            if (reset)
            {
                Movies.Clear();
                Page = 0;
            }

            var watch = Stopwatch.StartNew();

            Page++;
            if (Page > 1 && Movies.Count == MaxNumberOfMovies)
            {
                Page--;
                LoadingSemaphore.Release();
                return;
            }

            Logger.Info(
                $"Loading movies seen page {Page}...");
            HasLoadingFailed = false;
            try
            {
                IsLoadingMovies = true;
                var imdbIds =
                    await UserService.GetSeenMovies(Page);

                if (!_needSync)
                {
                    var movies = new List <MovieJson>();
                    await imdbIds.movies.ParallelForEachAsync(async imdbId =>
                    {
                        var movie = await MovieService.GetMovieAsync(imdbId);
                        if (movie != null)
                        {
                            movie.IsFavorite = true;
                            movies.Add(movie);
                        }
                    });

                    var updatedMovies = movies.OrderBy(a => a.Title)
                                        .Where(a => (Genre != null
                                        ? a.Genres.Any(
                                                         genre => genre.ToLowerInvariant() ==
                                                         Genre.EnglishName.ToLowerInvariant())
                                        : a.Genres.TrueForAll(b => true)) && a.Rating >= Rating);
                    Movies.AddRange(updatedMovies.Except(Movies.ToList(), new MovieComparer()));
                }
                else
                {
                    var moviesToDelete = Movies.Select(a => a.ImdbCode).Except(imdbIds.allMovies);
                    var moviesToAdd    = imdbIds.allMovies.Except(Movies.Select(a => a.ImdbCode));
                    foreach (var movie in moviesToDelete.ToList())
                    {
                        Movies.Remove(Movies.FirstOrDefault(a => a.ImdbCode == movie));
                    }

                    var movies = moviesToAdd.ToList();
                    await movies.ParallelForEachAsync(async imdbId =>
                    {
                        var movie = await MovieService.GetMovieAsync(imdbId);
                        if ((Genre != null
                                    ? movie.Genres.Any(
                                 genre => genre.ToLowerInvariant() ==
                                 Genre.EnglishName.ToLowerInvariant())
                                    : movie.Genres.TrueForAll(b => true)) && movie.Rating >= Rating)
                        {
                            DispatcherHelper.CheckBeginInvokeOnUI(() =>
                            {
                                Movies.Add(movie);
                            });
                        }
                    });
                }

                IsLoadingMovies       = false;
                IsMovieFound          = Movies.Any();
                CurrentNumberOfMovies = Movies.Count;
                MaxNumberOfMovies     = imdbIds.nbMovies;
                await UserService.SyncMovieHistoryAsync(Movies);
            }
            catch (Exception exception)
            {
                Page--;
                Logger.Error(
                    $"Error while loading movies seen page {Page}: {exception.Message}");
                HasLoadingFailed = true;
                Messenger.Default.Send(new ManageExceptionMessage(exception));
            }
            finally
            {
                Movies.Sort((a, b) => String.Compare(a.Title, b.Title, StringComparison.Ordinal));
                _needSync = false;
                watch.Stop();
                var elapsedMs = watch.ElapsedMilliseconds;
                Logger.Info(
                    $"Loaded movies seen page {Page} in {elapsedMs} milliseconds.");
                LoadingSemaphore.Release();
            }
        }
Exemple #12
0
 public override void LoadingMethod()
 {
     LoadingSemaphore.Release(2);
 }
        /// <summary>
        /// Load movies asynchronously
        /// </summary>
        public override async Task LoadShowsAsync(bool reset = false)
        {
            await LoadingSemaphore.WaitAsync();

            StopLoadingShows();
            if (reset)
            {
                Shows.Clear();
                Page = 0;
            }

            var watch = Stopwatch.StartNew();

            Page++;
            if (Page > 1 && Shows.Count == MaxNumberOfShows)
            {
                Page--;
                LoadingSemaphore.Release();
                return;
            }

            Logger.Info(
                $"Loading shows favorite page {Page}...");
            HasLoadingFailed = false;
            try
            {
                IsLoadingShows = true;
                var imdbIds =
                    await UserService.GetFavoritesShows(Page);

                if (!_needSync)
                {
                    var shows = new List <ShowJson>();
                    await imdbIds.shows.ParallelForEachAsync(async imdbId =>
                    {
                        var show = await ShowService.GetShowAsync(imdbId);
                        if (show != null)
                        {
                            show.IsFavorite = true;
                            shows.Add(show);
                        }
                    });

                    var updatedShows = shows.OrderBy(a => a.Title)
                                       .Where(a => (Genre != null
                                        ? a.Genres.Any(
                                                        genre => genre.ToLowerInvariant() ==
                                                        Genre.EnglishName.ToLowerInvariant())
                                        : a.Genres.TrueForAll(b => true)) && a.Rating.Percentage >= Rating * 10);
                    Shows.AddRange(updatedShows.Except(Shows.ToList(), new ShowComparer()));
                }
                else
                {
                    var showsToDelete = Shows.Select(a => a.ImdbId).Except(imdbIds.allShows);
                    var showsToAdd    = imdbIds.allShows.Except(Shows.Select(a => a.ImdbId));
                    foreach (var movie in showsToDelete.ToList())
                    {
                        Shows.Remove(Shows.FirstOrDefault(a => a.ImdbId == movie));
                    }

                    var shows = showsToAdd.ToList();
                    await shows.ParallelForEachAsync(async imdbId =>
                    {
                        var show = await ShowService.GetShowAsync(imdbId);
                        if ((Genre != null
                                    ? show.Genres.Any(
                                 genre => genre.ToLowerInvariant() ==
                                 Genre.EnglishName.ToLowerInvariant())
                                    : show.Genres.TrueForAll(b => true)) && show.Rating.Percentage >= Rating * 10)
                        {
                            DispatcherHelper.CheckBeginInvokeOnUI(() =>
                            {
                                Shows.Add(show);
                            });
                        }
                    });
                }

                IsLoadingShows       = false;
                IsShowFound          = Shows.Any();
                CurrentNumberOfShows = Shows.Count;
                MaxNumberOfShows     = imdbIds.nbShows;
                await UserService.SyncShowHistoryAsync(Shows);
            }
            catch (Exception exception)
            {
                Page--;
                Logger.Error(
                    $"Error while loading shows favorite page {Page}: {exception.Message}");
                HasLoadingFailed = true;
                Messenger.Default.Send(new ManageExceptionMessage(exception));
            }
            finally
            {
                Shows.Sort((a, b) => String.Compare(a.Title, b.Title, StringComparison.Ordinal));
                _needSync = false;
                watch.Stop();
                var elapsedMs = watch.ElapsedMilliseconds;
                Logger.Info(
                    $"Loaded shows favorite page {Page} in {elapsedMs} milliseconds.");
                LoadingSemaphore.Release();
            }
        }
Exemple #14
0
        public void PrevzemiPodatociZaRegioni()
        {
            DateTime Od  = DateTime.ParseExact(tbDatumOd.Text + " 00:00", "dd.MM.yyyy HH:mm", CultureInfo.InvariantCulture);
            DateTime Do  = DateTime.ParseExact(tbDatumDo.Text + " 23:59", "dd.MM.yyyy HH:mm", CultureInfo.InvariantCulture);
            string   sql = @"select 
	                        r.region, 
	                        NVL(period_rg.period, 0) as BROJ_NARACHKI, ROUND(nvl(period_rg.period/period_vk.period * 100, 0), 2) AS PROCENT
                        from
	                        (
		                        select distinct SUBSTR(adresa_za_dostava, 1, INSTR(adresa_za_dostava,'""', 1, 1) - 2) AS REGION
		                        from online_narachka
		                        where restoran_id = :RES_ID and adresa_za_dostava is not null
	                        ) r
	                        natural left outer join
	                        (
		                        select count(*) as period
		                        from
		                        (
			                        select narachka_id
			                        from online_narachka
			                        where restoran_id = :RES_ID1 and adresa_za_dostava is not null
		                        ) n
		                        natural join
		                        (
			                        select narachka_id
			                        from narachka
			                        where restoran_id = :RES_ID2 AND vreme >= :DatumOd AND vreme <= :DatumDo
		                        ) o
	                        ) period_vk
	                        left outer join
	                        (
		                        select n.region, count(*) as period
		                        from
		                        (
			                        select narachka_id, SUBSTR(adresa_za_dostava, 1, INSTR(adresa_za_dostava,'""', 1, 1) - 2) AS REGION
			                        from online_narachka
                                                where restoran_id = :RES_ID3 and adresa_za_dostava is not null
		                        ) n
		                        natural join
		                        (
			                        select narachka_id
			                        from narachka
			                        where restoran_id = :RES_ID4 AND vreme >= :Od AND vreme <= :Do
		                        ) o
		                        group by n.region
	                        ) period_rg on period_rg.region = r.region
                        order by ROUND(nvl(period_rg.period/period_vk.period * 100, 0), 2) desc, r.region asc";

            OracleCommand cmd = new OracleCommand(sql, Conn);

            OracleParameter prm = new OracleParameter("RES_ID", OracleDbType.Int32);

            prm.Value = Restoran.RestoranID;
            cmd.Parameters.Add(prm);

            prm       = new OracleParameter("RES_ID1", OracleDbType.Int32);
            prm.Value = Restoran.RestoranID;
            cmd.Parameters.Add(prm);

            prm       = new OracleParameter("RES_ID2", OracleDbType.Int32);
            prm.Value = Restoran.RestoranID;
            cmd.Parameters.Add(prm);

            prm       = new OracleParameter("DatumOd", OracleDbType.Date);
            prm.Value = Od;
            cmd.Parameters.Add(prm);

            prm       = new OracleParameter("DatumDo", OracleDbType.Date);
            prm.Value = Do;
            cmd.Parameters.Add(prm);

            prm       = new OracleParameter("RES_ID3", OracleDbType.Int32);
            prm.Value = Restoran.RestoranID;
            cmd.Parameters.Add(prm);

            prm       = new OracleParameter("RES_ID4", OracleDbType.Int32);
            prm.Value = Restoran.RestoranID;
            cmd.Parameters.Add(prm);

            prm       = new OracleParameter("Od", OracleDbType.Date);
            prm.Value = Od;
            cmd.Parameters.Add(prm);

            prm       = new OracleParameter("Do", OracleDbType.Date);
            prm.Value = Do;
            cmd.Parameters.Add(prm);

            Regioni = new List <Naracki.Region>();
            try
            {
                cmd.CommandType = CommandType.Text;
                OracleDataReader dr = cmd.ExecuteReader();

                while (dr.Read())
                {
                    Naracki.Region reg = new Naracki.Region(dr.GetString(0), dr.GetInt32(1), dr.GetDecimal(2));
                    Regioni.Add(reg);
                }
            }
            catch (Exception ex)
            {
                SetText(lblErrorMessage, "Имате проблем со поврзување на конекцијата");
                SetVisible(lblErrorMessage, true);
            }
            LoadingSemaphore.WaitOne();
            PostaviRegioni();
        }
Exemple #15
0
        public void PrevzemiStavki()
        {
            string sql = @"SELECT A.IME_STAVKA AS STAVKA, A.CENA_STAVKA || ' ден.' AS CENA, NVL(A.PROSEK, 0) || ' ком/ден' AS NOV, NVL(B.PROSEK, 0) || ' ком/ден' AS STAR, ROUND((A.PROSEK - B.PROSEK)*100/B.PROSEK, 2) || '%' AS PROCENT_NA_PORAST
                            FROM
	                            (
	                            SELECT S.IME_MENI, S.IME_STAVKA, S.OPIS_STAVKA, S.CENA_STAVKA, VALIDNOST_STAVKA, ROUND(SUM(V.KOLICHINA_STAVKA) / TO_NUMBER(MAX(N.VREME) - MIN(N.VREME) + 1), 1) AS PROSEK
	                            FROM
	                            (
		                            SELECT RESTORAN_ID, IME_MENI, STAVKA_ID, IME_STAVKA, VALIDNOST_STAVKA, OPIS_STAVKA, CENA_STAVKA
		                            FROM 
			                            (
			                            SELECT 
				                            RESTORAN_ID, IME_MENI, STAVKA_ID, IME_STAVKA, VALIDNOST_STAVKA, OPIS_STAVKA, CENA_STAVKA
			                            FROM 
				                            STAVKA
			                            WHERE 
				                            RESTORAN_ID = :RES_ID AND VALIDNOST_STAVKA = 1
			                            )
		                            WHERE 
			                            (RESTORAN_ID, IME_MENI, IME_STAVKA) IN
				                            (
				                            SELECT 
					                            RESTORAN_ID, IME_MENI, IME_STAVKA
				                            FROM 
					                            STAVKA
				                            WHERE RESTORAN_ID = :RES_ID1 AND VALIDNOST_STAVKA = 0
				                            )
		                            ) S
		                            LEFT OUTER JOIN
		                            VKLUCHUVA V
			                            ON 
				                            S.RESTORAN_ID = V.RESTORAN_ID AND S.IME_MENI = V.IME_MENI AND S.STAVKA_ID = V.STAVKA_ID
		                            LEFT OUTER JOIN
		                            NARACHKA N
			                            ON
				                            V.RESTORAN_ID = N.RESTORAN_ID AND V.NARACHKA_ID = N.NARACHKA_ID
		                            GROUP BY
			                            (S.RESTORAN_ID, S.IME_MENI, S.STAVKA_ID, S.IME_STAVKA, S.VALIDNOST_STAVKA, S.OPIS_STAVKA, S.CENA_STAVKA)
	                            ) A
	                            JOIN
	                            (
		                            SELECT IME_MENI, IME_STAVKA, OPIS_STAVKA, AVG(PROSEK) AS PROSEK
		                            FROM
			                            (
			                            SELECT S.IME_MENI, S.IME_STAVKA, S.OPIS_STAVKA, VALIDNOST_STAVKA, ROUND(SUM(V.KOLICHINA_STAVKA) / TO_NUMBER(MAX(N.VREME) - MIN(N.VREME) + 1), 1) AS PROSEK
			                            FROM
			                            (
				                            SELECT RESTORAN_ID, IME_MENI, STAVKA_ID, IME_STAVKA, VALIDNOST_STAVKA, OPIS_STAVKA
				                            FROM 
					                            (
					                            SELECT 
						                            RESTORAN_ID, IME_MENI, STAVKA_ID, IME_STAVKA, VALIDNOST_STAVKA, OPIS_STAVKA
					                            FROM 
						                            STAVKA
					                            WHERE 
						                            RESTORAN_ID = :RES_ID2 AND VALIDNOST_STAVKA = 0
					                            )
				                            WHERE 
					                            (RESTORAN_ID, IME_MENI, IME_STAVKA) IN
						                            (
						                            SELECT 
							                            RESTORAN_ID, IME_MENI, IME_STAVKA
						                            FROM 
							                            STAVKA
						                            WHERE RESTORAN_ID = :RES_ID3 AND VALIDNOST_STAVKA = 0
						                            )
				                            ) S
				                            LEFT OUTER JOIN
				                            VKLUCHUVA V
					                            ON 
						                            S.RESTORAN_ID = V.RESTORAN_ID AND S.IME_MENI = V.IME_MENI AND S.STAVKA_ID = V.STAVKA_ID
				                            LEFT OUTER JOIN
				                            NARACHKA N
					                            ON
						                            V.RESTORAN_ID = N.RESTORAN_ID AND V.NARACHKA_ID = N.NARACHKA_ID
				                            GROUP BY
					                            (S.RESTORAN_ID, S.IME_MENI, S.STAVKA_ID, S.IME_STAVKA, S.VALIDNOST_STAVKA, S.OPIS_STAVKA)
			                            )
		                            GROUP BY (IME_MENI, IME_STAVKA, OPIS_STAVKA)
	                            ) B 
	                            ON
		                            A.IME_STAVKA = B.IME_STAVKA AND A.IME_MENI = B.IME_MENI AND NVL(A.OPIS_STAVKA, 0) = NVL(B.OPIS_STAVKA, 0)"        ;

            if (CurrSortiranje.Equals(Sortiranje.ImeOpagjacki))
            {
                sql += "\nORDER BY STAVKA desc";
            }
            else if (CurrSortiranje.Equals(Sortiranje.ImeRastecki))
            {
                sql += "\nORDER BY STAVKA asc";
            }
            else if (CurrSortiranje.Equals(Sortiranje.ProcentOpagjacki))
            {
                sql += "\nORDER BY ROUND((A.PROSEK - B.PROSEK)*100/B.PROSEK, 2) desc, STAVKA";
            }
            else if (CurrSortiranje.Equals(Sortiranje.ProcentRastecki))
            {
                sql += "\nORDER BY ROUND((A.PROSEK - B.PROSEK)*100/B.PROSEK, 2) asc, STAVKA";
            }
            else if (CurrSortiranje.Equals(Sortiranje.StaraOpagjacki))
            {
                sql += "\nORDER BY NVL(B.PROSEK, 0) desc, STAVKA";
            }
            else if (CurrSortiranje.Equals(Sortiranje.StaraRastecki))
            {
                sql += "\nORDER BY NVL(B.PROSEK, 0) asc, STAVKA";
            }
            else if (CurrSortiranje.Equals(Sortiranje.NovaOpagjacki))
            {
                sql += "\nORDER BY NVL(A.PROSEK, 0) desc, STAVKA";
            }
            else if (CurrSortiranje.Equals(Sortiranje.NovaRastecki))
            {
                sql += "\nORDER BY NVL(A.PROSEK, 0) asc, STAVKA";
            }


            OracleCommand cmd = new OracleCommand(sql, Conn);

            OracleParameter prm = new OracleParameter("RES_ID", OracleDbType.Int32);

            prm.Value = Restoran.RestoranID;
            cmd.Parameters.Add(prm);

            prm       = new OracleParameter("RES_ID1", OracleDbType.Int32);
            prm.Value = Restoran.RestoranID;
            cmd.Parameters.Add(prm);

            prm       = new OracleParameter("RES_ID2", OracleDbType.Int32);
            prm.Value = Restoran.RestoranID;
            cmd.Parameters.Add(prm);

            prm       = new OracleParameter("RES_ID3", OracleDbType.Int32);
            prm.Value = Restoran.RestoranID;
            cmd.Parameters.Add(prm);

            Stavki = new List <StavkaPorast>();
            try
            {
                cmd.CommandType = CommandType.Text;
                OracleDataReader dr = cmd.ExecuteReader();

                while (dr.Read())
                {
                    StavkaPorast st = new StavkaPorast(dr.GetString(0), dr.GetString(3), dr.GetString(2), dr.GetString(1), dr.GetString(4));
                    Stavki.Add(st);
                }
            }
            catch (Exception ex)
            {
                SetText(lblErrorMessage, "Имате проблем со поврзување на конекцијата");
                SetVisible(lblErrorMessage, true);
            }

            LoadingSemaphore.WaitOne();
            PostaviTabela();
        }
Exemple #16
0
        /// <summary>
        /// Load movies asynchronously
        /// </summary>
        public override async Task LoadMoviesAsync(bool reset = false)
        {
            await LoadingSemaphore.WaitAsync(CancellationLoadingMovies.Token);

            StopLoadingMovies();
            if (reset)
            {
                Movies.Clear();
                Page           = 0;
                VerticalScroll = 0d;
            }

            var watch = Stopwatch.StartNew();

            Page++;
            if (Page > 1 && Movies.Count == MaxNumberOfMovies && reset)
            {
                Page--;
                LoadingSemaphore.Release();
                return;
            }

            Logger.Trace(
                "Loading movies favorites page...");
            HasLoadingFailed = false;
            try
            {
                IsLoadingMovies = true;
                var imdbIds = UserService.GetFavoritesMovies(Page);

                var moviesToDelete = Movies.Select(a => a.ImdbId).Except(imdbIds.allMovies);
                var moviesToAdd    = imdbIds.movies.Except(Movies.Select(a => a.ImdbId));

                foreach (var movie in moviesToDelete.ToList())
                {
                    Movies.Remove(Movies.FirstOrDefault(a => a.ImdbId == movie));
                }

                var movies = moviesToAdd.ToList();
                var moviesToAddAndToOrder = new List <MovieLightJson>();

                if (movies.Any())
                {
                    var movieByIds = await MovieService.GetMoviesByIds(movies, CancellationLoadingMovies.Token);

                    foreach (var movie in movieByIds.movies)
                    {
                        if ((Genre == null || movie.Genres.Contains(Genre.EnglishName)) &&
                            movie.Rating >= Rating)
                        {
                            moviesToAddAndToOrder.Add(movie);
                        }
                    }
                }

                foreach (var movie in moviesToAddAndToOrder.Except(Movies.ToList(), new MovieLightComparer()))
                {
                    var pair = Movies
                               .Select((value, index) => new { value, index })
                               .FirstOrDefault(x => string.CompareOrdinal(x.value.Title, movie.Title) > 0);

                    if (pair == null)
                    {
                        Movies.Add(movie);
                    }
                    else
                    {
                        Movies.Insert(pair.index, movie);
                    }
                }

                IsLoadingMovies       = false;
                IsMovieFound          = Movies.Any();
                CurrentNumberOfMovies = Movies.Count;
                MaxNumberOfMovies     = imdbIds.nbMovies;
                UserService.SyncMovieHistory(Movies);
            }
            catch (Exception exception)
            {
                Page--;
                Logger.Error(
                    $"Error while loading movies favorite page {Page}: {exception.Message}");
                HasLoadingFailed = true;
                Messenger.Default.Send(new ManageExceptionMessage(exception));
            }
            finally
            {
                NeedSync = false;
                watch.Stop();
                var elapsedMs = watch.ElapsedMilliseconds;
                Logger.Trace(
                    $"Loaded movies favorite page {Page} in {elapsedMs} milliseconds.");
                LoadingSemaphore.Release();
            }
        }
Exemple #17
0
        /// <summary>
        /// Креирање на мени со помош на хеш мапи.
        /// Идеја: Да се овозможи еднократно читање од база и потоа линеарно креирање на дрвото на менија.
        ///
        /// Ги поставува: Restoran.GlavnoMeni и CurrMenu (иста истанца)
        /// </summary>
        private void KreirajMeni()
        {
            Dictionary <string, Meni>      Menus = new Dictionary <string, Meni>();
            Dictionary <StavkaKey, Stavka> Items = new Dictionary <StavkaKey, Stavka>();

            // Вчитување на менија
            string        sql = @"SELECT * FROM MENI WHERE RESTORAN_ID = :RES_ID AND VALIDNOST_MENI = 1";
            OracleCommand cmd = new OracleCommand(sql, Conn);

            OracleParameter prm = new OracleParameter("RES_ID", OracleDbType.Int64);

            prm.Value = Restoran.RestoranID;
            cmd.Parameters.Add(prm);

            cmd.CommandType = CommandType.Text;
            OracleDataReader dr = cmd.ExecuteReader();
            Meni             meni;

            while (dr.Read())
            {
                meni = new Meni(dr.GetString(1));
                Object obj = dr.GetValue(3);
                if (obj == null)
                {
                    meni.ImeGlavno = null;
                }
                else
                {
                    meni.ImeGlavno = obj as String;
                }
                String IsValid = (string)dr.GetValue(2);
                if (IsValid == "1")
                {
                    meni.ValidnostMeni = true;
                }
                else
                {
                    meni.ValidnostMeni = false;
                }
                Menus.Add(meni.Ime, meni);
            }

            // Вчитување на ставки
            sql = @"SELECT * FROM STAVKA WHERE VALIDNOST_STAVKA LIKE '1' AND RESTORAN_ID = :RES_ID";
            cmd = new OracleCommand(sql, Conn);

            prm       = new OracleParameter("RES_ID", OracleDbType.Int64);
            prm.Value = Restoran.RestoranID;
            cmd.Parameters.Add(prm);

            cmd.CommandType = CommandType.Text;
            dr = cmd.ExecuteReader();

            Dodatok dodatok;
            Stavka  stavka;

            while (dr.Read())
            {
                String IsDecorator = (string)dr.GetValue(5);
                Object ImeGlavno   = dr.GetValue(1);
                Object OpisStavka  = dr.GetValue(3);
                if (IsDecorator == "1")
                {
                    dodatok = new Dodatok((int)dr.GetValue(2), dr.GetString(7), (decimal)dr.GetValue(4));
                    if (ImeGlavno == null)
                    {
                        dodatok.ImeGlavno = null;
                    }
                    else
                    {
                        dodatok.ImeGlavno = ImeGlavno as String;
                    }
                    if (OpisStavka == null)
                    {
                        dodatok.Opis = null;
                    }
                    else
                    {
                        dodatok.Opis = OpisStavka as String;
                    }
                    Items.Add(dodatok.GetStavkaKey(), dodatok);
                }
                else
                {
                    stavka = new Stavka((int)dr.GetValue(2), dr.GetString(7), (decimal)dr.GetValue(4));
                    if (ImeGlavno == null)
                    {
                        stavka.ImeGlavno = null;
                    }
                    else
                    {
                        stavka.ImeGlavno = ImeGlavno as String;
                    }
                    if (OpisStavka == null)
                    {
                        stavka.Opis = null;
                    }
                    else
                    {
                        stavka.Opis = OpisStavka as String;
                    }
                    Items.Add(stavka.GetStavkaKey(), stavka);
                }
            }

            foreach (var obj in Menus)
            {
                Meni menu;
                if (obj.Value.ImeGlavno != null && Menus.TryGetValue(obj.Value.ImeGlavno, out menu))
                {
                    menu.AddComp(obj.Value);
                    obj.Value.Parent = menu;
                }
                else
                {
                    Restoran.GlavnoMeni = obj.Value;
                }
            }

            foreach (var obj in Items)
            {
                Meni menu;
                if (Menus.TryGetValue(obj.Value.ImeGlavno, out menu))
                {
                    menu.AddComp(obj.Value);
                    obj.Value.Parent = menu;
                }
            }
            //lblOsnovnoMeni.UpdateObject(Restoran.GlavnoMeni);
            LoadingSemaphore.WaitOne();
            SetObject(lblOsnovnoMeni, Restoran.GlavnoMeni);
            CurrMenu = Restoran.GlavnoMeni;
            PopolniListaMenija();
        }
        /// <summary>
        /// Load movies asynchronously
        /// </summary>
        public override async Task LoadMoviesAsync(bool reset = false)
        {
            await LoadingSemaphore.WaitAsync();

            StopLoadingMovies();
            if (reset)
            {
                Movies.Clear();
                Page = 0;
            }

            var watch = Stopwatch.StartNew();

            Page++;
            if (Page > 1 && Movies.Count == MaxNumberOfMovies)
            {
                Page--;
                LoadingSemaphore.Release();
                return;
            }

            Logger.Info(
                $"Loading movies seen page {Page}...");
            HasLoadingFailed = false;
            try
            {
                IsLoadingMovies = true;
                var imdbIds =
                    await UserService.GetSeenMovies(Page);

                if (!NeedSync)
                {
                    var movies = new List <MovieLightJson>();
                    await imdbIds.movies.ParallelForEachAsync(async imdbId =>
                    {
                        try
                        {
                            var movie = await MovieService.GetMovieLightAsync(imdbId);
                            if (movie != null)
                            {
                                movie.IsFavorite = true;
                                movies.Add(movie);
                            }
                        }
                        catch (Exception ex)
                        {
                            Logger.Error(ex);
                        }
                    });

                    var updatedMovies = movies.OrderBy(a => a.Title)
                                        .Where(a => (Genre == null || a.Genres.Contains(Genre.EnglishName)) &&
                                               a.Rating >= Rating);

                    foreach (var movie in updatedMovies.Except(Movies.ToList(), new MovieLightComparer()))
                    {
                        var pair = Movies
                                   .Select((value, index) => new { value, index })
                                   .FirstOrDefault(x => string.CompareOrdinal(x.value.Title, movie.Title) > 0);

                        if (pair == null)
                        {
                            Movies.Add(movie);
                        }
                        else
                        {
                            Movies.Insert(pair.index, movie);
                        }
                    }
                }
                else
                {
                    var moviesToDelete = Movies.Select(a => a.ImdbCode).Except(imdbIds.allMovies);
                    var moviesToAdd    = imdbIds.allMovies.Except(Movies.Select(a => a.ImdbCode));

                    foreach (var movie in moviesToDelete.ToList())
                    {
                        Movies.Remove(Movies.FirstOrDefault(a => a.ImdbCode == movie));
                    }

                    var movies = moviesToAdd.ToList();
                    var moviesToAddAndToOrder = new List <MovieLightJson>();
                    await movies.ParallelForEachAsync(async imdbId =>
                    {
                        try
                        {
                            var movie = await MovieService.GetMovieLightAsync(imdbId);
                            if ((Genre == null || movie.Genres.Contains(Genre.EnglishName)) && movie.Rating >= Rating)
                            {
                                moviesToAddAndToOrder.Add(movie);
                            }
                        }
                        catch (Exception ex)
                        {
                            Logger.Error(ex);
                        }
                    });

                    foreach (var movie in moviesToAddAndToOrder.Except(Movies.ToList(), new MovieLightComparer()))
                    {
                        var pair = Movies
                                   .Select((value, index) => new { value, index })
                                   .FirstOrDefault(x => string.CompareOrdinal(x.value.Title, movie.Title) > 0);

                        if (pair == null)
                        {
                            Movies.Add(movie);
                        }
                        else
                        {
                            Movies.Insert(pair.index, movie);
                        }
                    }
                }

                IsLoadingMovies       = false;
                IsMovieFound          = Movies.Any();
                CurrentNumberOfMovies = Movies.Count;
                MaxNumberOfMovies     = imdbIds.nbMovies;
                await UserService.SyncMovieHistoryAsync(Movies).ConfigureAwait(false);
            }
            catch (Exception exception)
            {
                Page--;
                Logger.Error(
                    $"Error while loading movies seen page {Page}: {exception.Message}");
                HasLoadingFailed = true;
                Messenger.Default.Send(new ManageExceptionMessage(exception));
            }
            finally
            {
                NeedSync = false;
                watch.Stop();
                var elapsedMs = watch.ElapsedMilliseconds;
                Logger.Info(
                    $"Loaded movies seen page {Page} in {elapsedMs} milliseconds.");
                LoadingSemaphore.Release();
            }
        }
Exemple #19
0
        /// <summary>
        /// Load movies asynchronously
        /// </summary>
        public override async Task LoadShowsAsync(bool reset = false)
        {
            await LoadingSemaphore.WaitAsync();

            StopLoadingShows();
            if (reset)
            {
                Shows.Clear();
                Page = 0;
            }

            var watch = Stopwatch.StartNew();

            Page++;
            if (Page > 1 && Shows.Count == MaxNumberOfShows)
            {
                Page--;
                LoadingSemaphore.Release();
                return;
            }

            Logger.Info(
                $"Loading shows favorite page {Page}...");
            HasLoadingFailed = false;
            try
            {
                IsLoadingShows = true;
                var imdbIds =
                    await UserService.GetFavoritesShows(Page);

                if (!NeedSync)
                {
                    var shows = new List <ShowLightJson>();
                    await imdbIds.shows.ParallelForEachAsync(async imdbId =>
                    {
                        try
                        {
                            var show = await ShowService.GetShowLightAsync(imdbId);
                            if (show != null)
                            {
                                show.IsFavorite = true;
                                shows.Add(show);
                            }
                        }
                        catch (Exception ex)
                        {
                            Logger.Error(ex);
                        }
                    });

                    var updatedShows = shows.OrderBy(a => a.Title)
                                       .Where(a => (Genre == null || a.Genres.Contains(Genre.EnglishName)) &&
                                              a.Rating.Percentage >= Rating * 10);
                    foreach (var show in updatedShows.Except(Shows.ToList(), new ShowLightComparer()))
                    {
                        var pair = Shows
                                   .Select((value, index) => new { value, index })
                                   .FirstOrDefault(x => string.CompareOrdinal(x.value.Title, show.Title) > 0);


                        if (pair == null)
                        {
                            Shows.Add(show);
                        }
                        else
                        {
                            Shows.Insert(pair.index, show);
                        }
                    }
                }
                else
                {
                    var showsToDelete = Shows.Select(a => a.ImdbId).Except(imdbIds.allShows);
                    var showsToAdd    = imdbIds.allShows.Except(Shows.Select(a => a.ImdbId));
                    foreach (var movie in showsToDelete.ToList())
                    {
                        Shows.Remove(Shows.FirstOrDefault(a => a.ImdbId == movie));
                    }

                    var shows = showsToAdd.ToList();
                    var showsToAddAndToOrder = new List <ShowLightJson>();
                    await shows.ParallelForEachAsync(async imdbId =>
                    {
                        try
                        {
                            var show = await ShowService.GetShowLightAsync(imdbId);
                            if ((Genre == null || show.Genres.Contains(Genre.EnglishName)) && show.Rating.Percentage >= Rating * 10)
                            {
                                showsToAddAndToOrder.Add(show);
                            }
                        }
                        catch (Exception ex)
                        {
                            Logger.Error(ex);
                        }
                    });

                    foreach (var show in showsToAddAndToOrder.Except(Shows.ToList(), new ShowLightComparer()))
                    {
                        var pair = Shows
                                   .Select((value, index) => new { value, index })
                                   .FirstOrDefault(x => string.CompareOrdinal(x.value.Title, show.Title) > 0);
                        if (pair == null)
                        {
                            Shows.Add(show);
                        }
                        else
                        {
                            Shows.Insert(pair.index, show);
                        }
                    }
                }
                IsLoadingShows       = false;
                IsShowFound          = Shows.Any();
                CurrentNumberOfShows = Shows.Count;
                MaxNumberOfShows     = imdbIds.nbShows;
                await UserService.SyncShowHistoryAsync(Shows).ConfigureAwait(false);
            }
            catch (Exception exception)
            {
                Page--;
                Logger.Error(
                    $"Error while loading shows favorite page {Page}: {exception.Message}");
                HasLoadingFailed = true;
                Messenger.Default.Send(new ManageExceptionMessage(exception));
            }
            finally
            {
                NeedSync = false;
                watch.Stop();
                var elapsedMs = watch.ElapsedMilliseconds;
                Logger.Info(
                    $"Loaded shows favorite page {Page} in {elapsedMs} milliseconds.");
                LoadingSemaphore.Release();
            }
        }
        /// <summary>
        /// Load shows asynchronously
        /// </summary>
        public override async Task LoadShowsAsync(bool reset = false)
        {
            await LoadingSemaphore.WaitAsync();

            if (reset)
            {
                Shows.Clear();
                Page           = 0;
                VerticalScroll = 0d;
            }

            var watch = Stopwatch.StartNew();

            Page++;
            if (Page > 1 && Shows.Count == MaxNumberOfShows)
            {
                Page--;
                LoadingSemaphore.Release();
                return;
            }

            StopLoadingShows();
            Logger.Info(
                $"Loading page {Page}...");
            HasLoadingFailed = false;
            try
            {
                IsLoadingShows = true;
                await Task.Run(async() =>
                {
                    var getMoviesWatcher = new Stopwatch();
                    getMoviesWatcher.Start();
                    var result =
                        await ShowService.Discover(Page).ConfigureAwait(false);
                    getMoviesWatcher.Stop();
                    var getMoviesEllapsedTime = getMoviesWatcher.ElapsedMilliseconds;
                    if (reset && getMoviesEllapsedTime < 500)
                    {
                        // Wait for VerticalOffset to reach 0 (animation lasts 500ms)
                        await Task.Delay(500 - (int)getMoviesEllapsedTime).ConfigureAwait(false);
                    }

                    DispatcherHelper.CheckBeginInvokeOnUI(() =>
                    {
                        Shows.AddRange(result.Item1.Except(Shows, new ShowLightComparer()));
                        IsLoadingShows       = false;
                        IsShowFound          = Shows.Any();
                        CurrentNumberOfShows = Shows.Count;
                        MaxNumberOfShows     = result.nbMovies;
                        UserService.SyncShowHistory(Shows);
                    });
                }).ConfigureAwait(false);
            }
            catch (Exception exception)
            {
                Page--;
                Logger.Error(
                    $"Error while loading page {Page}: {exception.Message}");
                HasLoadingFailed = true;
                Messenger.Default.Send(new ManageExceptionMessage(exception));
            }
            finally
            {
                watch.Stop();
                var elapsedMs = watch.ElapsedMilliseconds;
                Logger.Info(
                    $"Loaded page {Page} in {elapsedMs} milliseconds.");
                LoadingSemaphore.Release();
            }
        }