#nullable disable
using Microsoft.EntityFrameworkCore;
using Ellie.Db.Models;

namespace Ellie.Db;

public static class ClubExtensions
{
    private static IQueryable<ClubInfo> Include(this DbSet<ClubInfo> clubs)
        => clubs.Include(x => x.Owner)
            .Include(x => x.Applicants)
            .ThenInclude(x => x.User)
            .Include(x => x.Bans)
            .ThenInclude(x => x.User)
            .Include(x => x.Members)
            .AsQueryable();

    public static ClubInfo GetByOwner(this DbSet<ClubInfo> clubs, ulong userId)
        => Include(clubs).FirstOrDefault(c => c.Owner.UserId == userId);

    public static ClubInfo GetByOwnerOrAdmin(this DbSet<ClubInfo> clubs, ulong userId)
        => Include(clubs)
            .FirstOrDefault(c => c.Owner.UserId == userId || c.Members.Any(u => u.UserId == userId && u.IsClubAdmin));

    public static ClubInfo GetByMember(this DbSet<ClubInfo> clubs, ulong userId)
        => Include(clubs).FirstOrDefault(c => c.Members.Any(u => u.UserId == userId));

    public static ClubInfo GetByName(this DbSet<ClubInfo> clubs, string name)
        => Include(clubs)
            .FirstOrDefault(c => c.Name == name);

    public static List<ClubInfo> GetClubLeaderboardPage(this DbSet<ClubInfo> clubs, int page)
        => clubs.AsNoTracking().OrderByDescending(x => x.Xp).Skip(page * 9).Take(9).ToList();
}