<?php

namespace App\Domain\Scraping\Infrastructure\Persistence;

use App\Domain\Scraping\Domain\Contract\Repository\ChapterRepositoryInterface;
use App\Domain\Scraping\Domain\Exception\ChapterNotFoundException;
use App\Domain\Scraping\Domain\Model\Chapter;
use App\Entity\Chapter as EntityChapter;
use Doctrine\ORM\EntityManagerInterface;

readonly class LegacyChapterRepository implements ChapterRepositoryInterface
{
    public function __construct(
        private EntityManagerInterface $entityManager,
    ) {
    }

    public function getById(string $id): ?Chapter
    {
        $chapterEntity = $this->entityManager->getRepository(EntityChapter::class)->find($id);

        if (!$chapterEntity) {
            return null;
        }

        return new Chapter(
            id: $chapterEntity->getId(),
            mangaId: $chapterEntity->getManga()->getId(),
            chapterNumber: $chapterEntity->getNumber(),
            volumeNumber: $chapterEntity->getVolume(),
        );
    }

    /**
     * @throws ChapterNotFoundException
     */
    public function getByMangaIdAndChapterNumber(string $mangaId, float $chapterNumber): Chapter
    {
        $entity = $this->entityManager->getRepository(EntityChapter::class)->findOneBy([
            'manga' => $mangaId,
            'number' => $chapterNumber
        ]);

        if ($entity === null) {
            throw new ChapterNotFoundException();
        }

        return new Chapter(
            id: $entity->getId(),
            mangaId: $entity->getManga()->getId(),
            chapterNumber: $entity->getNumber(),
            volumeNumber: $entity->getVolume(),
        );
    }
}
