using Microsoft.EntityFrameworkCore;
using Modules.Library.Database.Database;
using Modules.Library.Database.Database.Models.Anime;
using System.Linq.Expressions;

namespace Modules.Library.Database.Repositories;

//public class AnimeTitleRepository(LibraryDbContext context) : RepositoryBase<AnimeTitle>(context)
public class AnimeTitleRepository(LibraryDbContext context)
{
    private readonly LibraryDbContext _context = context;

    internal async Task<Guid> AddAsync(AnimeTitle animeTitle)
    {
        _context.AnimeTitles.Add(animeTitle);
        await _context.SaveChangesAsync();
        return animeTitle.Id;
    }

    private IQueryable<AnimeTitle> QueryFullIncludes() => _context.AnimeTitles
        .Include(q => q.CommonProperties).ThenInclude(q => q.Names)
        .Include(q => q.CommonProperties).ThenInclude(q => q.Descriptions)
        .Include(q => q.CommonProperties).ThenInclude(q => q.RelatedContent)
        .Include(q => q.CommonProperties).ThenInclude(q => q.Genres)
        .Include(q => q.CommonProperties).ThenInclude(q => q.Preview)
        .Include(q => q.Items).ThenInclude(q => q.CommonProperties).ThenInclude(q => q.Names)
        .Include(q => q.Items).ThenInclude(q => q.CommonProperties).ThenInclude(q => q.Descriptions)
        .Include(q => q.Items).ThenInclude(q => q.CommonProperties).ThenInclude(q => q.RelatedContent)
        .Include(q => q.Items).ThenInclude(q => q.CommonProperties).ThenInclude(q => q.Genres)
        .Include(q => q.Items).ThenInclude(q => q.CommonProperties).ThenInclude(q => q.Preview)
        .AsQueryable();

    internal async Task<IEnumerable<AnimeTitle>> GetAllAsync() => await QueryFullIncludes().ToListAsync();

    internal async Task<AnimeTitle> GetFirstWhere(Expression<Func<AnimeTitle, bool>> predicate) =>
        await QueryFullIncludes().FirstAsync(predicate);

    internal async Task UpdateAsync(AnimeTitle animeTitle)
    {
        var dbTitle = await GetFirstWhere(q => q.Id == animeTitle.Id);
        CommonPropertiesHelper.SyncCommonProperties(dbTitle.CommonProperties, animeTitle.CommonProperties);
        //NOT UPDATE INNER ITEMS
        dbTitle.ExpirationTime = animeTitle.ExpirationTime;
        dbTitle.Completed = animeTitle.Completed;
        await _context.SaveChangesAsync();
    }

    //protected override async Task<bool> SoftDeleteAsync(AnimeTitle entity)
    //{
    //    entity.Deleted = true;
    //    return await UpdateAsync(entity);
    //}

    /*
    public async Task AddAsync(Domain.Entities.MediaContent.Items.Anime.AnimeTitle entity, IUser user) =>
        await AddAsync(ToDbConverter.Title(entity));

    public Task<bool> AnyWhere(Expression<Func<Domain.Entities.MediaContent.Items.Anime.AnimeTitle, bool>> predicate)
    {
        var p = predicate.
    }

    public Task<bool> DeleteAsync(Domain.Entities.MediaContent.Items.Anime.AnimeTitle entity, IUser user)
    {
        throw new NotImplementedException();
    }

    public Task<Domain.Entities.MediaContent.Items.Anime.AnimeTitle> GetByIdAsync(string id)
    {
        throw new NotImplementedException();
    }

    public Task<Domain.Entities.MediaContent.Items.Anime.AnimeTitle?> GetByIdOrDefaultAsync(string id)
    {
        throw new NotImplementedException();
    }

    public Task<Domain.Entities.MediaContent.Items.Anime.AnimeTitle?> GetFirstOrDefaultWhere(Expression<Func<Domain.Entities.MediaContent.Items.Anime.AnimeTitle, bool>> predicate)
    {
        throw new NotImplementedException();
    }

    public Task<Domain.Entities.MediaContent.Items.Anime.AnimeTitle> GetFirstWhere(Expression<Func<Domain.Entities.MediaContent.Items.Anime.AnimeTitle, bool>> predicate)
    {
        throw new NotImplementedException();
    }

    public Task<List<Domain.Entities.MediaContent.Items.Anime.AnimeTitle>> GetRangeByIdsAsync(List<string> ids)
    {
        throw new NotImplementedException();
    }

    public Task<List<Domain.Entities.MediaContent.Items.Anime.AnimeTitle>> GetWhere(Expression<Func<Domain.Entities.MediaContent.Items.Anime.AnimeTitle, bool>> predicate)
    {
        throw new NotImplementedException();
    }

    public Task<bool> UpdateAsync(Domain.Entities.MediaContent.Items.Anime.AnimeTitle entity, IUser user)
    {
        throw new NotImplementedException();
    }

    Task<List<Domain.Entities.MediaContent.Items.Anime.AnimeTitle>> Application.Gateways.IRepository<Domain.Entities.MediaContent.Items.Anime.AnimeTitle, string>.GetAllAsync()
    {
        throw new NotImplementedException();
    }
    */
}