<?php

/*
 * This file is part of the package thucke/th-rating.
 *
 * For the full copyright and license information, please read the
 * LICENSE file that was distributed with this source code.
 */

namespace WapplerSystems\BookmarksLikesRatings\Domain\Repository;

use WapplerSystems\BookmarksLikesRatings\Domain\Model\Rating;
use WapplerSystems\BookmarksLikesRatings\Domain\Model\Vote;
use WapplerSystems\BookmarksLikesRatings\Domain\Model\Voter;
use TYPO3\CMS\Extbase\Persistence\Repository;

/**
 * A repository for votes
 */
class VoteRepository extends Repository
{
    /**
     * Defines name for function parameter
     */
    public const     /** @noinspection PhpUnused */
        ADD_IF_NOT_FOUND = true;

    /**
     * Initialize this repository
     */
    /** @noinspection PhpUnused */
    public function initializeObject(): void
    {
    }

    /**
     * Finds the voting by giving the rating and voter objects
     *
     * @param    Rating|null $rating   The concerned ratingobject
     * @param    Voter|null $voter     The Uid of the rated row
     * @return   Vote|object     The voting
     */
    public function findMatchingRatingAndVoter($rating = null, $voter = null)
    {
        /** @var \TYPO3\CMS\Extbase\Persistence\QueryInterface $query */
        $query = $this->createQuery();

        return $query->matching(
            $query->logicalAnd(
                [
                    $query->equals('rating', $rating),
                    $query->equals('voter', $voter)
                ]
            )
        )->execute()->getFirst();
    }

    /**
     * Counts all votings by giving the rating and ratingstep
     *
     * @param    Rating $rating The concerned ratingobject
     * @param    \WapplerSystems\BookmarksLikesRatings\Domain\Model\Stepconf $stepconf The stepconf object
     * @return    int
     */
    public function countByMatchingRatingAndVote($rating = null, $stepconf = null): int
    {
        $query = $this->createQuery();
        $query->matching($query->logicalAnd(
            [
                $query->equals('rating', $rating->getUid()),
                $query->equals('vote', $stepconf->getUid())
            ]
        ));

        return count($query->execute());
    }

    /**
     * Counts all anonymous votings by giving the rating and ratingstep
     *
     * @param    Rating $rating The concerned ratingobject
     * @param    \WapplerSystems\BookmarksLikesRatings\Domain\Model\Stepconf $stepconf The stepconf object
     * @param    int $anonymousVoter UID of the anonymous account
     * @return    int
     */
    public function countAnonymousByMatchingRatingAndVote($rating = null, $stepconf = null, $anonymousVoter = null): int
    {
        /** @var int $count */
        $count = 0;

        if ($anonymousVoter !== null) {
            $query = $this->createQuery();
            $query->matching(
                $query->logicalAnd([
                    $query->equals('rating', $rating->getUid()),
                    $query->equals('vote', $stepconf->getUid()),
                    $query->equals('voter', $anonymousVoter),
                ])
            );
            $count = count($query->execute());
        }

        return $count;
    }
}