<?php

namespace Doctrine\Persistence;

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

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

	/**
	 * @phpstan-return list<T>
	 */
	public function findAll();

	/**
	 * @phpstan-param array<string, mixed> $criteria
	 * @phpstan-param array<string, 'asc'|'desc'|'ASC'|'DESC'>|null $orderBy
	 * @phpstan-param int|null $limit
	 * @phpstan-param int|null $offset
	 * @phpstan-return list<T>
	 */
	public function findBy(array $criteria, ?array $orderBy = null, $limit = null, $offset = null);

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

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

}
