/**
 * @file ipc/Server.h
 * @author apio (cloudapio.eu)
 * @brief IPC message definitions for UI messages sent to the server.
 *
 * @copyright Copyright (c) 2023, the Luna authors.
 *
 */

#pragma once
#include <os/IPC.h>
#include <ui/Color.h>
#include <ui/Rect.h>
#include <ui/ipc/Client.h>

namespace ui
{
    enum ServerMessages : u8
    {
        IPC_ENUM_SERVER(ui),
        CREATE_WINDOW_ID,
        REMOVE_SHM_ID,
        SET_WINDOW_TITLE_ID,
        INVALIDATE_ID,
        CLOSE_WINDOW_ID,
        GET_SCREEN_RECT_ID,
        SET_TITLEBAR_HEIGHT_ID,
        SET_WINDOW_LAYER_ID,
        UPDATE_PLEDGE_REQUEST_ID,
    };

    struct CreateWindowRequest
    {
        using ResponseType = CreateWindowResponse;
        static constexpr u8 ID = CREATE_WINDOW_ID;

        ui::Rect rect;
    };

    struct RemoveSharedMemoryRequest
    {
        static constexpr u8 ID = REMOVE_SHM_ID;

        int window;
    };

    struct SetWindowTitleRequest
    {
        static constexpr u8 ID = SET_WINDOW_TITLE_ID;

        int window;
        IPC_STRING(title);
    };

    struct InvalidateRequest
    {
        static constexpr u8 ID = INVALIDATE_ID;

        int window;
    };

    struct CloseWindowRequest
    {
        static constexpr u8 ID = CLOSE_WINDOW_ID;

        int window;
    };

    struct GetScreenRectRequest
    {
        using ResponseType = GetScreenRectResponse;
        static constexpr u8 ID = GET_SCREEN_RECT_ID;

        int _shadow; // Unused.
    };

    struct SetTitlebarHeightRequest
    {
        static constexpr u8 ID = SET_TITLEBAR_HEIGHT_ID;

        int window;
        int height;
    };

    enum Layer : u8
    {
        Background,
        Global,
        GlobalTop,
        System,
        Lock
    };

    struct SetWindowLayer
    {
        static constexpr u8 ID = SET_WINDOW_LAYER_ID;

        int window;
        Layer layer;
    };

    enum Pledge : i16
    {
        ExtendedLayers = 1,
    };

    struct UpdatePledgeRequest
    {
        static constexpr u8 ID = UPDATE_PLEDGE_REQUEST_ID;

        i16 pledges;
    };
}