using CMSMicroservice.Application.Common.Interfaces;

namespace CMSMicroservice.Application.PublicMessageCQ.Commands.PublishMessage;

public class PublishMessageCommandHandler : IRequestHandler<PublishMessageCommand, PublishMessageResponseDto>
{
    private readonly IApplicationDbContext _context;
    private readonly ILogger<PublishMessageCommandHandler> _logger;

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

    public async Task<PublishMessageResponseDto> Handle(PublishMessageCommand request, CancellationToken cancellationToken)
    {
        // TODO: پیاده‌سازی انتشار پیام
        // 1. پیدا کردن پیام:
        //    - var message = await _context.PublicMessages
        //        .FirstOrDefaultAsync(m => m.Id == request.MessageId, cancellationToken)
        //    - بررسی null و پرتاب NotFoundException
        //
        // 2. بررسی شرایط انتشار:
        //    - اگر قبلاً منتشر شده: 
        //      if (message.IsActive && message.PublishedAt.HasValue)
        //        return موفقیت با پیام "این پیام قبلاً منتشر شده است"
        //    - اگر آرشیو شده:
        //      if (message.IsArchived)
        //        throw new InvalidOperationException("پیام آرشیو شده قابل انتشار نیست")
        //
        // 3. فعال‌سازی پیام:
        //    - message.IsActive = true
        //    - message.PublishedAt = DateTime.Now
        //    - اگر StartDate خالی است، از الان شروع کن:
        //      if (!message.StartDate.HasValue)
        //        message.StartDate = DateTime.Now
        //
        // 4. ذخیره و Log:
        //    - await _context.SaveChangesAsync(cancellationToken)
        //    - _logger.LogInformation("Public message {MessageId} published: {Title}", message.Id, message.Title)
        //
        // 5. برگشت Response:
        //    - return new PublishMessageResponseDto {
        //        Success = true,
        //        Message = "پیام با موفقیت منتشر شد",
        //        PublishedAt = message.PublishedAt
        //      }
        //
        // نکته: پس از publish، پیام برای کاربران قابل مشاهده می‌شود (GetActiveMessages)

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