id; } public function getName(): string { return $this->name; } public function getValidity(): int { return $this->validity; } public function setId(int $id): Mailbox { $this->id = $id; return $this; } public function setName(string $name): Mailbox { $this->name = $name; return $this; } public function setValidity(int $uidvalidity): Mailbox { $this->validity = $uidvalidity; return $this; } protected \ProVM\Emails\Repository\State\Mailbox $stateRepository; public function getStateRepository(): \ProVM\Emails\Repository\State\Mailbox { return $this->stateRepository; } public function setStateRepository(\ProVM\Emails\Repository\State\Mailbox $repository): Mailbox { $this->stateRepository = $repository; return $this; } protected array $states; public function getStates(): array { if (!isset($this->states)) { try { $this->setStates($this->getStateRepository()->fetchByMailbox($this->getId())); } catch (BlankResult $e) { return []; } } return $this->states; } public function addState(\ProVM\Emails\Model\State\Mailbox $state): Mailbox { $this->states []= $state; return $this; } public function setStates(array $states): Mailbox { foreach ($states as $state) { $this->addState($state); } return $this; } public function lastState(): State\Mailbox { if (count($this->getStates()) === 0) { throw new Stateless($this); } return $this->getStates()[array_key_last($this->getStates())]; } public function lastChecked(): ?DateTimeInterface { if (count($this->getStates()) == 0) { return null; } return $this->lastState()->getDateTime(); } public function lastCount(): int { if (count($this->getStates()) == 0) { return 0; } return $this->lastState()->getCount(); } public function lastPosition(): int { $state = $this->lastState()->getUIDs(); return array_key_last($state); } public function toArray(): array { return [ 'id' => $this->getId(), 'name' => $this->getName(), //'validity' => $this->getValidity(), 'last_checked' => [ 'date' => $this->lastChecked() ?? 'never', 'count' => $this->lastCount() ?? 0 ] ]; } }