using System.Linq;
using System.Threading.Tasks;
using API.Data.Repositories;
using API.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
namespace API.Data.ManualMigrations;
/// 
/// Introduced in v0.7.8.7 and v0.7.9, this adds SideNavStream's for all Libraries a User has access to
/// 
public static class MigrateUserLibrarySideNavStream
{
    public static async Task Migrate(IUnitOfWork unitOfWork, DataContext dataContext, ILogger logger)
    {
        if (await dataContext.ManualMigrationHistory.AnyAsync(m => m.Name == "MigrateUserLibrarySideNavStream"))
        {
            return;
        }
        var usersWithLibraryStreams = await dataContext.AppUser
            .Include(u => u.SideNavStreams)
            .AnyAsync(u => u.SideNavStreams.Count > 0 && u.SideNavStreams.Any(s => s.LibraryId > 0));
        if (usersWithLibraryStreams)
        {
            logger.LogCritical("Running MigrateUserLibrarySideNavStream migration - complete. Nothing to do");
            return;
        }
        logger.LogCritical("Running MigrateUserLibrarySideNavStream migration - Please be patient, this may take some time. This is not an error");
        var users = await unitOfWork.UserRepository.GetAllUsersAsync(AppUserIncludes.SideNavStreams);
        foreach (var user in users)
        {
            var userLibraries = await unitOfWork.LibraryRepository.GetLibrariesForUserIdAsync(user.Id);
            foreach (var lib in userLibraries)
            {
                var prevMaxOrder = user.SideNavStreams.Max(s => s.Order);
                user.SideNavStreams.Add(new AppUserSideNavStream()
                {
                    Name = lib.Name,
                    LibraryId = lib.Id,
                    IsProvided = false,
                    Visible = true,
                    StreamType = SideNavStreamType.Library,
                    Order = prevMaxOrder + 1
                });
            }
            unitOfWork.UserRepository.Update(user);
        }
        await unitOfWork.CommitAsync();
        logger.LogCritical("Running MigrateUserLibrarySideNavStream migration - Completed. This is not an error");
    }
}