#include "main.h"

#define RED    ((color){255, 0, 0})
#define GREEN  ((color){0, 255, 0})
#define BLUE   ((color){0, 0, 255})
#define YELLOW ((color){255, 255, 0})
#define MAGENTA ((color){255, 0, 255})
#define TEAL ((color){0, 255, 255})
#define PURPLE ((color){127, 0, 255})
#define WHITE ((color){255, 255, 255})

#define DARK 0.6


void draw_color (tetromino current_square, double dark) {
 
  color col = {};

  switch (current_square) {

    case I_PIECE:
      col = RED;
      break;
    case J_PIECE:
      col = GREEN;
      break;
    case L_PIECE:
      col = BLUE;
      break;
    case O_PIECE:
      col = YELLOW;
      break;
    case S_PIECE:
      col = MAGENTA;
      break;
    case T_PIECE:
      col = TEAL;
      break;
    case Z_PIECE:
      col = PURPLE;
      break;
    default:
      break;
  } 

  if(dark > 0) {


    col.r *= dark;
    col.g *= dark;
    col.b *= dark;
  }

  printf("\033[38;2;%i;%i;%im", col.r, col.g, col.b);
}


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++) {

      double dark = DARK;
      
      if ( blink != NULL && blink[i]) {
  
        color col = WHITE;

        printf("\033[38;2;%i;%i;%im", col.r, col.g, col.b);
      } 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;
                dark = 0;
              }
            }
          }
        } 

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

        draw_color(current_square, dark);
      }
        
      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, 0);

    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");

  printf("\033[%iC", FIELD_WIDTH * 2 + 2);
  printf("LEVEL: %u\n", level);

}

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");
  } 
}
