// =====================================================================================================================
//  fennec, a free and open source game engine
//  Copyright © 2025 - 2026  Medusa Slockbower
//
//  This program is free software: you can redistribute it and/or modify
//  it under the terms of the GNU General Public License as published by
//  the Free Software Foundation, either version 3 of the License, or
//  (at your option) any later version.
//
//  This program is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU General Public License for more details.
//
//  You should have received a copy of the GNU General Public License
//  along with this program.  If not, see <https://www.gnu.org/licenses/>.
// =====================================================================================================================

#include <fennec/core/logger.h>
#include <fennec/platform/opengl/egl/context.h>
#include <fennec/platform/opengl/egl/surface.h>

namespace fennec {

eglsurface::eglsurface(fennec::window* win, eglcontext* ctx, void* eglwindow)
	: gfxsurface(win, ctx)
	, _eglwindow(eglwindow)
	, _eglsurface(nullptr) {

	assertf(_eglwindow, "Failed to acquire EGL window!");

	_eglsurface = eglCreateWindowSurface(
		ctx->_egldisplay,
		ctx->_eglconfig,
		reinterpret_cast<EGLNativeWindowType>(_eglwindow),
		nullptr
	);

	if (not _eglsurface) {
		const int32_t err = eglGetError();
		logger::log(logger::error, format("EGL error: {}", eglErrorString(err)));
	}
	assertf(_eglsurface, "Failed to create EGL surface!");

	eglsurface::make_current();
}

eglsurface::~eglsurface() {
	eglcontext* ctx = dynamic_cast<eglcontext*>(context);
	assertf(eglDestroySurface(ctx->_egldisplay, _eglsurface), "Error destroying EGL surface!");
}

void eglsurface::make_current() {
	eglcontext* ctx = dynamic_cast<eglcontext*>(context);
	assertf(eglMakeCurrent(ctx->_egldisplay, _eglsurface, _eglsurface, ctx->_eglcontext), "Error setting the current surface!");
}

void eglsurface::swap() {
	eglcontext* ctx = dynamic_cast<eglcontext*>(context);
	assertf(eglSwapBuffers(ctx->_egldisplay, _eglsurface), "Error swapping surface buffers!");
}

} // fennec