<?php

namespace Doctrine\Persistence;

/**
 * @template-covariant TEntityClass of object
 */
interface ObjectRepository
{

	/**
	 * @phpstan-param mixed $id
	 * @phpstan-return TEntityClass|null
	 */
	public function find($id);

	/**
	 * @phpstan-return array<int, TEntityClass>
	 */
	public function findAll();

	/**
	 * @phpstan-param array<string, mixed> $criteria
	 * @phpstan-param array<string, string>|null $orderBy
	 * @phpstan-param int|null $limit
	 * @phpstan-param int|null $offset
	 * @phpstan-return array<int, TEntityClass>
	 */
	public function findBy(array $criteria, ?array $orderBy = null, $limit = null, $offset = null);

	/**
	 * @phpstan-param array<string, mixed> $criteria The criteria.
	 * @phpstan-return TEntityClass|null
	 */
	public function findOneBy(array $criteria);

	/**
	 * @phpstan-return class-string<TEntityClass>
	 */
	public function getClassName();

}
