#include "main.h"

void init_field() {
  uint8_t i, j;
  for(i = 0; i < FULL_HEIGHT; i++) {
    for (j = 0; j < FULL_WIDTH; j++) {
      
      if (
        j < BORDER_WIDTH || 
        j >= FULL_WIDTH - BORDER_WIDTH ||
        i >= FULL_HEIGHT - BORDER_WIDTH
      ) {
        playfield[i][j] = TETRIS; 
      } else {
        playfield[i][j] = EMPTY;
      }
    }
  }
}


piece init_piece(tetromino new_piece) {
  
  piece current_piece = {};

  current_piece.name = new_piece;

  current_piece.y = TOP_GAP;
  current_piece.rotation = TOP;


  switch (current_piece.name) {
    case I_PIECE:
      current_piece.size = 4;
      current_piece.positions = 2;

      current_piece.piece[0][0] = false;
      current_piece.piece[0][1] = false;
      current_piece.piece[0][2] = false;
      current_piece.piece[0][3] = false;

      current_piece.piece[1][0] = true;
      current_piece.piece[1][1] = true;
      current_piece.piece[1][2] = true;
      current_piece.piece[1][3] = true;
      
      current_piece.piece[2][0] = false;
      current_piece.piece[2][1] = false;
      current_piece.piece[2][2] = false;
      current_piece.piece[2][3] = false;
      
      current_piece.piece[3][0] = false;
      current_piece.piece[3][1] = false;
      current_piece.piece[3][2] = false;
      current_piece.piece[3][3] = false;
      
      current_piece.y = 0;

      break;

    case J_PIECE:
      current_piece.size = 3;
      current_piece.positions = 4;
  
      current_piece.piece[0][0] = true;
      current_piece.piece[0][1] = false;
      current_piece.piece[0][2] = false;
      
      current_piece.piece[1][0] = true;
      current_piece.piece[1][1] = true;
      current_piece.piece[1][2] = true;

      current_piece.piece[2][0] = false;
      current_piece.piece[2][1] = false;
      current_piece.piece[2][2] = false;

      break;

    case L_PIECE:
      current_piece.size = 3;
      current_piece.positions = 4;
  
      current_piece.piece[0][0] = false;
      current_piece.piece[0][1] = false;
      current_piece.piece[0][2] = true;
      
      current_piece.piece[1][0] = true;
      current_piece.piece[1][1] = true;
      current_piece.piece[1][2] = true;

      current_piece.piece[2][0] = false;
      current_piece.piece[2][1] = false;
      current_piece.piece[2][2] = false;

      break;

    case O_PIECE:
      current_piece.size = 4;
      current_piece.positions = 1;
  
      current_piece.piece[0][0] = false;
      current_piece.piece[0][1] = false;
      current_piece.piece[0][2] = false;
      current_piece.piece[0][3] = false;
    
      current_piece.piece[1][0] = false;
      current_piece.piece[1][1] = true;
      current_piece.piece[1][2] = true;
      current_piece.piece[1][3] = false; 
  
      current_piece.piece[2][0] = false;
      current_piece.piece[2][1] = true;
      current_piece.piece[2][2] = true;
      current_piece.piece[2][3] = false; 
      
      current_piece.piece[3][0] = false;
      current_piece.piece[3][1] = false;
      current_piece.piece[3][2] = false;
      current_piece.piece[3][3] = false;
      
      break;

    case S_PIECE:
      current_piece.size = 3;
      current_piece.positions = 2;
  
      current_piece.piece[0][0] = false;
      current_piece.piece[0][1] = true;
      current_piece.piece[0][2] = true;

      current_piece.piece[1][0] = true;
      current_piece.piece[1][1] = true;
      current_piece.piece[1][2] = false;
 
      current_piece.piece[2][0] = false;
      current_piece.piece[2][1] = false;
      current_piece.piece[2][2] = false;

      break;

    case T_PIECE:
      current_piece.size = 3;
      current_piece.positions = 4;
  
      current_piece.piece[0][0] = false;
      current_piece.piece[0][1] = true;
      current_piece.piece[0][2] = false;
      
      current_piece.piece[1][0] = true;
      current_piece.piece[1][1] = true;
      current_piece.piece[1][2] = true;
      
      current_piece.piece[2][0] = false;
      current_piece.piece[2][1] = false;
      current_piece.piece[2][2] = false;

      break;
    case Z_PIECE:
      current_piece.size = 3;
      current_piece.positions = 2;
  
      current_piece.piece[0][0] = true;
      current_piece.piece[0][1] = true;
      current_piece.piece[0][2] = false;

      current_piece.piece[1][0] = false;
      current_piece.piece[1][1] = true;
      current_piece.piece[1][2] = true;

      current_piece.piece[2][0] = false;
      current_piece.piece[2][1] = false;
      current_piece.piece[2][2] = false;

      break;
    default:
      perror("Fuck you\n");
      break;
  }

  current_piece.x = ((FULL_WIDTH >> 1) - (current_piece.size >> 1));

  return current_piece;
}



coord find_direction(piece current_piece, uint8_t x, uint8_t y) {

  coord points = {
    x,
    y
  };

  switch (current_piece.rotation) {
    case TOP:
      /*
      x = k;
      y = j;
      */
      break;
    case RIGHT:
      points.x = y;
      points.y = current_piece.size - (x + 1);
      break;
    case BOTTOM:
      points.x = current_piece.size - (x + 1);
      points.y = current_piece.size - (y + 1);
      break;
    case LEFT:
      points.x = current_piece.size - (y + 1);
      points.y = x;
      break;
  }

  return points;
}


bool valid_position(piece current_piece) {

  uint8_t i, j;

  for(i = 0; i < current_piece.size; i++) {
    for (j = 0; j < current_piece.size; j++) {

      coord points = find_direction(current_piece, j, i);

      int8_t y = current_piece.y + points.y;
      int8_t x = current_piece.x + points.x;

      if (
        y < 0 || y >= FULL_HEIGHT ||
        x < 0 || x >= FULL_WIDTH
      ) {
        return false;
      }

      if (
        (current_piece.piece[i][j] &&
        playfield[y][x] != EMPTY)
      ) {
        return false;
      }
    }
  }

  return true;
}
