<?php

class RoundController extends Controller
{
    public function __construct($name, $request)
    {
        parent::__construct($name, $request);
    }

    /**
    * Process incoming request for the /round endpoint
    *
    * @return    Response
    */
    public function processRequest()
    {
        $httpMethod=$this->request->getHttpMethod();
        $uriParams=$this->request->getUriParams();

        switch ($httpMethod) {
            case 'GET':
                // If there is a uriParams, it is the /round/{id} or /round/{id}/user endpoint
                if ($uriParams) {
                    $lenUriParams = count($uriParams);
                    // Check if it is the /round/{id}/user endpoint
                    if (($lenUriParams == 2) && ($uriParams[1]=='user')) {
                        return $this->getUsersInRound($uriParams[0]);
                    }
                    // Nope, it is the /round/{id} endpoint
                    return $this->getRound($uriParams[0]);
                }
                // If there is no uriParams, it is the /round endpoint
                return $this->getAllRounds();
                break;
            case 'POST':
                $body = $this->request->getData();
                return $this->newRound($body);
                break;
            case 'PUT':
                // If there is a uriParams, it is the /round/{id}/action endpoint
                if ($uriParams) {
                    $lenUriParams = count($uriParams);
                    if (($lenUriParams == 2) && ($uriParams[1]=='action')) {
                        $body = $this->request->getData();
                        return $this->updateActions(array_merge($body, ['id'=>$uriParams[0]]));
                    }
                }
                break;
        }
        $message = json_encode(["message" => "unsupported parameters or method in round"]);
        return Response::errorResponse($message);
    }

    /**
    * (GET) Get all rounds in Round table
    *
    * @return    Response
    */
    protected function getAllRounds()
    {
        $rounds = Round::getList();
        $response = Response::okResponse(json_encode($rounds, JSON_PRETTY_PRINT));
        return $response;
    }

    /**
    * (GET) Get a specific round in Round table based 
    *
    * @return    Response
    */
    protected function getRound($id)
    {
        $rounds = Round::getRow($id);
        $response = Response::okResponse(json_encode($rounds, JSON_PRETTY_PRINT));
        return $response;
    }

    /**
    * (GET) Get Users of the round $id
    *
    * @return    Response
    */
    protected function getUsersInRound($id)
    {
        $rounds = Round::getUsersInRound($id);
        $response = Response::okResponse(json_encode($rounds, JSON_PRETTY_PRINT));
        return $response;
    }

    /**
    * (POST) Add a new round in Round table
    *
    * @param    array    $array    array containing ID_GAME, PREVAILING_WIND ,SEED
    * @return    Response
    */
    protected function newRound($array)
    {
        Round::createRound($array);
        $message = json_encode(["message" => 'Round succesfully created!']);
        $response = Response::createdResponse($message);
        return $response;
    }

    /**
    * (PUT) Add action of the round in Round table
    * TODO : ADD MAIN LOGIC FOR THE GAME
    *
    * @param    string    $action    string containing all actions
    * @return    Response
    */
    protected function updateActions($action)
    {
        Round::updateActions($action);
        $message = json_encode(["message" => 'Actions updated!']);
        $response = Response::createdResponse($message);
        return $response;
    }
}