<?php

declare(strict_types=1);

namespace App\Domain\Media;

use App\Framework\Database\EntityManager;

final readonly class ImageSlotRepository
{
    public function __construct(
        private EntityManager $entityManager
    ) {
    }

    public function getSlots(): array
    {
        return $this->entityManager->findAll(ImageSlot::class);
    }

    public function findBySlotName(string $slotName): ImageSlot
    {
        return $this->entityManager->findOneBy(ImageSlot::class, ['slot_name' => $slotName]);
    }

    public function findById(string $id): ImageSlot
    {
        return $this->entityManager->find(ImageSlot::class, $id);
    }

    public function save(ImageSlot $imageSlot): object
    {
        return $this->entityManager->save($imageSlot);
    }

    /**
     * @return array<int, ImageSlotView>
     */
    public function findAllWithImages(): array
    {
        $slots = $this->entityManager->findAll(ImageSlot::class);

        return array_map(function (ImageSlot $slot) {
            $image = null;
            if ($slot->imageId) {
                $image = $this->entityManager->find(Image::class, $slot->imageId);
            }

            return ImageSlotView::fromSlot($slot, $image);
        }, $slots);
    }

    public function findByIdWithImage(string $id): ImageSlotView
    {
        $slot = $this->entityManager->find(ImageSlot::class, $id);

        if (! $slot) {
            throw new \RuntimeException("ImageSlot with ID {$id} not found");
        }

        $image = null;
        if ($slot->imageId) {
            $image = $this->entityManager->find(Image::class, $slot->imageId);
        }

        return ImageSlotView::fromSlot($slot, $image);
    }

    public function updateImageId(string $slotId, string $imageId): void
    {
        $slot = $this->findById($slotId);
        #$slot->imageId = $imageId;

        $slot = new ImageSlot(
            $slot->id,
            $slot->slotName,
            $imageId
        );

        $this->entityManager->save($slot);
    }
}
