using AutoMapper;
using DocumentOperator.Application.Common.DTOs;
using DocumentOperator.Application.Common.Interfaces;
using MediatR;

namespace DocumentOperator.Application.ValidatePdf.Queries;

/// <summary>
/// Query for PDF validation (supports both byte array and Base64 input)
/// </summary>
public record ValidatePdfQuery : IRequest<PdfValidationResult>
{
    /// <summary>
    /// PDF as byte array (direct upload)
    /// </summary>
    public byte[]? PdfBytes { get; init; }

    /// <summary>
    /// PDF as Base64 string (API clients)
    /// </summary>
    public string? Base64Pdf { get; init; }
}

/// <summary>
/// Handler for ValidatePdfQuery
/// Orchestrates PDF validation using IPdfProcessor and AutoMapper
/// </summary>
public class ValidatePdfQueryHandler(IPdfProcessor PdfProcessor, IMapper Mapper) 
    : IRequestHandler<ValidatePdfQuery, PdfValidationResult>
{
    /// <summary>
    /// Validates PDF and returns metadata
    /// </summary>
    public async Task<PdfValidationResult> Handle(ValidatePdfQuery request, CancellationToken cancellationToken)
    {
        // Use byte[] if available, otherwise convert Base64
        byte[] pdfBytes = request.PdfBytes ?? Convert.FromBase64String(request.Base64Pdf!);

        // Call DevExpress service (can throw PdfProcessingException)
        var metadata = await PdfProcessor.ValidateAsync(pdfBytes);

        // Map domain entity to DTO using AutoMapper
        return Mapper.Map<PdfValidationResult>(metadata);
    }
}
