#include "custom_map.h"
#include "input_manager.h"


const char *str_map1 =
"\
+---------------+\n\
|     M        @|\n\
| M             |\n\
|       M       |\n\
|             M |\n\
| --------------|\n\
|  >|  |  |  |  |\n\
+---------------+\n\
";

//5 UP 12 RIGHT


const char *str_map2 =
"\
+---------------+\n\
|>              |\n\
|               |\n\
|               |\n\
|     M   M     |\n\
|       @       |\n\
|     M   M     |\n\
+---------------+\n\
";

// 4 DOWN    7 RIGHT

const char *str_map3 = // the monster can move two tiles for 1 movement of the player + follow him
"\
+---------------+\n\
|               |\n\
|M| >           |\n\
| |             |\n\
|               |\n\
|           | | |\n\
|           +-+ |\n\
|   @           |\n\
+---------------+\n\
";

// initialize the monsters : first stat : id, direction and coordinates
monsters* init_monsters(map * m, monsters* monsters_data){
    monsters_data->length = 0;
    for (int y = 0; y < m->height; y++)
    {
        for(int x = 0; x<m->width; x++){
            if (m->tiles[y][x] == 'M') {;
                monsters_data->info[monsters_data->length].id = monsters_data->length;
                monsters_data->info[monsters_data->length].dir = DIR_DOWN;
                monsters_data->info[monsters_data->length].x = x;
                monsters_data->info[monsters_data->length].y = y;
                monsters_data->info[monsters_data->length].player_seen = false;
                monsters_data->length++;
            }
        }
    }
    
    for (int i = monsters_data->length; i < MAX_MONSTERS; i++)
    {
        monsters_data->info[i].id = -1;
    }
    
    return monsters_data;
}

void show_map(map *m) {
    for (int y = 0; y < m->height; y++)
    {
        for(int x = 0; x<m->width; x++){
            printf("%c", m->tiles[y][x]);
        }
        printf("\n");
    }
}

void update_monster(monsters* mon, map* m, int fy, int fx, int ty, int tx) {
    if (m->tiles[fy][fx] == 'M' && can_move_to(m, fy, fx, ty, tx)) {
        move_without_check(m, fy, fx, ty, tx);
        int id = search_monster(mon, m, fy, fx);
        if (fx < tx)
            mon->info[id].dir = DIR_RIGHT;
        else if (fx>tx)
            mon->info[id].dir = DIR_LEFT;
        else if (fy<ty)
            mon->info[id].dir = DIR_DOWN;
        else
            mon->info[id].dir = DIR_UP;

        mon->info[id].x = tx;
        mon->info[id].y = ty;        
    }
}

void verify_monster(game_instance* game, monsters* mon) {
    map *m = current_map(game->map_stack);
    if (m->tiles[m->player_y][m->player_x] == 'M') {
        message("A monster catches you !");
        exit(EXIT_FAILURE);
    }
}