<?php
namespace App\Repository;

use App\Entity\ActorEntity;
use App\Enum\StatusEnum;
use Doctrine\Common\Collections\Criteria;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Query;
use Doctrine\ORM\QueryBuilder;
use Doctrine\ORM\Query\Expr\Join;
use App\Entity\ActivityEntity;

/**
 * Repository for workspaces
 */
class ActivityRepository extends EntityRepository
{

    /** @var array Default sorting */
    public const DEFAULT_ORDER = [
        'name' => 'asc',
    ];

    /**
     * {@inheritdoc}
     */
    public function find($id, $lockMode = null, $lockVersion = null): ?ActivityEntity
    {
        return parent::find($id, $lockMode, $lockVersion);
    }

    /**
     * {@inheritdoc}
     */
    public function findBy(array $criteria, ?array $orderBy = self::DEFAULT_ORDER, $limit = null, $offset = null)
    {
        return parent::findBy($criteria, $orderBy, $limit, $offset);
    }

    /**
     * {@inheritdoc}
     */
    public function createQueryBuilder($alias, $indexBy = null): QueryBuilder
    {
        $queryBuilder = parent::createQueryBuilder($alias, $indexBy);
        foreach ($this::DEFAULT_ORDER as $field => $order) {
            $queryBuilder->addOrderBy($alias . '.' . $field, $order);
        }

        return $queryBuilder;
    }

    /**
     * Find active activities of followed actors
     *
     * @return array
     */
    public function findActiveFollowed(): array
    {
        // Create criteria
        $criteria = new Criteria();
        $criteria->andWhere($criteria->expr()
            ->eq('actor.followed', true));
        $criteria->andWhere($criteria->expr()
            ->in('activity.status', StatusEnum::ACTIVE_STATUS));

        $query = $this->createQueryBuilder('activity');
        $query->join(ActorEntity::class, 'actor', Join::WITH, 'activity.actor = actor');
        $query->addCriteria($criteria);

        return $query->getQuery()->execute([], Query::HYDRATE_OBJECT);
    }
}