<?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.
 */

/** @noinspection PhpFullyQualifiedNameUsageInspection */
namespace WapplerSystems\BookmarksLikesRatings\Domain\Validator;

use WapplerSystems\BookmarksLikesRatings\Domain\Model\Stepconf;
use WapplerSystems\BookmarksLikesRatings\Domain\Model\Stepname;
use TYPO3\CMS\Extbase\Utility\LocalizationUtility;
use TYPO3\CMS\Extbase\Validation\Validator\AbstractValidator;

/**
 * A validator for Ratings
 *
 * @copyright Copyright belongs to the respective authors
 * @scope singleton
 */
class StepnameValidator extends AbstractValidator
{
    /**
     * @var \WapplerSystems\BookmarksLikesRatings\Domain\Repository\StepnameRepository
     */
    protected $stepnameRepository;

    /**
     * @param \WapplerSystems\BookmarksLikesRatings\Domain\Repository\StepnameRepository $stepnameRepository
     */
    public function injectStepnameRepository(\WapplerSystems\BookmarksLikesRatings\Domain\Repository\StepnameRepository $stepnameRepository)
    {
        $this->stepnameRepository = $stepnameRepository;
    }

    /**
     * If the given step is valid
     *
     * @param \WapplerSystems\BookmarksLikesRatings\Domain\Model\Stepname $stepname
     * @throws \TYPO3\CMS\Extbase\Persistence\Exception\InvalidQueryException
     */
    protected function isValid($stepname): void
    {
        //a stepname object must have a stepconf
        if (!$stepname->getStepconf() instanceof Stepconf) {
            $this->addError(
                LocalizationUtility::translate('error.validator.stepname.stepconf', 'ThRating'),
                1382895072
            );
        }

        //check if given languagecode exists in website
        if (!$this->stepnameRepository->checkStepnameLanguage($stepname)) {
            $this->addError(LocalizationUtility::translate('error.validator.stepname.sysLang', 'ThRating'), 1382895089);
        }

        //now check if entry for default language exists
        $langUid = $stepname->getSysLanguageUid();
        if (!empty($langUid)) {
            $defaultStepname = $this->stepnameRepository->findDefaultStepname($stepname);
            if (get_class($defaultStepname) !== Stepname::class || $this->validate($defaultStepname)->hasErrors()) {
                $this->addError(
                    LocalizationUtility::translate('error.validator.stepname.defaultLang', 'ThRating'),
                    1382895097
                );
            }
        }
    }
}