// Buscaminas de terminal. Uso: minesweeper filas columnas minas semilla
// Comandos: a fila columna (abrir), b fila columna (bandera), s (salir).
#include <stdio.h>

#include "board.h"

#define LINE_SIZE 80

// Hace un turno: devuelve 0 si hay que salir o se acabó la entrada, y 1 si el juego sigue.
static int play_turn(Board *board) {
    char line[LINE_SIZE];
    char command = 0;
    int row = 0;
    int col = 0;

    printf("jugada: ");
    if (fgets(line, LINE_SIZE, stdin) == NULL) {
        return 0;
    }
    int fields = sscanf(line, " %c %6d %6d", &command, &row, &col);
    if (fields == 1 && command == 's') {
        return 0;
    }
    if (fields == 3 && command == 'a') {
        board_reveal(board, row, col);
    } else if (fields == 3 && command == 'b') {
        board_toggle_flag(board, row, col);
    } else {
        printf("comandos: a fila columna, b fila columna, s\n");
    }
    return 1;
}

int main(int argc, char *argv[]) {
    int rows = 0;
    int cols = 0;
    int mines = 0;
    unsigned int seed = 0;
    if (argc != 5 || sscanf(argv[1], "%4d", &rows) != 1 || sscanf(argv[2], "%4d", &cols) != 1
        || sscanf(argv[3], "%6d", &mines) != 1 || sscanf(argv[4], "%9u", &seed) != 1) {
        printf("uso: minesweeper filas columnas minas semilla\n");
        return 1;
    }

    Board *board = board_random(rows, cols, mines, seed);
    if (board == NULL) {
        printf("no se pudo crear un tablero de %d x %d con %d minas\n", rows, cols, mines);
        return 1;
    }

    board_print(board);
    while (board_state(board) == GAME_PLAYING && play_turn(board)) {
        board_print(board);
    }

    if (board_state(board) == GAME_WON) {
        printf("Ganaron: abrieron todas las celdas sin mina.\n");
    } else if (board_state(board) == GAME_LOST) {
        printf("Perdieron: abrieron una mina.\n");
    }
    board_free(board);
    return 0;
}
