#include "./tilemap.h"

#include "./main.h"
#include "./data.h"

// #include "../data-headers/track.h"

#define tileSize 8
#define trackImageWidth 256 * tileSize
#define trackImageHeight 256 * tileSize

#ifndef USE_ASM
unsigned char __attribute__ ((hot)) getTileID(int xPos, int yPos) {
  // __builtin_expect(xPos < 0 || xPos >= trackImageWidth || yPos < 0 || yPos >= trackImageHeight, 0);
  if ((unsigned short) xPos >= trackImageWidth || (unsigned short) yPos >= trackImageHeight) {
    return 0;  // Grass
  } else {
    // Divide by 8
    int xPixel = xPos >> 3;
    int yPixel = yPos >> 3;

    return /*track.*/tilemap[(yPixel * (trackImageWidth / tileSize)) + xPixel];
  }
}
#endif

// unsigned char getTileID(short l0, short l1) {
//   unsigned int si0, si1, si2;
//   si0 = l0;
//   si1 = l1;
//   si0 |= si1;
//   si1 = 2047u;
//   si0 = si0 <= si1;
//   if (si0) {
//     si0 = l1;
//     si1 = 65528u;
//     si0 &= si1;
//     si1 = 5u;
//     si0 <<= (si1 & 31);
//     si1 = l0;
//     si2 = 65528u;
//     si1 &= si2;
//     si2 = 3u;
//     si1 >>= (si2 & 31);
//     si0 += si1;
//     // si1 = 1024u;
//     // si0 += si1;
//     // si0 = load(si0);
//     si0 = tilemap[si0];
//   } else {
//     si0 = 0u;
//   }
//   return si0;
// }

enum TileType getTileType(int tileID) {
  return (enum TileType) track.tileTypes[tileID];
}

#ifndef USE_ASM
unsigned short __attribute__ ((hot)) samplePixel(int xPos, int yPos) {
  xPos += xOffset;
  yPos += yOffset;

  // Divide by 4
  xPos = xPos >> 2;
  yPos = yPos >> 2;

  // Get the position of the pixel in the tile
  int xPixelInTile = xPos & (tileSize - 1);
  int yPixelInTile = yPos & (tileSize - 1);

  // Get the colour of the pixel in the tile
  unsigned char index = /*track.*/tileset[getTileID(xPos, yPos)][(yPixelInTile * tileSize) + xPixelInTile];
  return /*track.*/palette[index];
  // return index;
}
#endif

// unsigned short samplePixelFast(short xPos, short yPos) {
//   xPos += xOffset;
//   yPos += yOffset;

//   // Divide by 4
//   xPos = xPos >> 2;
//   yPos = yPos >> 2;

//   // Get the colour of the middle pixel of the tile
//   return *track.tileImageData[getTileID(xPos, yPos)][(4 * tileSize) + 4];
// }
