#pragma once

#include "AnimatedVariable.hpp"
#include <string>
#include "../defines.hpp"

enum eFullscreenMode : int8_t {
    FULLSCREEN_INVALID = -1,
    FULLSCREEN_FULL    = 0,
    FULLSCREEN_MAXIMIZED
};

class CWindow;

class CWorkspace {
  public:
    CWorkspace(int monitorID, std::string name, bool special = false);
    ~CWorkspace();

    // Workspaces ID-based have IDs > 0
    // and workspaces name-based have IDs starting with -1337
    int         m_iID        = -1;
    std::string m_szName     = "";
    uint64_t    m_iMonitorID = -1;
    // Previous workspace ID is stored during a workspace change, allowing travel
    // to the previous workspace.
    struct SPrevWorkspaceData {
        int         iID  = -1;
        std::string name = "";
    } m_sPrevWorkspace;

    bool            m_bHasFullscreenWindow = false;
    eFullscreenMode m_efFullscreenMode     = FULLSCREEN_FULL;

    wl_array        m_wlrCoordinateArr;

    // for animations
    CAnimatedVariable m_vRenderOffset;
    CAnimatedVariable m_fAlpha;
    bool              m_bForceRendering = false;

    // "scratchpad"
    bool m_bIsSpecialWorkspace = false;

    // last window
    CWindow* m_pLastFocusedWindow = nullptr;

    // user-set
    bool m_bDefaultFloating = false;
    bool m_bDefaultPseudo   = false;

    // last monitor (used on reconnect)
    std::string m_szLastMonitor = "";

    // Whether the user configured command for on-created-empty has been executed, if any
    bool        m_bOnCreatedEmptyExecuted = false;

    void        startAnim(bool in, bool left, bool instant = false);
    void        setActive(bool on);

    void        moveToMonitor(const int&);

    CWindow*    getLastFocusedWindow();
    void        rememberPrevWorkspace(const CWorkspace* prevWorkspace);

    std::string getConfigName();
};
