<?php

namespace App\Controller;

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

class ScreenController extends Controller
{
    /**
     * @Route("/screen", name="screen")
     */
    public function index()
    {
        $groups = $this->getDoctrine()->getRepository(GradingGroup::class)->findBy(
            ['status' =>  [GradingGroup::STATUS_PLAYING, GradingGroup::STATUS_FINISHED]]);
        return $this->render('screen/index.html.twig', [
            'groups' => $groups,
        ]);
    }

    /**
     * @Route("/screen/{group}", name="groupScreen")
     */
    public function groupScreen(GradingGroup $group)
    {
        $playingPlayer = $this->playingPlayer($group);
        $finishedPlayers = $this->finishedPlayers($group);

        if($group->getStatus() == 'completed' && !$this->isGranted('ROLE_SUPER_ADMIN')) {
            return $this->render('screen/completed.html.twig');
        }

        if(!$playingPlayer && !$finishedPlayers) {
            return $this->render('screen/waiting.html.twig');
        }
        return $this->render('screen/screen.html.twig', [
            'player' => $playingPlayer,
            'finishedPlayers' => $finishedPlayers,
            'group' => $group,
        ]);


    }

    private function playingPlayer($ggroup)
    {
        $players = array_filter(
            $ggroup->getPlayers()->toArray(),
            function ($player) {
                return (
                    $player->getStatus() == Player::STATUS_PLAYING
                ||  $player->getStatus() == Player::STATUS_FINISHED
                );
            }
        );
        $player = array_values($players);
        if( isset($player[0]) && $player[0] instanceof Player) {
            return $player[0];

        }

        return null;
    }

    private function finishedPlayers($ggroup)
    {
        $players = array_filter(
            $ggroup->getPlayers()->toArray(),
            function ($player) {
                return ($player->getStatus() == Player::STATUS_COMPLETED);
            }
        );
        $players = array_values($players);
        if(count($players) > 0 ) {
            usort($players, function ($a, $b) { return ($a->getRankValue() - $b->getRankValue()) >=0 ? 1 : -1;});
            return array_values($players);
        }
        return null;
    }
}
