#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <sys/mman.h>
#include <GL/gl.h>
#include <GL/glut.h>
#include "textures.h"

// w b y g o r
const char *tfiles[NUM_TEXTURES] = {
  "textures/white.rgb",
  "textures/blue.rgb",
  "textures/yellow.rgb",
  "textures/green.rgb",
  "textures/orange.rgb",
  "textures/red.rgb"
};

int loaded_textures[2][NUM_TEXTURES] = {{0,0,0,0,0,0},{0,0,0,0,0,0}};

GLuint load_texture(const char *filename, bool alpha) {
  char *data;
  int fd;
  int s = SIZE * SIZE * (3 + alpha);

  fd = open(filename, O_RDONLY);
  if (fd == -1) return -1;
  data = (char*)mmap(0, s, PROT_READ, MAP_PRIVATE, fd, 0);
  if (data == (void*)-1) return -1;
  close(fd);

  GLuint texture;
  glGenTextures(1, &texture);
  glBindTexture(GL_TEXTURE_2D, texture);
  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
      GL_LINEAR_MIPMAP_NEAREST);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

  GLuint rgb = alpha ? GL_RGBA : GL_RGB;
  gluBuild2DMipmaps(GL_TEXTURE_2D, 3 + alpha, SIZE, SIZE,
      rgb, GL_UNSIGNED_BYTE, data);

  munmap(data, s);

  return texture;
}

void load_all_textures() {
  for (int i = 0; i < NUM_TEXTURES; i++) {
    if (strlen(tfiles[i])) {
      int t = load_texture(tfiles[i], 0);
      if (t == -1) continue;
      loaded_textures[0][i] = 1;
      loaded_textures[1][i] = t;
    }
  }
}
