namespace CMSMicroservice.Application.NetworkMembershipCQ.Commands.RemoveFromNetwork;

public class RemoveFromNetworkCommandHandler : IRequestHandler<RemoveFromNetworkCommand, Unit>
{
    private readonly IApplicationDbContext _context;
    private readonly ICurrentUserService _currentUser;

    public RemoveFromNetworkCommandHandler(
        IApplicationDbContext context,
        ICurrentUserService currentUser)
    {
        _context = context;
        _currentUser = currentUser;
    }

    public async Task<Unit> Handle(RemoveFromNetworkCommand request, CancellationToken cancellationToken)
    {
        // بررسی وجود کاربر
        var user = await _context.Users
            .FirstOrDefaultAsync(x => x.Id == request.UserId, cancellationToken);

        if (user == null)
        {
            throw new NotFoundException(nameof(User), request.UserId);
        }

        // بررسی اینکه کاربر در شبکه باشد
        if (!user.NetworkParentId.HasValue)
        {
            // اگر قبلاً حذف شده، هیچ کاری نکن (Idempotent)
            return Unit.Value;
        }

        // بررسی وجود فرزندان
        var hasChildren = await _context.Users
            .AnyAsync(x => x.NetworkParentId == request.UserId, cancellationToken);

        if (hasChildren)
        {
            throw new InvalidOperationException(
                $"کاربر با شناسه {request.UserId} دارای فرزند در شبکه است. ابتدا باید فرزندان جابجا یا حذف شوند");
        }

        // ذخیره مقادیر قبلی برای History
        var oldParentId = user.NetworkParentId;
        var oldLegPosition = user.LegPosition;

        // حذف از شبکه (Soft Delete)
        user.NetworkParentId = null;
        user.LegPosition = null;

        _context.Users.Update(user);
        await _context.SaveChangesAsync(cancellationToken);

        // ثبت تاریخچه
        var history = new NetworkMembershipHistory
        {
            UserId = request.UserId,
            OldParentId = oldParentId,
            NewParentId = null,
            OldLegPosition = oldLegPosition,
            NewLegPosition = null,
            Action = NetworkMembershipAction.Remove,
            Reason = request.Reason ?? "حذف از شبکه",
            PerformedBy = "System" // TODO: باید از Current User گرفته شود
        };

        await _context.NetworkMembershipHistories.AddAsync(history, cancellationToken);
        await _context.SaveChangesAsync(cancellationToken);

        return Unit.Value;
    }
}
