#pragma once
/*
 * Created by Brett on 28/11/23.
 * Licensed under GNU General Public License V3.0
 * See LICENSE file for license detail
 */

#ifndef BLT_WITH_GRAPHICS_TEMPLATE_WINDOW_H
#define BLT_WITH_GRAPHICS_TEMPLATE_WINDOW_H

#include <glad/gl.h>
#include <GLFW/glfw3.h>
#include <functional>
#include <cstdint>
#include <string>
#include <utility>

namespace blt::gfx
{
    struct window_context
    {
        std::int32_t GL_MAJOR = 4;
        std::int32_t GL_MINOR = 6;
        std::int32_t DOUBLE_BUFFER = GLFW_TRUE;
        std::int32_t GL_PROFILE = GLFW_OPENGL_CORE_PROFILE;
    };
    
    struct window_data
    {
        std::string title;
        std::int32_t width;
        std::int32_t height;
        std::function<void()> init;
        std::function<void(std::int32_t, std::int32_t)> update;
        
        window_context context{};
        std::int32_t sync_interval = 0;
        
        window_data(std::string title, std::function<void()> init, std::function<void(std::int32_t, std::int32_t)> update, std::int32_t width = 640,
                    std::int32_t height = 480):
                title(std::move(title)), width(width), height(height), init(std::move(init)), update(std::move(update))
        {}
        
        window_data& setContext(const window_context& ctx)
        {
            context = ctx;
            return *this;
        }
        
        window_data& setSyncInterval(std::int32_t sync)
        {
            sync_interval = sync;
            return *this;
        }
    };
    
    void init(const window_data& data);
    
    void cleanup();
}

#endif //BLT_WITH_GRAPHICS_TEMPLATE_WINDOW_H
