using System.Linq;
using CMSMicroservice.Protobuf.Protos.BlogPostImage;
using CMSMicroservice.WebApi.Common.Services;
using CMSMicroservice.Application.BlogPostImageCQ.Commands.AddBlogPostImage;
using CMSMicroservice.Application.BlogPostImageCQ.Commands.DeleteBlogPostImage;
using CMSMicroservice.Application.BlogPostImageCQ.Commands.ReorderBlogPostImages;
using CMSMicroservice.Application.BlogPostImageCQ.Queries.GetBlogPostImages;
using Google.Protobuf.WellKnownTypes;
using Grpc.Core;
using MediatR;

namespace CMSMicroservice.WebApi.Services;

public class BlogPostImageService : BlogPostImageContract.BlogPostImageContractBase
{
    private readonly ISender _sender;
    private readonly IDispatchRequestToCQRS _dispatchRequestToCQRS;

    public BlogPostImageService(ISender sender, IDispatchRequestToCQRS dispatchRequestToCQRS)
    {
        _sender = sender;
        _dispatchRequestToCQRS = dispatchRequestToCQRS;
    }

    public override async Task<AddBlogPostImageResponse> AddBlogPostImage(AddBlogPostImageRequest request, ServerCallContext context)
    {
        return await _dispatchRequestToCQRS.Handle<AddBlogPostImageRequest, AddBlogPostImageCommand, AddBlogPostImageResponse>(request, context);
    }

    public override async Task<Empty> DeleteBlogPostImage(DeleteBlogPostImageRequest request, ServerCallContext context)
    {
        return await _dispatchRequestToCQRS.Handle<DeleteBlogPostImageRequest, DeleteBlogPostImageCommand>(request, context);
    }

    public override async Task<GetBlogPostImagesResponse> GetBlogPostImages(GetBlogPostImagesRequest request, ServerCallContext context)
    {
        var query = new GetBlogPostImagesQuery { BlogPostId = request.BlogPostId };
        var result = await _sender.Send(query, context.CancellationToken);

        var response = new GetBlogPostImagesResponse();
        foreach (var item in result)
        {
            response.Images.Add(new BlogPostImageItem
            {
                Id = item.Id,
                BlogPostId = item.BlogPostId,
                ImagePath = item.ImagePath ?? string.Empty,
                ThumbnailPath = item.ThumbnailPath ?? string.Empty,
                AltText = item.AltText,
                Caption = item.Caption,
                SortOrder = item.SortOrder
            });
        }

        return response;
    }

    public override async Task<Empty> ReorderBlogPostImages(ReorderBlogPostImagesRequest request, ServerCallContext context)
    {
        var command = new ReorderBlogPostImagesCommand
        {
            Items = request.Items.Select(x => new Application.BlogPostImageCQ.Commands.ReorderBlogPostImages.ImageSortItem
            {
                Id = x.Id,
                SortOrder = x.SortOrder
            }).ToList()
        };

        await _sender.Send(command, context.CancellationToken);
        return new Empty();
    }
}
