<?php

namespace Doctrine\Bundle\DoctrineBundle\Repository;

use Doctrine\ORM\EntityRepository;
use Doctrine\Persistence\ManagerRegistry;
use LogicException;
use Symfony\Component\VarExporter\LazyGhostTrait;

use function sprintf;
use function trait_exists;

if (trait_exists(LazyGhostTrait::class)) {
    /**
     * @template T of object
     * @template-extends LazyServiceEntityRepository<T>
     */
    class ServiceEntityRepository extends LazyServiceEntityRepository
    {
    }
} else {
    /**
     * Optional EntityRepository base class with a simplified constructor (for autowiring).
     *
     * To use in your class, inject the "registry" service and call
     * the parent constructor. For example:
     *
     * class YourEntityRepository extends ServiceEntityRepository
     * {
     *     public function __construct(ManagerRegistry $registry)
     *     {
     *         parent::__construct($registry, YourEntity::class);
     *     }
     * }
     *
     * @template T of object
     * @template-extends EntityRepository<T>
     */
    class ServiceEntityRepository extends EntityRepository implements ServiceEntityRepositoryInterface
    {
        /**
         * @param string $entityClass The class name of the entity this repository manages
         * @psalm-param class-string<T> $entityClass
         */
        public function __construct(ManagerRegistry $registry, string $entityClass)
        {
            $manager = $registry->getManagerForClass($entityClass);

            if ($manager === null) {
                throw new LogicException(sprintf(
                    'Could not find the entity manager for class "%s". Check your Doctrine configuration to make sure it is configured to load this entity’s metadata.',
                    $entityClass
                ));
            }

            parent::__construct($manager, $manager->getClassMetadata($entityClass));
        }
    }
}
