private function buildOptionsPart(): void
    {
        $this->optionsPart = [];

        if ($this->message instanceof AbstractMessage && $this->message->getOptions() instanceof OptionsInterface) {
            $options = $this->message->getOptions();

            if (!empty($options->getCollapseKey())) {
                $this->optionsPart['collapse_key'] = $options->getCollapseKey();
            }

            // By default, messages are sent with normal priority.
            // If priority is different add it to the set of options.
            if (Priority::NORMAL !== $options->getPriority()) {
                $this->optionsPart['priority'] = $options->getPriority();
            }

            // By default `content_available` option is false. Adding it only if it was changed to true.
            if ($options->isContentAvailable()) {
                $this->optionsPart['content_available'] = true;
            }

            // By default `mutable_content` option is false. Adding it only if it was changed to true.
            if ($options->isMutableContent()) {
                $this->optionsPart['mutable_content'] = true;
            }

            // By default TTL for message in FCM is 4 weeks, it is also the default value if you omitted the TTL option.
            // So if the TTL is overwritten and is not equal to the default value, then add this option.
            // Otherwise if TTL is still equal to default, then it is not need to send this option.
            if (Options::DEFAULT_TTL_IN_SECONDS !== $options->getTimeToLive()) {
                $this->optionsPart['time_to_live'] = $options->getTimeToLive();
            }

            if (!empty($options->getRestrictedPackageName())) {
                $this->optionsPart['restricted_package_name'] = $options->getRestrictedPackageName();
            }

            // By default `dry_run` option is.... @todo
            if ($options->isDryRun()) {
                $this->optionsPart['dry_run'] = true;
            }
        }
    }