#pragma once

#include "graphics/opengl/framebuffer.hpp"

#include <glm/vec2.hpp>

#include <cstdint>
#include <memory>
#include <string_view>

namespace kuiper
{

class window {
  public:
    virtual ~window() = default;

    virtual void*                  get_native_handle() const noexcept                 = 0;
    virtual void                   set_title(std::u8string_view title) noexcept       = 0;
    virtual void                   poll_events() noexcept                             = 0;
    virtual void                   swap_buffers() noexcept                            = 0;
    virtual void                   set_swap_interval(std::uint32_t interval) noexcept = 0;
    virtual void                   bind_context() noexcept                            = 0;
    virtual gl::framebuffer::s_ptr back_buffer() const noexcept                       = 0;

    virtual bool should_close() const noexcept     = 0;
    virtual bool is_minimised() const noexcept     = 0;
    virtual bool is_cursor_locked() const noexcept = 0;

    virtual void lock_cursor() noexcept       = 0;
    virtual void unlock_cursor() noexcept     = 0;
    virtual void enable_raw_input() noexcept  = 0;
    virtual void disable_raw_input() noexcept = 0;

    virtual glm::uvec2 get_size() const noexcept             = 0;
    virtual glm::uvec2 get_framebuffer_size() const noexcept = 0; // should this go in render context?
    virtual glm::vec2  get_content_scale() const noexcept    = 0;
};

} // namespace kuiper
