/*   public async Task UpdateAsync()
         * {
         *
         *    if(duringUpdate)
         *    {
         *        return;
         *    }
         *
         *
         *    duringUpdate = true;
         *    try
         *    {
         *    Log.Information("Start radio songs updating");
         *    Console.WriteLine($"{DateTime.Now}Start radio songs updating");
         *
         *        var stations = new Dictionary<int, string>(){{1,"zet"},{2,"rmf"},{3,"eska"},{4, "rmfmaxx"},{9, "zloteprzeboje"},{30, "vox"},{48, "trojka"}};
         *       var dateLast = await GetLastDate();
         *
         *            //Console.WriteLine(dateLast);
         *            var dateNow = DateTime.Now;
         *            int hourNow = dateNow.Hour;
         *            //Console.WriteLine(dateNow );
         *
         *            var hours = (dateNow - dateLast).TotalHours;
         *
         *            int i = 0;
         *            int h = 50;
         *            if (hours>=12)
         *            {
         *                i = 12;
         *
         *            }
         *
         *            if(hourNow == dateLast.Hour && hours<12 )
         *            {
         *                i = 0;
         *
         *            }
         *            if(hourNow != dateLast.Hour && hours<12 )
         *            {
         *
         *                while(h != hourNow)
         *                {
         *                dateLast = dateLast.AddHours(1);
         *                h =  dateLast.Hour;
         *
         *                i++;
         *
         *                }
         *            }
         *
         *
         *        var listOfInitialSongs = new List<Song>();
         *        var songsCount = 0;
         *
         *        for (int j = 0;j<i;j++)
         *        {
         *
         *
         *                var hourTo = dateNow.AddHours(-j).Hour;
         *                var dateBase = dateNow.AddHours(-j);
         *                var date = dateNow.AddHours(-j-1).ToString("dd-MM-yyyy");
         *                var hourFrom = dateNow.AddHours(-j-1).Hour;
         *
         *            foreach(var s in stations.Keys)
         *            {
         *                string addres = "https://www.odsluchane.eu/szukaj.php?r="+s+"&date="+date+"&time_from="+hourFrom+"&time_to="+hourTo;
         *                //Console.WriteLine(addres);
         *              var names = getNamesFromUrl(addres);
         *
         *                if(names.Count>0)
         *                {
         *                foreach(var name in names)
         *                {
         *
         *                    listOfInitialSongs.Add(new Song(name, stations[s], dateBase ));
         *                }
         *                }
         *            }
         *
         *            }
         *
         *    //Log.Information($"Radio Songs UPDATED with {listOfInitialSongs.Count} songs");
         *    //Console.WriteLine($"Radio Songs UPDATED with {listOfInitialSongs.Count} songs");
         *        if(listOfInitialSongs.Count>0)
         *        {
         *            var toManyReq = false;
         *          songsCount = listOfInitialSongs.Count;
         *
         *  using(var context = new LiveContext(_sql))
         *        {
         *            try
         *            {
         *            foreach(var song in listOfInitialSongs)
         *            {
         *
         *                //Console.WriteLine(songsCount);
         *
         *                //var archiveSong = await GetByNameFromArchive(song.Name);
         *
         *        var archiveSong = await context.ArchiveSongs.Include(x=>x.YouTube).FirstOrDefaultAsync(s => s.Name == song.Name);
         *
         *       // var actuallSongs = await _liveContext.Songs.Include(x=>x.YouTube).ToListAsync();
         *
         *        //var songArch = archiveSongs.FirstOrDefault(s => s.Name == name);
         *
         *
         *            if(archiveSong is null)
         *            {
         *                if(toManyReq == false)
         *                {
         *                    song.SetYoutube();
         *                }
         *                else
         *                {
         *                    song.SetWhileYoutube();
         *                }
         *
         *                if (song.YouTube.VideoID.Contains("FirstError"))
         *                {
         *                    Log.Warning("First ERROR from Song Update");
         *                    toManyReq = true;
         *                }
         *
         *                var toArchiveSong = new ArchiveSong(song);
         *                //Console.WriteLine("Adding new song to archive");
         *                await context.ArchiveSongs.AddAsync(toArchiveSong);
         *                await context.SaveChangesAsync();
         *
         *                //await AddToArchiveAsync(song);
         *            }
         *            else
         *            {
         *                song.SetYoutube(archiveSong);
         *            }
         *
         *                song.Added = DateTime.Now;
         *                //Console.WriteLine("Adding song to Songs");
         *                await context.Songs.AddAsync(song);
         *
         *                songsCount = songsCount-1;
         *            }
         *            await context.SaveChangesAsync();
         *            }
         *            catch(Exception ex)
         *            {
         *                Log.Error($"Error while updating songs: {ex.Message}");
         *                Log.Error(ex.StackTrace);
         *                context.Dispose();
         *            }
         *
         *        }
         *    }
         *
         *    if(listOfInitialSongs.Count>0)
         *    {
         *
         *    using(var context = new LiveContext(_sql))
         *            {
         *                context.Songs.RemoveRange(context.Songs.Where(s => s.PlayAt<dateNow.AddHours(-13)));
         *                await context.SaveChangesAsync();
         *            }
         *        var errors = listOfInitialSongs.Where(x => x.YouTube.VideoID.Contains("Error")).ToList();
         *        Log.Information($"Finish radio songs update with {listOfInitialSongs.Count} songs and {errors.Count} youtube errors");
         *
         *    }
         *      InfoCaches._radioSongsUpdatingRunning = true;
         *        duringUpdate = false;
         *
         *    }
         *    catch (Exception ex)
         *    {
         *        Log.Error($"Error in updating songs {ex.Message}");
         *        Log.Error(ex.StackTrace);
         *        InfoCaches._radioSongsUpdatingRunning = false;
         *         Console.WriteLine($"Error in updating songs {ex.Message}");
         *      Console.WriteLine(ex.StackTrace);
         *        duringUpdate = false;
         *    }
         * } */

        public async Task AddToArchiveAsync(Song song)
        {
            var toArchiveSong = new ArchiveSong(song);
            await _liveContext.ArchiveSongs.AddAsync(toArchiveSong);

            await _liveContext.SaveChangesAsync();
        }
        //public async Task GetByRadioAsync

        public async Task UpdateArchiveAsync(Song actualSong)
        {
            // GetByYouTubeFromArchive

            var actuallSongs = await GetAllActuall();

            foreach (var song in actuallSongs)
            {
                var archiveSong = await GetByYouTubeFromArchive(song.YouTube.VideoID);

                if (archiveSong is null)
                {
                    var toArchiveSong = new ArchiveSong(song);
                    await _liveContext.ArchiveSongs.AddAsync(toArchiveSong);

                    await _liveContext.SaveChangesAsync();
                }
                // Console.WriteLine(archiveSong.Name);
            }
        }
        public async Task SongsUpdateAsync()
        {
            if (InfoCaches.duringSongsUpdate)
            {
                return;
            }


            InfoCaches.duringSongsUpdate = true;
            try
            {
                //Log.Information("Start radio songs updating");
                //Console.WriteLine($"{DateTime.Now}  Start radio songs updating");

                var stations = new Dictionary <int, string>()
                {
                    { 1, "zet" }, { 2, "rmf" }, { 3, "eska" }, { 4, "rmfmaxx" }, { 9, "zloteprzeboje" }, { 30, "vox" }, { 40, "chillizet" }
                };
                var dateLast = await GetLastDate();

                // Console.WriteLine("Context works  datelst -> " + dateLast);
                //Console.WriteLine(dateLast);
                var dateNow = DateTime.Now;
                int hourNow = dateNow.Hour;
                //Console.WriteLine(dateNow );

                var hours = (dateNow - dateLast).TotalHours;

                int i = 0;
                int h = 50;
                if (hours >= 12)
                {
                    i = 12;
                }

                if (hourNow == dateLast.Hour && hours < 12)
                {
                    i = 0;
                }
                if (hourNow != dateLast.Hour && hours < 12)
                {
                    while (h != hourNow)
                    {
                        dateLast = dateLast.AddHours(1);
                        h        = dateLast.Hour;

                        i++;
                    }
                }


                var listOfInitialSongs = new List <Song>();
                var songsCount         = 0;

                for (int j = 0; j < i; j++)
                {
                    var hourTo   = dateNow.AddHours(-j).Hour;
                    var dateBase = dateNow.AddHours(-j);
                    var date     = dateNow.AddHours(-j - 1).ToString("dd-MM-yyyy");
                    var hourFrom = dateNow.AddHours(-j - 1).Hour;

                    foreach (var s in stations.Keys)
                    {
                        string addres = "https://www.odsluchane.eu/szukaj.php?r=" + s + "&date=" + date + "&time_from=" + hourFrom + "&time_to=" + hourTo;
                        //Console.WriteLine(addres);
                        var names = getSongsNamesFromUrl(addres);

                        if (names.Count > 0)
                        {
                            foreach (var name in names)
                            {
                                listOfInitialSongs.Add(new Song(name, stations[s], dateBase));
                            }
                        }
                    }
                }

                //Log.Information($"Radio Songs UPDATED with {listOfInitialSongs.Count} songs");
                //Console.WriteLine($"Radio Songs UPDATED with {listOfInitialSongs.Count} songs");
                if (listOfInitialSongs.Count > 0)
                {
                    var toManyReq = false;
                    songsCount = listOfInitialSongs.Count;

                    //using(var context = new LiveContext(_sql))
                    //using(var context = new LiveContext())
                    //{
                    try
                    {
                        foreach (var song in listOfInitialSongs)
                        {
                            var archiveSong = await _context.ArchiveSongs.Include(x => x.YouTube).FirstOrDefaultAsync(s => s.Name == song.Name);

                            if (archiveSong is null)
                            {
                                if (toManyReq == false)
                                {
                                    song.SetYoutube();
                                }
                                else
                                {
                                    song.SetWhileYoutube();
                                }

                                if (song.YouTube.VideoID.Contains("FirstError"))
                                {
                                    Log.Warning("First ERROR from Song Update");
                                    toManyReq = true;
                                }

                                var toArchiveSong = new ArchiveSong(song);
                                //Console.WriteLine("Adding new song to archive");
                                await _context.ArchiveSongs.AddAsync(toArchiveSong);

                                await _context.SaveChangesAsync();
                            }
                            else
                            {
                                song.SetYoutube(archiveSong);
                            }

                            song.Added = DateTime.Now;
                            //Console.WriteLine("Adding song to Songs");
                            await _context.Songs.AddAsync(song);

                            songsCount = songsCount - 1;
                        }
                        await _context.SaveChangesAsync();
                    }
                    catch (Exception ex)
                    {
                        Log.Error($"Error while updating songs: {ex.Message}");
                        Log.Error(ex.StackTrace);
                        //context.Dispose();
                    }

                    //}
                }

                if (listOfInitialSongs.Count > 0)
                {
                    //using(var context = new LiveContext(_sql))
                    // using(var context = new LiveContext())
                    //{
                    _context.Songs.RemoveRange(_context.Songs.Where(s => s.PlayAt < dateNow.AddHours(-13)));
                    await _context.SaveChangesAsync();

                    //}
                    var errors = listOfInitialSongs.Where(x => x.YouTube.VideoID.Contains("Error")).ToList();
                    Log.Information($"Finish radio songs update with {listOfInitialSongs.Count} songs and {errors.Count} youtube errors");

                    //Console.WriteLine($"Finish radio songs update with {listOfInitialSongs.Count} songs and {errors.Count} youtube errors");
                }

                InfoCaches.duringSongsUpdate = false;
            }
            catch (Exception ex)
            {
                Log.Error($"Error in updating songs {ex.Message}");
                Log.Error(ex.StackTrace);
                Console.WriteLine($"Error in updating songs {ex.Message}");
                Console.WriteLine(ex.StackTrace);
                InfoCaches.duringSongsUpdate = false;
            }
        }