<?php

namespace App\Domain\Manga\Application\QueryHandler;

use App\Domain\Manga\Application\Query\GetMangaById;
use App\Domain\Manga\Application\Response\MangaResponse;
use App\Domain\Manga\Domain\Contract\Repository\MangaRepositoryInterface;
use App\Domain\Manga\Domain\Exception\MangaNotFoundException;

readonly class GetMangaByIdHandler
{
    public function __construct(
        private MangaRepositoryInterface $mangaRepository
    ) {
    }

    public function handle(GetMangaById $query): MangaResponse
    {
        $manga = $this->mangaRepository->findById($query->id);

        if (!$manga) {
            throw new MangaNotFoundException();
        }

        return new MangaResponse(
            id: $manga->getId()->getValue(),
            title: $manga->getTitle()->getValue(),
            slug: $manga->getSlug()->getValue(),
            alternativeSlugs: $manga->getAlternativeSlugs(),
            description: $manga->getDescription(),
            author: $manga->getAuthor(),
            publicationYear: $manga->getPublicationYear(),
            genres: $manga->getGenres(),
            status: $manga->getStatus(),
            externalId: $manga->getExternalId()?->getValue(),
            imageUrl: $manga->getImageUrl(),
            thumbnailUrl: $manga->getImageUrls()?->getThumbnail(),
            rating: $manga->getRating(),
            monitored: $manga->isMonitoringEnabled()
        );
    }
}
