/*
	ApplicationFramework
	by John Ryland
	Copyright (c) 2023
*/

////////////////////////////////////////////////////////////////////////////////////
//	Window

#include "Window.h"
#include "IApplication.h"
#include "IWindowSystem.h"
#include "IRenderSystem.h"

namespace ApplicationFramework {

Window::Window(IApplication& app, int width, int height, const char* title)
    : m_application(app)
{
    m_handle = m_application.WindowSystem()->CreateWindow(this, width, height, title);
    m_application.RenderSystem()->CreateWindow(this);
}

// virtual
Window::~Window()
{
    m_application.RenderSystem()->DestroyWindow(this);
    m_application.WindowSystem()->DestroyWindow(m_handle);
}

void Window::Show()
{
    m_application.WindowSystem()->ShowWindow(m_handle);
}

void Window::SetPosition(uint32_t x, uint32_t y)
{
    m_application.WindowSystem()->SetWindowPosition(m_handle, x, y);
}

void Window::Position(uint32_t& x, uint32_t& y)
{
    m_application.WindowSystem()->GetWindowPosition(m_handle, x, y);
}

void Window::SetSize(uint32_t width, uint32_t height)
{
    m_application.WindowSystem()->SetWindowSize(m_handle, width, height);
}

void Window::Size(uint32_t& width, uint32_t& height)
{
    m_application.WindowSystem()->GetWindowSize(m_handle, width, height);
}

void Window::SetFocused()
{
    m_application.WindowSystem()->SetWindowFocus(m_handle);
}

bool Window::HasFocus()
{
    return m_application.WindowSystem()->GetWindowFocus(m_handle);
}

bool Window::IsMinimized()
{
    return m_application.WindowSystem()->GetWindowMinimized(m_handle);
}

void Window::SetTitle(const char* str)
{
    m_application.WindowSystem()->SetWindowTitle(m_handle, str);
}

void Window::SetAlpha(float alpha)
{
    m_application.WindowSystem()->SetWindowAlpha(m_handle, alpha);
}

bool Window::IsKeyPressed(int key)
{
    return m_application.WindowSystem()->IsKeyPressed(m_handle, key);
}

} // ApplicationFramework namespace
