<?php
namespace App\Controller;
use App\Entity\Answear;
use App\Entity\MemoryGame;
use App\Entity\Question;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\StreamedResponse;
/**
* Class QuizController
* @package App\Controller
* @Route("/quiz")
*/
class QuizController extends AbstractController
{
public $questionCount = 6;
/**
* @Route("/", name="app_quiz_info")
*/
public function info(): Response
{
$quizNr = $this->getQuizNr();
$em = $this->getDoctrine()->getManager();
$answear = $em
->getRepository(Answear::class)
->findOneBy(['user' => $this->getUser()]);
if ($answear instanceof Answear && $answear->getEnd()) {
$memory = $em
->getRepository(MemoryGame::class)
->findOneBy(['user' => $this->getUser()]);
if ($memory instanceof MemoryGame && $memory->getEnd()) {
return new RedirectResponse($this->get('router')->generate('app_summary'));
} else {
$points = $answear->getPoints();
//$time = $answear->getEnd() - $answear->getStart();
//$place = $em->getRepository(Answear::class)->getMyPosition($quizNr, $this->getUser()->getId());
$ansU = [];
$questions = [];
foreach ($em->getRepository(Question::class)->findBy(['quiz' =>$answear->getQuiz()], ['number' => 'ASC']) as $q) {
$questions[$q->getNumber()] = $q;
}
$num = unserialize($answear->getQuestionsStart());
$ans = unserialize($answear->getAnswear());
foreach ($num as $k=>$n) {
if ($questions[$n]->getGoodAnswear() == $ans[$k]) {
$ansU[$k] = 1;
}
else {
$ansU[$k] = 0;
}
}
// $answears = $em
// ->getRepository(Answear::class)
// ->findBy(['user' => $this->getUser()]);
// $lastAns =[];
// foreach($answears as $a) {
// if($a->getQuiz()!=$quizNr) {
// $lastAns[$a->getQuiz()]['quiz'] = $a->getQuiz();
// $lastAns[$a->getQuiz()]['points'] = $a->getPoints();
// $lastAns[$a->getQuiz()]['time'] = round($a->getEnd() - $a->getStart(),3);
// $lastAns[$a->getQuiz()]['place']= $em->getRepository(Answear::class)->getMyPosition($a->getQuiz(), $this->getUser()->getId());
// }
// }
return $this->render('page/quiz.html.twig', [
'quiz' => $quizNr,
'points' => $points,
// 'time' => round($time, 3),
//'place' => $place,
// 'lastAns' => $lastAns,
'answear' => $answear,
'ansU' => $ansU
]);
}
} else {
return $this->render('page/start-quiz.html.twig', [
'answear' => $answear,
'questionCount' => $this->questionCount,
]);
}
}
/**
* @Route("/start", name="app_quiz_start", methods={"POST","PUT"})
*/
public function start(Request $request): Response
{
$submittedToken = $request->request->get('tkn');
if ($this->isCsrfTokenValid('quiz', $submittedToken)) {
} else {
return new JsonResponse(['data' => ['error' => 'Wystąpił błąd autoryzacji. Spróbuj ponownie.']]);
}
if(date('Y-m-d') >='2026-06-15') {
return new JsonResponse(['data' => ['error' => 'Konkurs zakończony. Dziękujemy za udział w zabawie.']]);
}
$em = $this->getDoctrine()->getManager();
$quizNr = $this->getQuizNr();
$answear = $em
->getRepository(Answear::class)
->findOneBy(['user' => $this->getUser(),'quiz' => $quizNr]);
$ret = [];
$qS = [];
// $factory = new PasswordHasherFactory([
// 'common' => ['algorithm' => 'bcrypt'],
// ]);
// $hasher = $factory->getPasswordHasher('common');
if ($answear instanceof Answear) {
$questions = $em
->getRepository(Question::class)
->findBy(['quiz' => $answear->getQuiz()]);
if ($answear->getEnd() > 0) {
return new JsonResponse(['data' => ['error' => 'Ten quiz został już przez Ciebie rozwiązany.']]);
} else {
$qS = unserialize($answear->getQuestionsStart());
if($qS == false || count($qS)) {
$ans = unserialize($answear->getAnswear());
if(count($qS)>$this->questionCount) {
return new JsonResponse(['data' => ['error' => 'Wystąpił nieoczekiwany błąd. Spróbuj ponownie.']]);
}
if($ans == false || count($ans) != count($qS) ) {
foreach ($questions as $q) {
if($qS == false || end($qS) == $q->getNumber()) {
//$ans = array_merge([$q->getGoodAnswear()], explode('|', $q->getBadAnswears()));
$ans = $this->_createHash($q);
shuffle($ans);
$ret = [
'q' => $q->getContent(),
// 'g' => $q->getGoodAnswear(),
'a' => $ans,
'n' => count($qS),
// 'p' => $hasher->verify('$2y$13$DZ7nwFg/Ma.PRGdEhFMBTuV84ZfJi3stYKiETAVFppK2fZC/b4Xyi', $q->getGoodAnswear())
];
}
}
} else {
}
} else {
return new JsonResponse(['data' => ['error' => 'Wystąpił nieoczekiwany błąd. Jeżeli problem się powtarza zgłoś się do BOK.']]);
}
}
} else {
// verify that a given string matches the hash calculated above
// $hasher->verify($hash, 'invalid'); // false
//$quizNr = rand(1,7);
$questions = $em
->getRepository(Question::class)
->findBy(['quiz' => $quizNr]);
shuffle($questions);
$q = array_slice($questions,0,1)[0];
$qS[] = "".$q->getNumber();
// $ans = array_merge([$q->getGoodAnswear().'['.$hasher->hash($q->getGoodAnswear()).']'], explode('|', $q->getBadAnswears()));
//$ans = array_merge([$q->getGoodAnswear()], explode('|', $q->getBadAnswears()));
$ans = $this->_createHash($q);
shuffle($ans);
$ret = [
'q' => $q->getContent(),
// 'g' => $q->getGoodAnswear(),
'a' => $ans,
'n' => 1,
];
$answear = new Answear();
$answear->setUser($this->getUser())
->setStart(microtime(true))
->setQuiz($quizNr)
->setQuestionsStart(serialize($qS));
$em->persist($answear);
$em->flush();
}
return new JsonResponse(['data' => $ret]);
}
/**
* @Route("/next", name="app_quiz_next", methods={"POST","PUT"})
*/
public function next(Request $request): Response
{
$submittedToken = $request->request->get('tkn');
if ($this->isCsrfTokenValid('quiz', $submittedToken)) {
} else {
return new JsonResponse(['data' => ['error' => 'Wystąpił błąd autoryzacji. Spróbuj ponownie.']]);
}
if(date('Y-m-d') >='2026-06-15') {
return new JsonResponse(['data' => ['error' => 'Konkurs zakończony. Dziękujemy za udział w zabawie.']]);
}
$em = $this->getDoctrine()->getManager();
// $quizNr = $this->getQuizNr();
$ret = [];
$answear = $em
->getRepository(Answear::class)
->findOneBy(['user' => $this->getUser()]);
if ($answear instanceof Answear) {
if ($answear->getEnd() > 0) {
return new JsonResponse(['data' => ['error' => 'Ten quiz został już przez Ciebie rozwiązany.']]);
} else {
$userAnswear = $request->request->get('ans');
$questions = $em
->getRepository(Question::class)
->findBy(['quiz' => $answear->getQuiz()]);
$ansTxt = 'send:'.$userAnswear;
foreach($questions as $q) {
$ans = array_merge([$q->getGoodAnswear()], explode('|',$q->getBadAnswears()));
foreach($ans as $i=>$a){
if(md5($a.$this->getUser()->getId()) === $userAnswear) {
$ansTxt = $a;
continue;
}
}
}
$latestAnswears = unserialize($answear->getAnswear());
if($latestAnswears == false) $latestAnswears = [];
$answear->setAnswear(serialize(array_merge($latestAnswears,[$ansTxt])));
$qS = unserialize($answear->getQuestionsStart());
if(count($qS)>5) {
return new JsonResponse(['data' => ['error' => 'Ten quiz został już przez Ciebie rozwiązany.']]);
}
shuffle($questions);
foreach ($questions as $q) {
if(!in_array($q->getNumber(),$qS)) {
$qS[] = "".$q->getNumber();
// $ans = array_merge([$q->getGoodAnswear()], explode('|', $q->getBadAnswears()));
$ans = $this->_createHash($q);
shuffle($ans);
$ret = [
'q' => $q->getContent(),
// 'g' => $q->getGoodAnswear(),
'a' => $ans,
'n' => count($qS)
];
break;
}
}
$answear ->setQuestionsStart(serialize($qS));
$em->flush();
}
} else {
return new JsonResponse(['data' => ['error' => 'Quiz nie został rozpoczęty.']]);
}
return new JsonResponse(['data' => $ret]);
}
/**
* @Route("/end", name="app_quiz_end", methods={"POST","PUT"})
*/
public function end(Request $request): Response
{
$submittedToken = $request->request->get('tkn');
if ($this->isCsrfTokenValid('quiz', $submittedToken)) {
} else {
return new JsonResponse(['data' => ['error' => 'Wystąpił błąd autoryzacji. Spróbuj ponownie.']]);
}
if(date('Y-m-d') >='2026-06-15') {
return new JsonResponse(['data' => ['error' => 'Konkurs zakończony. Dziękujemy za udział w zabawie.']]);
}
$em = $this->getDoctrine()->getManager();
// $quizNr = $this->getQuizNr();
$answear = $em
->getRepository(Answear::class)
->findOneBy(['user' => $this->getUser()]);
if ($answear instanceof Answear) {
if ($answear->getEnd() > 0) {
return new JsonResponse(['data' => ['error' => 'Ten quiz został już przez Ciebie rozwiązany.']]);
}
$endTime = microtime(true);
$questions = [];
foreach ($em->getRepository(Question::class)->findBy(['quiz' => $answear->getQuiz()], ['number' => 'ASC']) as $q) {
$questions[$q->getNumber()] = $q;
}
$userAnswear = $request->request->get('ans');
$ansTxt = 'send:'.$userAnswear;
foreach($questions as $q) {
$ans = array_merge([$q->getGoodAnswear()], explode('|',$q->getBadAnswears()));
foreach($ans as $i=>$a){
if(md5($a.$this->getUser()->getId()) === $userAnswear) {
$ansTxt = $a;
continue;
}
}
}
$latestAnswears = unserialize($answear->getAnswear());
if($latestAnswears == false) $latestAnswears = [];
$ans = array_merge($latestAnswears,[$ansTxt]);
if(count($ans)!=$this->questionCount) {
return new JsonResponse(['data' => ['error' => 'Proszę dokończyć quiz.']]);
}
$points = 0;
$num = unserialize($answear->getQuestionsStart());
foreach ($num as $k=>$n) {
if ($questions[$n]->getGoodAnswear() == $ans[$k]) {
$points += 100;
};
}
$answear->setAnswear(serialize($ans))
->setQuestions(serialize($num))
->setEnd($endTime)
->setPoints($points);
$em->flush();
//$place = $em->getRepository(Answear::class)->getMyPosition($quizNr, $this->getUser()->getId());
// $ret = ['points' => $points, 'place' => $place];
$ret = ['points' => $points];
} else {
// errorr kończy a nie zaczął!!!
$ret = ['error' => 'Wystąpił nieoczekiwany błąd. Spróbuj jeszcze raz.'];
}
return new JsonResponse(['data' => $ret]);
}
protected function getQuizNr()
{
$now = date('Y-m-d');
if ($now < '2026-06-08') {
return 1;
} else if ($now >= '2026-05-18' && $now < '2026-05-25') {
return 2;
} else if ($now >= '2026-05-25' && $now < '2026-06-01') {
return 3;
} else if ($now >= '2026-06-01') {
return 4;
}
return 1;
}
/**
* @Route("/ansimg/{hash}", name="app_quiz_img", methods={"GET"})
*/
public function image(Request $request, $hash): Response
{
$txt = '';
$em = $this->getDoctrine()->getManager();
// $quizNr = $this->getQuizNr();
$questions = $em
->getRepository(Question::class)
->findAll();
foreach($questions as $q) {
$ans = array_merge([$q->getGoodAnswear()], explode('|',$q->getBadAnswears()));
foreach($ans as $i=>$a){
if(md5($a.$this->getUser()->getId()) === $hash) {
$txt = $a;
continue;
}
}
}
putenv('GDFONTPATH=' . realpath('.'));
$im = @imagecreate(300, 24)
or die("Cannot Initialize new GD image stream");
$bg = imagecolorallocate($im, 255, 255, 255);
$text_color = imagecolorallocate($im, 0, 0, 0);
$font = '/UI/img/euro24/font/UEFAEuro-LightNarrow.ttf';
// imagestring($im, 20, 0, 0, $txt, $text_color);
imagettftext($im, 14, 0, 0, 20, $text_color, $font, $txt);
imagecolortransparent($im,$bg);
imagedestroy($im);
return new StreamedResponse(fn () => imagepng($im), 200, ['Content-Type' => 'image/png']);
}
private function _createHash($question) {
$ans = array_merge([$question->getGoodAnswear()], explode('|',$question->getBadAnswears()));
foreach($ans as $i=>$v){
$ans[$i] = md5($v.$this->getUser()->getId());
}
return $ans;
}
}