using System.Security.Claims;
using FastEndpoints;
using Knots.DTO.Discussion;
using Microsoft.EntityFrameworkCore;

namespace Knots.Endpoints.Discussion;

public class GetMyDiscussionEndpoint(KnotsDbContext db) : EndpointWithoutRequest<List<GetDiscussionDto>>
{
    public override void Configure()
    {
        Get("/discussions/my");
    }

    public override async Task HandleAsync(CancellationToken ct)
    {
        int userId = int.Parse(User.FindFirstValue(ClaimTypes.NameIdentifier)!);

        // Discussions privées : l'utilisateur est l'un des participants
        IQueryable<GetDiscussionDto> privees = db.Discussions
            .Where(d => d.GroupId == null && d.UserDiscussions.Any(ud => ud.UserId == userId))
            .Select(d => new GetDiscussionDto
            {
                Id = d.Id,
                IsGroup = false,
                Name = d.UserDiscussions
                    .Where(ud => ud.UserId != userId)
                    .Select(ud => ud.User.Username)
                    .FirstOrDefault() ?? "",
                MembersCount = null
            });

        // Discussions de groupe : l'utilisateur est membre du groupe
        IQueryable<GetDiscussionDto> groupes = db.Discussions
            .Where(d => d.Group != null && d.Group.GroupUsers.Any(gu => gu.UserId == userId))
            .Select(d => new GetDiscussionDto
            {
                Id = d.Id,
                IsGroup = true,
                Name = d.Group!.Name!,
                MembersCount = d.Group.MembersAmount
            });

        List<GetDiscussionDto> discussions = await privees.Concat(groupes).ToListAsync(ct);

        await SendOkAsync(discussions, ct);
    }
}