// Resuelve los tableros de los archivos dados, con los dos métodos, y compara sus nodos.
// Con un solo archivo escribe además el tablero y su solución.
#include <stdio.h>

#include "board.h"
#include "solver.h"

static void print_result(const char *method, int solved, long nodes) {
    if (solved) {
        printf("  %s resuelto, %ld nodos\n", method, nodes);
    } else {
        printf("  %s sin solución, %ld nodos\n", method, nodes);
    }
}

// Devuelve 0 si el archivo no se pudo usar.
static int solve_file(const char *path, int show_boards) {
    Board original;
    if (!board_load(path, &original)) {
        fprintf(stderr, "%s: no se pudo leer un tablero de 9 líneas de 9 dígitos\n", path);
        return 0;
    }
    if (!board_is_legal(&original)) {
        fprintf(stderr, "%s: el tablero repite un dígito\n", path);
        return 0;
    }

    Board in_order = original;
    Board fewest = original;
    long nodes_in_order = 0;
    long nodes_fewest = 0;
    int solved_in_order = solve_in_order(&in_order, &nodes_in_order);
    int solved_fewest = solve_fewest_options(&fewest, &nodes_fewest);

    printf("%s\n", path);
    if (show_boards) {
        board_print(&original);
    }
    print_result("orden de lectura:", solved_in_order, nodes_in_order);
    print_result("menos opciones:  ", solved_fewest, nodes_fewest);
    if (show_boards && solved_in_order) {
        board_print(&in_order);
    }
    return 1;
}

int main(int argc, char *argv[]) {
    if (argc < 2) {
        fprintf(stderr, "uso: %s archivo...\n", argv[0]);
        return 1;
    }
    int status = 0;
    for (int i = 1; i < argc; i++) {
        if (!solve_file(argv[i], argc == 2)) {
            status = 1;
        }
    }
    return status;
}
