RelevantRounds.php 2.29 KB
<?php

namespace FootyRoom\Queries\Predictor;

class RelevantRounds
{
    /** @var \FootyRoom\Queries\Predictor\Round */
    public $previous;
    
    /** @var \FootyRoom\Queries\Predictor\Round */
    public $selected;
    
    /** @var \FootyRoom\Queries\Predictor\Round */
    public $next;
    
    /** @var \FootyRoom\Queries\Predictor\Round */
    public $current;

    public function __construct(Round $selected, ?Round $previous, ?Round $next, ?Round $current)
    {
        $currentRoundId = $current ? $current->id : $selected->id;

        foreach (['previous', 'selected', 'next', 'current'] as $round) {
            if (!${$round}) continue;

            if (${$round}->id > $currentRoundId) {
                ${$round}->status = 'upcoming';
            } elseif (${$round}->id < $currentRoundId) {
                ${$round}->status = 'finished';
            } else {
                ${$round}->status = 'current';
            }
        }

        $this->previous = $previous;
        $this->selected = $selected;
        $this->next = $next;
        $this->current = $current;
    }

    /**
     * Add player rounds information to each relevant round.
     */
    public function addPlayerRounds(array $playerRounds): void
    {
        foreach ($playerRounds as $playerRound) {
            foreach (['previous', 'selected', 'next', 'current'] as $round) {
                if ($this->{$round} && $this->{$round}->id === $playerRound->phase) {
                    $this->{$round}->player = $playerRound;
                    break;
                }
            }
        }
    }

    /**
     * Get all relevant rounds ids.
     */
    public function getRoundIds(): array
    {
        $roundIds = [];
        
        foreach (['previous', 'selected', 'next', 'current'] as $round) {
            if ($this->{$round}) {
                $roundIds[] = $this->{$round}->id;
            }
        }

        return $roundIds;
    }

    public function forResponse(): array
    {
        return [
            'previous' => $this->previous ? $this->previous->forResponse() : null,
            'selected' => $this->selected ? $this->selected->forResponse(true) : null,
            'next' => $this->next ? $this->next->forResponse() : null,
            'current' => $this->current ? $this->current->forResponse() : null,
        ];
    }
}