/*
* Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *          http://license.coscl.org.cn/MulanPSL2
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 */
#ifndef OMNISTREAM_EVENTANNOUNCEMENT_H
#define OMNISTREAM_EVENTANNOUNCEMENT_H

#pragma once

#include <memory>
#include <string>
#include "../../../event/RuntimeEvent.h"

namespace omnistream {

    /**
     * EventAnnouncement is used by timeoutable aligned checkpoint barriers.
     * It announces an upcoming event together with the sequence number at which the announced
     * event will appear in the input channel.
     *
     * This is needed so that, upon aligned timeout, the runtime can "overtake" the announced
     * barrier by converting it into a priority event at the correct position.
     */
    class EventAnnouncement : public RuntimeEvent {
    public:
        EventAnnouncement(std::shared_ptr<AbstractEvent> announcedEvent, int sequenceNumber)
            : announcedEvent_(std::move(announcedEvent)), sequenceNumber_(sequenceNumber)
        {
        }

        std::shared_ptr<AbstractEvent> GetAnnouncedEvent() const { return announcedEvent_; }
        int GetSequenceNumber() const { return sequenceNumber_; }

        std::string GetEventClassName() override { return "EventAnnouncement"; }

    private:
        std::shared_ptr<AbstractEvent> announcedEvent_;
        int sequenceNumber_;
    };

} // namespace omnistream

#endif // OMNISTREAM_EVENTANNOUNCEMENT_H