<?php

namespace App\Controller;

use App\Entity\GradingGroup;
use App\Entity\Player;
use App\Entity\User;
use App\Service\TiebreakerService;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Routing\Annotation\Route;

class PoolController extends Controller
{
    private $tiebreakerService;

    public function __construct(TiebreakerService $tiebreakerService)
    {
        $this->tiebreakerService = $tiebreakerService;
    }

    /**
     * @Route("/group", name="pool")
     */
    public function index()
    {
        $groups = $this->getUser()->getGgroups();

        if($this->isGranted('ROLE_SUPER_ADMIN')) {
            $groups = $this->getDoctrine()->getRepository(GradingGroup::class)->findAll();
        }
        return $this->render('pool/index.html.twig', [
            'groups' => $groups,
        ]);
    }

    /**
     * @Route("/group/{group}/start", name="poolStart")
     */
    public function start(GradingGroup $group)
    {

        /** toDo
     *check all the judges are available
     */
        $group->setStatus('playing');
        $em = $this->getDoctrine()->getManager();
        $em->persist($group);
        $em->flush();
        return $this->redirect('/group/'.$group->getId());
    }

    /**
     * @Route("/group/{group}/report", name="poolReport")
     */
    public function report(GradingGroup $group)
    {
//        if(($group->getStatus() == GradingGroup::STATUS_COMPLETED) && !$this->isGranted(User::ROLE_SUPER_ADMIN)) {
//            return $this->redirect('/group');
//        }

        $rankedPlayers = $group->getPlayers()->toArray();
        usort($rankedPlayers, function ($a, $b) { return ($a->getRankValue() - $b->getRankValue()) >=0 ? 1 : -1;});
        return $this->render('pool/report.html.twig', [
            'group' => $group,
            'rankedPlayers' => $rankedPlayers
        ]);
    }    

    /**
     * @Route("/group/{group}", name="poolDetails")
     */
    public function details(GradingGroup $group)
    {
//        if(($group->getStatus() == GradingGroup::STATUS_COMPLETED) && !$this->isGranted(User::ROLE_SUPER_ADMIN)) {
//            return $this->redirect('/group');
//        }

        return $this->render('pool/details.html.twig', [
            'group' => $group,
        ]);
    }

    /**
     * @Route("/group/{group}/submit", name="poolSubmit")
     */
    public function submitStatus(GradingGroup $group)
    {
        $this->checkAndUpdteGroupStatus($group);
        return $this->redirect('/group');
    }

    private function checkAndUpdteGroupStatus($group)
    {
        $em = $this->getDoctrine()->getManager();

        if($this->isGroupEvaluationCompleted($group)) {
            $group->setStatus(GradingGroup::STATUS_FINISHED);
            $em->persist($group);
            $em->flush();

            $finishedPlayer = $em->getRepository(Player::class)->findOneBy([
                'status' => Player::STATUS_FINISHED,
                'ggroup' => $group->getId()
            ]);

            if($finishedPlayer instanceof Player) {
                $finishedPlayer->setStatus(Player::STATUS_COMPLETED);
                $em->persist($finishedPlayer);
                $em->flush();
                $this->tiebreakerService->generateRanksForGroup($group);
            }

            $this->addFlash(
                'info',
                'Group completed successfully.'
            );
        }
    }
    private function isGroupEvaluationCompleted($group)
    {
        $players = $group->getPlayers();

        $pendingPlayers = array_filter($players->toArray(),function($player){
            if(in_array($player->getStatus(), [Player::STATUS_PENDING, Player::STATUS_PLAYING])) {
                return true;
            }else {
                return false;
            }

        });

        return count($pendingPlayers) == 0 ;
    }
}
