#pragma once
#include "render_2D/event/Event.h"
#include <string>
#include <variant>
namespace renderive::web {
struct Frame_Request {};
struct Viewport_Resize {
    Size size;
};
enum class Demo_Mode : std::uint8_t { Am, Fm, Usb, Lsb };
struct Set_Demo_Mode {
    Demo_Mode mode = Demo_Mode::Fm;
};
struct Set_Center_Frequency {
    double megahertz = 102.5;
};
struct Set_Bandwidth {
    double kilohertz = 1200.0;
};
struct Set_Gain {
    double decibels{};
};
struct Set_Max_Hold {
    bool enabled{};
};
struct Set_Smoothing {
    bool enabled{};
};
struct Clear_Selection {};
enum class Gallery_Request_Kind : std::uint8_t {
    Catalog,
    Open,
    Patch,
    Action,
    Observe,
    Refresh,
    Reset_Monitoring
};
struct Gallery_Request {
    Gallery_Request_Kind kind = Gallery_Request_Kind::Catalog;
    std::string message;
};

template <class... Scene_Events>
using Basic_Web_Event = std::variant<Frame_Request,
                                     Viewport_Resize,
                                     Scene_Events...,
                                     Set_Demo_Mode,
                                     Set_Center_Frequency,
                                     Set_Bandwidth,
                                     Set_Gain,
                                     Set_Max_Hold,
                                     Set_Smoothing,
                                     Clear_Selection,
                                     Gallery_Request>;

using Web_Event = Basic_Web_Event<Event, Pointer_Event, Wheel_Event, Key_Event>;
} // namespace renderive::web
