$allowedActions * @param list $reasons */ private function __construct( private bool $visible, private ?int $maximumQuantity, private array $allowedActions, private array $reasons, ) {} /** @param list $reasons */ public static function hidden(array $reasons): self { return new self(false, null, [], $reasons); } /** * @param list $allowedActions * @param list $reasons */ public static function visible( ?int $maximumQuantity, array $allowedActions, array $reasons, ): self { return new self(true, $maximumQuantity, $allowedActions, $reasons); } public function isVisible(): bool { return $this->visible; } /** @return array */ public function toArray(): array { if (! $this->visible) { return [ 'state' => 'hidden', 'reasons' => $this->reasons, ]; } return [ 'state' => 'visible', 'maximum_quantity' => $this->maximumQuantity, 'allowed_actions' => array_map( fn (CatalogAction $action): string => $action->value, $this->allowedActions, ), 'reasons' => $this->reasons, ]; } }