#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char grid[150][150];
char visited[150][150];

void load() {
    char line[150];
    int currentLineNumber = 0;
    FILE *f;
    memset(grid, 0, sizeof(grid));
    memset(visited, 0, sizeof(visited));
    f = fopen("reconfile.txt", "r");
    while (!feof(f)) {
        memset(line, 0, sizeof(line));
        fgets(line, 150, f);
        if (line[0] == 0)
            break;
        memcpy(grid[currentLineNumber], line, 150);
        currentLineNumber++;
    }
    fclose(f);
}

void walk() {
    int x = 0, y = 0, direction = 2;
    while (1) {
        visited[y][x] = 1;
        switch(grid[y][x]) {
            case '^':
                direction = 8;
                //printf("\nCHANGED DIRECTION @ (%d,%d): %c\n", x, y, grid[y][x]);
                printf("\n");
                break;
            case '<':
                direction = 4;
                //printf("\nCHANGED DIRECTION @ (%d,%d): %c\n", x, y, grid[y][x]);
                printf("\n");
                break;
            case '>':
                direction = 6;
                //printf("\nCHANGED DIRECTION @ (%d,%d): %c\n", x, y, grid[y][x]);
                printf("\n");
                break;
            case 'v':
                direction = 2;
                //printf("\nCHANGED DIRECTION @ (%d,%d): %c\n", x, y, grid[y][x]);
                printf("\n");
                break;
            case ' ':
            case '\t':
                break;
            case '@':
                printf("\nEXIT!\n");
                return;
            case 0:
                printf("ERROR: WENT OUTSIDE DIAGRAM @ (%d,%d)\n", x, y);
                return;
            default:
                printf("%c", grid[y][x]);        
        }
        switch(direction) {
            case 8: y--; break;
            case 4: x--; break;
            case 6: x++; break;
            case 2: y++; break;
        }
        if ((y < 0) || (x < 0) || (y > 149) || (x > 149)) {
            printf("ERROR: WENT OUTSIDE DIAGRAM (%d, %d)\n", x, y);
        }
    }
}

void printVisited() {
    FILE *out = fopen("visited.html", "w");
    fprintf(out, "<html><head><title>Visited</title>");
    fprintf(out, "<style>.v {color:#ffff00; background-color:#ff0000;}</style>");
    fprintf(out, "</head><body><span style=\"font-family:monospace; font-size:6pt;\">");
    for (int y = 0; y < 150; y++) {
        for (int x = 0; x < 150; x++) {
            if (!grid[y][x])
                continue;
            if (visited[y][x])
                fprintf(out, "<span class=v>");
            if (grid[y][x] == ' ')
                fprintf(out, "&nbsp;");
            else
                fprintf(out, "%c", grid[y][x]);
            if (visited[y][x])
                fprintf(out, "</span>");
        }
        fprintf(out, "<br>\n");
    }            
    fprintf(out, "<br><hr></body></html>\n");
    fclose(out);
}

int main(int argc, char **argv) {
    load();
    walk();
    printVisited();
}
