#include "main.h"


#define RED "\033[38;2;255;0;0m"
#define GREEN "\033[38;2;0;255;0m"
#define BLUE "\033[38;2;0;0;255m"
#define YELLOW "\033[38;2;255;255;0m"
#define MAGENTA "\033[38;2;255;0;255m"
#define TEAL "\033[38;2;0;255;255m"
#define PURPLE "\033[38;2;127;0;255m"
#define WHITE "\033[38;2;255;255;255m"


void draw_color (tetromino current_square) {
  switch (current_square) {
    case I_PIECE:
      printf("%s", RED);
      break;
    case J_PIECE:
      printf("%s", GREEN);
      break;
    case L_PIECE:
      printf("%s", BLUE);
      break;
    case O_PIECE:
      printf("%s", YELLOW);
      break;
    case S_PIECE:
      printf("%s", MAGENTA);
      break;
    case T_PIECE:
      printf("%s", TEAL);
      break;
    case Z_PIECE:
      printf("%s", PURPLE);
      break;
    default:
      break;
  } 
}


void draw_board(piece current_piece, piece next_piece, bool *blink, bool is_piece) {

  int8_t i, j;


  printf("\033[H");
  printf("┏");
  for (i = 0; i < FIELD_WIDTH; i++)
    printf("━━");
  printf("┓\n");


  for (i = 0; i < FIELD_HEIGHT; i++) {
    
    printf("┃");

    for (j = 0; j < FIELD_WIDTH; j++) {
      
      if ( blink != NULL && blink[i]) {
  
        printf("%s", WHITE);
      } else {


        tetromino current_square = playfield[i][j + BORDER_WIDTH];

        if (is_piece) {

          uint8_t k, l;
          
          for (k = 0; k < current_piece.size; k++) {
            for (l = 0; l < current_piece.size; l++) {

              coord points = find_direction(current_piece, l, k);

              if (
                i == current_piece.y + points.y && 
                j == current_piece.x + points.x - BORDER_WIDTH && 
                current_piece.piece[k][l]) 
              {
                current_square = current_piece.name;
              }
            }
          }
        }

        if (current_square <= EMPTY || current_square > Z_PIECE) {
          printf("· ");
          continue;
        }

        draw_color(current_square);
      }
        
      printf("██\033[0m");
    }
    printf("┃\n");
  }

  printf("┗");
  for (i = 0; i < FIELD_WIDTH; i++)
    printf("━━");
  printf("┛\n");


  /* next piece preview */

  printf("\033[H");
  printf("\033[%iC", FIELD_WIDTH * 2 + 1);
  printf("┱──────────┐\n");

  for (i = 4; i > 0; i--) {
    printf("\033[%iC", FIELD_WIDTH * 2 + 1);
    printf("┃");

    draw_color(next_piece.name);

    for (j = 4; j >= 0; j--) {
    
      int8_t y = next_piece.size - i;
      int8_t x = next_piece.size - j;
        

      if (
        y < next_piece.size && x < next_piece.size &&
        y >= 0 && x >= 0 &&
        next_piece.piece[y][x]
      ) {
        printf("██");
        continue;
      }
       
      printf("  ");
    }

    printf("\033[0m│\n");
  }

  printf("\033[%iC", FIELD_WIDTH * 2 + 1);
  printf("┠──────────┘\n");

}

void draw_pause () {
  
  uint8_t i;

  printf("\033[H");
  printf("\033[%iB", 1 + (FIELD_HEIGHT >> 2));

  for (i = 0; i < 3; i++) {

    printf("\033[%iC", 1 + (((FIELD_WIDTH * 2  - 7) >> 1)));

    switch(i) {
      case 0:
        printf("╭─────╮");
        break;
      case 1:
        printf("│PAUSE│");
        break;
      case 2:
        printf("╰─────╯");
        break;
    }

    printf("\n");
  } 
}
