#include <glad/glad.c>
// glad must be loaded before GLFW
#include "graphics.hpp"
#include "main.hpp"

#include <iostream>

using namespace std;

/* class ShaderProgram Implementations */
string ShaderProgram::baseName() {
  switch (this->base) {
  case Empty:
    return "Empty";
  case Triangle:
    return "Triangle";
  }
}

ShaderProgram::ShaderProgram(Base base, string vertexSource,
                             string fragSource) {}

int ShaderProgram::run() { return 255; }

void framebuffer_size_callback(GLFWwindow *window, int width, int height) {
  glViewport(0, 0, width, height);
}

/* extended main function */
int mainWindow(ShaderProgram* shaderProgram) {
  /* graphics stuff */
  glfwInit();
  glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
  glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
  glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
  // glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);

  GLFWwindow *window = glfwCreateWindow(800, 600, "Shader Loader", NULL, NULL);
  if (window == NULL) {
    printf("Failed to create GLFW window\n");
    glfwTerminate();
    return -1;
  }
  glfwMakeContextCurrent(window);

  if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
    printf("Failed to initialize GLAD\n");
    return -1;
  }

  glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

  int result = shaderProgram->run();

  glfwTerminate();
  return result;
}