using Microsoft.EntityFrameworkCore;

namespace ImageBoardServerApp.Data.Repository;

public static class CommentsRepository
{
    public static async Task<List<CommentData>> getCommentsAsync()
    {
        await using var db = new AppDBContext();
        return await db.Comments.ToListAsync();
    }

    public static async Task<List<CommentData>> getCommentsByBoardAsync(string board)
    {
        await using var db = new AppDBContext();
        return await db.Comments
            .Where(comment => comment.Board.Equals(board))
            .Include(comment => comment.Image)
            .ToListAsync();
    }

    public static async Task<CommentData> getCommentByIdAsync(int postId)
    {
        await using var db = new AppDBContext();
        return await db.Comments
            .Where(comment => comment.CommentID == postId)
            .Include(comment => comment.Image)
            .Include(comment => comment.Post)
            .Include(comment => comment.User)
            .Include(comment => comment.Report)
            .FirstOrDefaultAsync();
    }

    public static async Task<CommentData> getCommentByGETAsync(string board, int get)
    {
        await using var db = new AppDBContext();
        return await db.Comments
            .Where(comment => comment.GET == get)
            .Where(comment => comment.Board == board)
            .Include(comment => comment.Image)
            .Include(comment => comment.Post)
            .Include(comment => comment.User)
            .Include(comment => comment.Report)
            .FirstOrDefaultAsync();
    }

    public static async Task deleteCommentFromUser(UserData u)
    {
        await using var db = new AppDBContext();
        var l = db.Users
            .Where(x => x.UserID == u.UserID);
        foreach (var e in l)
            db.Remove(e);
    }

    public static async Task<int> createCommentAsync(CommentData commentData)
    {
        await using var db = new AppDBContext();
        await db.Comments.AddAsync(commentData);
        if (await db.SaveChangesAsync() >= 1)
        {
            Console.WriteLine($"Created comment with ID: {commentData.PostID}");
            return commentData.PostID;
        }

        return -1;
    }

    public static async Task<bool> updateCommentAsync(CommentData commentToUpdate)
    {
        await using var db = new AppDBContext();
        db.Comments.Update(commentToUpdate);
        return await db.SaveChangesAsync() >= 1;
    }

    public static async Task<bool> deleteCommentAsync(int postId)
    {
        await using var db = new AppDBContext();
        CommentData commentToDelete = await getCommentByIdAsync(postId);
        if (commentToDelete.Report != null)
            db.Remove(commentToDelete.Report);
        db.Remove(commentToDelete);
        return await db.SaveChangesAsync() >= 1;
    }
}