using CMSMicroservice.Application.Common.Interfaces;

namespace CMSMicroservice.Application.PublicMessageCQ.Commands.ArchiveMessage;

public class ArchiveMessageCommandHandler : IRequestHandler<ArchiveMessageCommand, ArchiveMessageResponseDto>
{
    private readonly IApplicationDbContext _context;
    private readonly ILogger<ArchiveMessageCommandHandler> _logger;

    public ArchiveMessageCommandHandler(
        IApplicationDbContext context,
        ILogger<ArchiveMessageCommandHandler> logger)
    {
        _context = context;
        _logger = logger;
    }

    public async Task<ArchiveMessageResponseDto> Handle(ArchiveMessageCommand request, CancellationToken cancellationToken)
    {
        // TODO: پیاده‌سازی آرشیو پیام
        // 1. پیدا کردن پیام:
        //    - var message = await _context.PublicMessages
        //        .FirstOrDefaultAsync(m => m.Id == request.MessageId, cancellationToken)
        //    - بررسی null و پرتاب NotFoundException
        //
        // 2. بررسی وضعیت:
        //    - اگر قبلاً آرشیو شده:
        //      if (message.IsArchived)
        //        return موفقیت با پیام "این پیام قبلاً آرشیو شده است"
        //
        // 3. آرشیو کردن:
        //    - message.IsArchived = true
        //    - message.IsActive = false  // غیرفعال هم می‌شود
        //    - message.ArchivedAt = DateTime.Now
        //
        // 4. ذخیره و Log:
        //    - await _context.SaveChangesAsync(cancellationToken)
        //    - _logger.LogInformation("Public message {MessageId} archived: {Title}", message.Id, message.Title)
        //
        // 5. برگشت Response:
        //    - return new ArchiveMessageResponseDto {
        //        Success = true,
        //        Message = "پیام با موفقیت آرشیو شد",
        //        ArchivedAt = message.ArchivedAt
        //      }
        //
        // نکته: پیام‌های آرشیو شده دیگر در GetActiveMessages نمایش داده نمی‌شوند
        // نکته: می‌توان پیام‌های آرشیو شده را در یک query جداگانه GetArchivedMessages دریافت کرد

        throw new NotImplementedException("ArchiveMessage needs implementation");
    }
}
