package com.anibal.prueba_pooproyect;

import java.util.HashSet;
import java.util.Set;

/**
 * Clase board encargada de crear el backend del tablero y hacer los analisis pertinentes
 */
public class Board {
    /**
     * constructor del tablero
     *
     * @param n alto
     * @param m ancho
     */
    Board(int n, int m) {
        this.n = n;
        this.m = m;
        board = new char[n][m];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                board[i][j] = '.';
            }
        }
    }

    /**
     * constructor para un tablero alternativo en caso de necesitar otro
     *
     * @param other = un board ya existente.
     */
    public Board(Board other) {
        this.n = other.n;
        this.m = other.m;
        this.board = new char[n][m];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                this.board[i][j] = other.board[i][j];
            }
        }
    }

    /**
     * metodo para limpiar el tablero, se utiliza cada vez que una partida comienza nuevamente
     */
    public void clearBoard() {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                board[i][j] = '.';
            }
        }
    }

    /**
     * metodo importantisimo que devuelve las cordenadas vacias en el tablero, es utilizado para ver validez de jugadas y el
     * analisis del bot
     *
     * @return retorna el hashset con las jugadas vacias. se utiliza por la rapidez que tiene ya que no importa el orden
     * de los datos retornados
     */
    Set<String> getEmpties() {
        Set<String> ems = new HashSet<String>();
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (board[i][j] == '.') {
                    ems.add(i + " " + j);
                }

            }
        }
        return ems;
    }

    /**
     * metodo utilizado para escribir un movimiento en el board
     * @param p = player como int (1 2 3 4)
     * @param move = coordenadas de movimiento en el formato x+" "+y
     * @param out = variable booleana que si esta en true imprime en consola donde se jugo, se utiliza con propositos de analisis de codigo
     * @return retorna el movimiento, un string
     */
    String placeMove(int p, String move, boolean out) {
        int[] ij = parseMove(move);
        board[ij[0]][ij[1]] = (char) (p + '0'); // el + '0' es necesario para que complete el casteo correcto!
        if (out)
            System.out.println(move);
        // aca seteaba el player previo
        //winner = setWinner(p, ij);
        return move;
    }

    /**
     * retorna el caracter en las coordenadas i,j
     * @param i
     * @param j
     * @return char del jugador en esa posicion, '.' en caso de estar vacio
     */
    public char returnCordinates(int i, int j) {
        return board[i][j];

    }

    /**
     * separa el movimiento en formato string a dos enteros (x,y)
     * @param s string con las coordenadas de movimiento en el formato descrito en placeMove();
     * @return
     */
    int[] parseMove(String s) {
        String[] ss = s.split(" ");
        int[] ij = {Integer.parseInt(ss[0]), Integer.parseInt(ss[1])};
        return ij;
    }

    /**
     * metodo utilizado para imprimir en consola el tablero, utilizado principalmente cuando aun se trabajaba en java y no en
     * android studio. Utilidad solamente para analizar en consola.
     */
    public void printBoard() {
        for (int i = 0; i < n; i++) {
            System.out.println(board[i]);
        }

    }


    private char[][] board;
    int n;
    int m;
}



