using CMSMicroservice.Application.Common.Exceptions;
using CMSMicroservice.Application.Common.Interfaces;
using CMSMicroservice.Domain.Entities.Content;
using MediatR;
using Microsoft.EntityFrameworkCore;

namespace CMSMicroservice.Application.SitePageCQ.Queries.GetSitePage;

public class GetSitePageQueryHandler : IRequestHandler<GetSitePageQuery, SitePageDto>
{
    private readonly IApplicationDbContext _context;

    public GetSitePageQueryHandler(IApplicationDbContext context)
    {
        _context = context;
    }

    public async Task<SitePageDto> Handle(GetSitePageQuery request, CancellationToken cancellationToken)
    {
        var entity = await _context.SitePages
            .Include(x => x.Sections.Where(s => !s.IsDeleted).OrderBy(s => s.SortOrder))
            .FirstOrDefaultAsync(x => x.Id == request.Id && !x.IsDeleted, cancellationToken);

        if (entity == null)
            throw new NotFoundException(nameof(SitePage), request.Id);

        return MapToDto(entity);
    }

    internal static SitePageDto MapToDto(SitePage entity)
    {
        return new SitePageDto
        {
            Id = entity.Id,
            PageKey = entity.PageKey,
            Title = entity.Title,
            MetaDescription = entity.MetaDescription,
            HeroTitle = entity.HeroTitle,
            HeroSubtitle = entity.HeroSubtitle,
            HeroImagePath = entity.HeroImagePath,
            IsActive = entity.IsActive,
            Created = entity.Created,
            LastModified = entity.LastModified,
            Sections = entity.Sections.Select(s => new SitePageSectionDto
            {
                Id = s.Id,
                SectionKey = s.SectionKey,
                Title = s.Title,
                Subtitle = s.Subtitle,
                HtmlContent = s.HtmlContent,
                IconName = s.IconName,
                ImagePath = s.ImagePath,
                SortOrder = s.SortOrder,
                IsActive = s.IsActive,
                ExtraData = s.ExtraData
            }).ToList()
        };
    }
}
