using Microsoft.EntityFrameworkCore;

namespace ImageBoardServerApp.Data.Repository;

public static class UsersRepository
{
    public static async Task<List<UserData>> getUsersAsync()
    {
        await using var db = new AppDBContext();
        return await db.Users
            .Include(user => user.SubmittedReports)
            .Include(user => user.RecivedReports)
            .Include(user => user.Comments)
            .Include(user => user.Posts)
            .ToListAsync();
    }

    public static async Task<UserData> getUserByIdAsync(int userId)
    {
        await using var db = new AppDBContext();
        return await db.Users
            .Where(user => user.UserID == userId)
            .Include(user => user.SubmittedReports)
            .Include(user => user.Posts)
            .Include(user => user.Comments)
            .Include(user => user.RecivedReports)
            .FirstOrDefaultAsync();
    }

    public static async Task<UserData> getUserByIdLiteAsync(int userId)
    {
        await using var db = new AppDBContext();
        return await db.Users
            .Where(x => x.UserID == userId)
            .FirstOrDefaultAsync();
    }

    public static async Task<UserData> getUserByEmailRawAsync(string email)
    {
        await using var db = new AppDBContext();
        return await db.Users
            .Where(user => user.Email == email)
            .FirstOrDefaultAsync();
    }

    public static async Task<UserData> getUserByEmailAsync(string email)
    {
        await using var db = new AppDBContext();
        return await db.Users
            .Where(user => user.Email == email)
            .Include(user => user.SubmittedReports)
            .Include(user => user.Posts)
            .Include(user => user.Comments)
            .Include(user => user.RecivedReports)
            .FirstOrDefaultAsync();
    }

    public static async Task<int> createUserAsync(UserData userToCreate)
    {
        await using var db = new AppDBContext();
        await db.Users.AddAsync(userToCreate);
        if (await db.SaveChangesAsync() >= 1)
        {
            Console.WriteLine($"Created user with ID: {userToCreate.UserID}");
            return userToCreate.UserID;
        }

        return -1;
    }

    public static async Task<bool> updateUserAsync(UserData userToUpdate)
    {
        await using var db = new AppDBContext();
        db.Users.Update(userToUpdate);
        return await db.SaveChangesAsync() >= 1;
    }

    public static async Task<bool> deleteUserAsync(int userId)
    {
        await using var db = new AppDBContext();
        UserData userToDelete = await getUserByIdAsync(userId);
        db.Remove(userToDelete);
        return await db.SaveChangesAsync() >= 1;
    }
}