#include "player.h"
#include "grid.h"

void move_player(struct Grid* grid, enum Direction direction){
    switch(direction){
		case TOP :{
            if(get_grid(grid, grid->position->col, grid->position->row-1) == NONE){
                change_cell_grid(grid, grid->position->col, grid->position->row, NONE);
                grid->position->row =-1;
                change_cell_grid(grid, grid->position->col, grid->position->row, PLAYER);
            }
            else if(get_grid(grid, grid->position->col, grid->position->row-1) == GOAL){
                change_cell_grid(grid, grid->position->col, grid->position->row, NONE);
                grid->position->row =-1;
                change_cell_grid(grid, grid->position->col, grid->position->row, PLAYER);
            }
            else if(get_grid(grid, grid->position->col, grid->position->row-1) == BOX){
                if(get_grid(grid, grid->position->col, grid->position->row-2) != WALL){
                    change_cell_grid(grid, grid->position->col, grid->position->row, NONE);
                    grid->position->row =-1;
                    change_cell_grid(grid, grid->position->col, grid->position->row, PLAYER);
                    change_cell_grid(grid, grid->position->col, grid->position->row-1, BOX);
                }
                else{return;}
			break;
            }
		}
        case BOTTOM :{
			if(get_grid(grid, grid->position->col, grid->position->row+1) == NONE){
                change_cell_grid(grid, grid->position->col, grid->position->row, NONE);
                grid->position->row =+1;
                change_cell_grid(grid, grid->position->col, grid->position->row, PLAYER);
            }
            else if(get_grid(grid, grid->position->col, grid->position->row+1) == GOAL){
                change_cell_grid(grid, grid->position->col, grid->position->row, NONE);
                grid->position->row =+1;
                change_cell_grid(grid, grid->position->col, grid->position->row, PLAYER);
            }
            else if(get_grid(grid, grid->position->col, grid->position->row+1) == BOX){
                if(get_grid(grid, grid->position->col, grid->position->row+2) != WALL){
                    change_cell_grid(grid, grid->position->col, grid->position->row, NONE);
                    grid->position->row =+1;
                    change_cell_grid(grid, grid->position->col, grid->position->row, PLAYER);
                    change_cell_grid(grid, grid->position->col, grid->position->row+1, BOX);
                }
			break;
            }
		}
        case LEFT :{
			if(get_grid(grid, grid->position->col-1, grid->position->row) == NONE){
                change_cell_grid(grid, grid->position->col, grid->position->row, NONE);
                grid->position->col =+1;
                change_cell_grid(grid, grid->position->col, grid->position->row, PLAYER);
            }
            else if(get_grid(grid, grid->position->col+1, grid->position->row) == GOAL){
                change_cell_grid(grid, grid->position->col, grid->position->row, NONE);
                grid->position->col =+1;
                change_cell_grid(grid, grid->position->col, grid->position->row, PLAYER);
            }
            else if(get_grid(grid, grid->position->col+1, grid->position->row) == BOX){
                if(get_grid(grid, grid->position->col+2, grid->position->row) != WALL){
                    change_cell_grid(grid, grid->position->col, grid->position->row, NONE);
                    grid->position->col =+1;
                    change_cell_grid(grid, grid->position->col, grid->position->row, PLAYER);
                    change_cell_grid(grid, grid->position->col+1, grid->position->row, BOX);
                }
                else{return;}
			break;
            }
		}

        case RIGHT :{
            if(get_grid(grid, grid->position->col-1, grid->position->row) == NONE){
                change_cell_grid(grid, grid->position->col, grid->position->row, NONE);
                grid->position->col =-1;
                change_cell_grid(grid, grid->position->col, grid->position->row, PLAYER);
            }
            else if(get_grid(grid, grid->position->col-1, grid->position->row) == GOAL){
                change_cell_grid(grid, grid->position->col, grid->position->row, NONE);
                grid->position->col =-1;
                change_cell_grid(grid, grid->position->col, grid->position->row, PLAYER);
            }
            else if(get_grid(grid, grid->position->col-1, grid->position->row) == BOX){
                if(get_grid(grid, grid->position->col-2, grid->position->row) != WALL){
                    change_cell_grid(grid, grid->position->col, grid->position->row, NONE);
                    grid->position->col =-1;
                    change_cell_grid(grid, grid->position->col, grid->position->row, PLAYER);
                    change_cell_grid(grid, grid->position->col-1, grid->position->row, BOX);
                }
                else{return;}
			break;
            }
		}
	}
    return;
}