<?php
namespace CoreBundle\Entity;
use DateTime;
use UserBundle\Entity\User;
use CoreBundle\Session\SessionUnitInterface;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\Collection;
/**
* @ORM\Table("quiz_unit")
* @ORM\Entity(repositoryClass="CoreBundle\Entity\QuizUnitRepository")
*/
class QuizUnit implements QuizUnitInterface, SessionUnitInterface
{
public function getParent(): QuizSession
{
return $this->getQuizSession();
}
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private int $id;
/**
* @var QuizSession
*
* @ORM\ManyToOne(targetEntity="CoreBundle\Entity\QuizSession", inversedBy="quizUnits")
* @ORM\JoinColumn(name="quiz_session", referencedColumnName="id", onDelete="CASCADE")
*/
private QuizSession $quizSession;
/**
* @var User
*
* @ORM\ManyToOne(targetEntity="UserBundle\Entity\User")
* @ORM\JoinColumn(name="student", referencedColumnName="id")
*/
private User $student;
/**
* @var DateTime|null
* @ORM\Column(name="deadline", type="datetime", nullable=true)
*/
private ?DateTime $deadline = null;
/**
* @var bool
* @ORM\Column(name="finished", type="boolean", options={"default" : false})
*/
private bool $finished;
/**
* @var DateTime|null
* @ORM\Column(name="finished_at", type="datetime", nullable=true)
*/
private ?DateTime $finishedAt;
/**
* @var DateTime|null
* @ORM\Column(name="started_at", type="datetime", nullable=true)
*/
private ?DateTime $startedAt;
/**
* @var QuizResponse[]
*
* @ORM\OneToMany(targetEntity="CoreBundle\Entity\QuizResponse", mappedBy="quizUnit", cascade={"persist"})
*/
private Collection|array $quizResponses;
/**
* @var DateTime|null
*
* @ORM\Column(name="extended_deadline", type="datetime", nullable=true)
*/
private ?DateTime $extendedDeadline = null;
/**
* @var string|null
*
* @ORM\Column(name="mathproblems_data", type="string", length=5400, nullable=true)
*/
private ?string $mathproblemsData = null;
/**
* @var int|null
*
* @ORM\Column(name="seconds_left", type="integer", nullable=true, options={"default":0})
*/
private ?int $secondsLeft = null;
/**
* @var int
*
* @ORM\Column(name="seconds_paused", type="integer", options={"default":0})
*/
private int $secondsPaused;
/**
* @var DateTime|null
*
* @ORM\Column(name="time_resumed", type="datetime", nullable=true, options={"default":"1970-01-01 00:00:00"})
*/
private ?DateTime $timeResumed;
/**
* @var DateTime|null
*
* @ORM\Column(name="time_paused", type="datetime", nullable=true, options={"default":"1970-01-01 00:00:00"})
*/
private ?DateTime $timePaused;
/**
* @var DateTime|null
*
* @ORM\Column(name="start_time", type="datetime", nullable=true)
*/
private ?DateTime $startTime;
/**
* @var ?User
*
* @ORM\ManyToOne(targetEntity="UserBundle\Entity\User")
* @ORM\JoinColumn(name="shared_by", referencedColumnName="id", nullable=true )
*/
private ?User $sharedBy = null;
public function __construct()
{
$this->quizResponses = new ArrayCollection();
$this->secondsPaused = 0;
$this->startTime = new \DateTime('1970-01-01 00:00:00');
}
public function getStartTime(): ?DateTime
{
return $this->startTime;
}
/**
* @param DateTime|null $startTime
*/
public function setStartTime(?DateTime $startTime): void
{
$this->startTime = $startTime;
}
public function getTimePaused(): ?DateTime
{
return $this->timePaused;
}
public function setTimePaused(?DateTime $timePaused): void
{
$this->timePaused = $timePaused;
}
public function getTimeResumed(): ?DateTime
{
return $this->timeResumed;
}
/**
* @param DateTime|null $timeResumed
* @return void
*/
public function setTimeResumed(?DateTime $timeResumed): void
{
$this->timeResumed = $timeResumed;
}
public function getSecondsPaused(): int
{
return $this->secondsPaused;
}
/**
* @param int $secondsPaused
* @return void
*/
public function setSecondsPaused(int $secondsPaused): void
{
$this->secondsPaused = $secondsPaused;
}
/**
* @param int $seconds
* @return void
*/
public function addSecondsPaused(int $seconds): void
{
$this->secondsPaused += $seconds;
}
public function getSecondsLeft(): ?int
{
return $this->secondsLeft;
}
/**
* @param int|null $seconds
* @return void
*/
public function setSecondsLeft(?int $seconds): void
{
$this->secondsLeft = $seconds;
}
/**
* @return int
*/
public function getId(): int
{
return $this->id;
}
/**
* @return QuizSession
*/
public function getQuizSession(): QuizSession
{
return $this->quizSession;
}
/**
* @param QuizSession $quizSession
*
* @return $this
*/
public function setQuizSession(QuizSession $quizSession): static
{
$this->quizSession = $quizSession;
return $this;
}
/**
* @return User
*/
public function getStudent(): User
{
return $this->student;
}
/**
* @param User $student
*
* @return $this
*/
public function setStudent(User $student): static
{
$this->student = $student;
return $this;
}
public function getQuizResponses(): Collection
{
return $this->quizResponses;
}
/**
* @return array
*/
public function getValidQuizResponses(): array
{
$quizResponses = [];
foreach ($this->quizResponses as $response) {
if ($response->isValid()) {
$quizResponses[] = $response;
}
}
// sort by position
usort($quizResponses, function (QuizResponse $first, QuizResponse $second) {
return $first->getPosition() <=> $second->getPosition();
});
return $quizResponses;
}
/**
* @param QuizResponse[] $quizResponses
*
* @return $this
*/
public function setQuizResponses(array $quizResponses): static
{
$this->quizResponses = $quizResponses;
return $this;
}
/**
* @param QuizResponseInterface $quizResponse
*
* @return $this
*/
public function addQuizResponse(QuizResponseInterface $quizResponse): static
{
$quizResponse->setQuizUnit($this);
$this->quizResponses->add($quizResponse);
return $this;
}
public function isFinished(): bool
{
return $this->finished;
}
public function setFinished(bool $finished): void
{
$this->finished = $finished;
}
public function isPaused(): bool
{
return $this->timePaused > $this->timeResumed;
}
/**
* @return DateTime | null
*/
public function getDeadline(): ?DateTime
{
return $this->deadline;
}
/**
* @param ?DateTime $deadline
*/
public function setDeadline(?DateTime $deadline): void
{
$this->deadline = $deadline;
}
/**
* @return DateTime|null
*/
public function getExtendedDeadline(): ?DateTime
{
return $this->extendedDeadline;
}
/**
* @param DateTime|null $extendedDeadline
*/
public function setExtendedDeadline(?DateTime $extendedDeadline): void
{
$this->extendedDeadline = $extendedDeadline;
}
/**
* @return string|null
*/
public function getMathproblemsData(): ?string
{
return $this->mathproblemsData;
}
/**
* @param $mathproblemsData
*/
public function setMathproblemsData($mathproblemsData): void
{
$this->mathproblemsData = $mathproblemsData;
}
public function getFinishedAt(): ?DateTime
{
return $this->finishedAt;
}
public function setFinishedAt(?DateTime $finishedAt): void
{
$this->finishedAt = $finishedAt;
}
public function getStartedAt(): ?DateTime
{
return $this->startedAt;
}
public function setStartedAt(?DateTime $startedAt): void
{
$this->startedAt = $startedAt;
}
public function getTimeSpent(): ?array
{
if ($this->startedAt === null || $this->finishedAt === null)
return null;
$interval = $this->startedAt->diff($this->finishedAt);
return [
'days' => (int)$interval->format('%a'), // Total days
'hours' => (int)$interval->format('%H'),
'minutes' => (int)$interval->format('%I'),
'seconds' => (int)$interval->format('%s')
];
}
public function getSharedBy(): ?User
{
return $this->sharedBy;
}
public function setSharedBy(?User $sharedBy): void
{
$this->sharedBy = $sharedBy;
}
}