<?php

namespace App\Domain\Manga\Application\QueryHandler;

use App\Domain\Manga\Application\Query\GetMangaBySlug;
use App\Domain\Manga\Application\Response\MangaResponse;
use App\Domain\Manga\Domain\Contract\Repository\MangaRepositoryInterface;
use App\Domain\Manga\Domain\Exception\MangaNotFoundException;
use App\Domain\Manga\Domain\Model\ValueObject\MangaSlug;

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

    public function handle(GetMangaBySlug $query): MangaResponse
    {
        $manga = $this->mangaRepository->findBySlug(new MangaSlug($query->slug));

        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->isMonitored()
        );
    }
}
