package com.anibal.prueba_pooproyect;

import android.content.Context;
import android.content.res.Resources;

import java.util.ArrayList;

/**
 * clase encargada de las logicas del juego para detectar ganador
 */
public class Game {
    /**
     * constructor de Game
     * @param board tablero de entrada
     * @param n alto
     * @param m ancho
     */
    Game(Board board,int n,int m) {
        this.n = n;
        this.m = m;
        this.board = board;
        this.playerNumber = playerNumber;
        isThereAwinner = false;
        winnerCoordinates = new int [2];


    }

    /**
     * metodo para preguntarse si hay un ganador, en caso de  que exista se retorna el int del jugador, en caso que no se retorna 0
     * @param jugador int del jugador de entrada para ser convertido a char.
     * @return retorna o el jugador o un 0.
     */
    public int isThereAwinner(int jugador) {
        Character jugadorActual = (char) (jugador + '0');

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (board.returnCordinates(i,j) == jugadorActual) {
                    if (checkRow(jugadorActual, i, j))
                        return jugador; // chequea hacia la derecha
                    if (checkCol(jugadorActual, i, j))
                        return jugador; //chequea hacia abajo
                    if (checkLeftDiagonal(jugadorActual, i, j))
                        return jugador; //chequea hacia abajo a la izquierda
                    if (checkRightDiagonal(jugadorActual, i, j))
                        return jugador; //chequea hacia abajo a la derecha
                }
            }
        }
        return 0; //No hay ganador!
    }

    /**
     * metodo utilizado para chekear ganador en la fila y determinar como se gano el juego
     * @param jugador char del jugador
     * @param i coordenada
     * @param j coordenada
     * @return retorna un valor booleano
     */
    public boolean checkRow(char jugador, int i, int j) {
        int contador = 0;
        char jugadorActual = jugador;
        for (int y = 0; y < 5; y++) {
            if ((i + y) < n) {
                if (board.returnCordinates(i + y,j) == jugadorActual) {
                    contador++;
                }
            }
            if (contador == 5) {
                winnerCoordinates[0] = i;
                winnerCoordinates[1] = j;
                howWonTheGame = "ROW"; //row
                return true;
            }
        }
        //System.out.println(contador + "  " + jugadorActual + "ROW");
        return false;
    }
    /**
     * metodo para chekear ganador en la columna y determinar como se gano el juego
     * @param jugador char de entrada
     * @param i coordenada
     * @param j cordenada
     */

    public boolean checkCol(char jugador, int i, int j) {
        int contador = 0;
        char jugadorActual = jugador;
        for (int y = 0; y < 5; y++) {
            if ((j + y) < m) {
                if (board.returnCordinates(i,j + y) == jugadorActual) {
                    contador++;

                }
            }
            if (contador == 5) {
                winnerCoordinates[0] = i;
                winnerCoordinates[1] = j;
                howWonTheGame = "COL"; //column
                return true;
            }
        }
        //System.out.println(contador + "  " + jugadorActual + "COL");
        return false;
    }
    /**
     * metodo para chekear ganador en la diagonal izquierda descendiente y determinar como se gano el juego
     * @param jugador char de entrada
     * @param i coordenada
     * @param j cordenada
     */

    public boolean checkLeftDiagonal(char jugador, int i, int j) {
        int contador = 0;
        char jugadorActual = jugador;
        for (int y = 0; y < 5; y++) {
            if ((i + y) < n && (j - y) >= 0) {
                if (board.returnCordinates(i + y,j - y) == jugadorActual) {
                    contador++;

                }
            }
            if (contador == 5) {
                winnerCoordinates[0] = i;
                winnerCoordinates[1] = j;
                howWonTheGame = "LD"; //leftt diagonal
                return true;
            }
        }
        //System.out.println(contador + "  " + jugadorActual + "LD");
        return false;
    }
    /**
     * metodo para chekear ganador en la diagonal derecha descendiente y determinar como se gano el juego
     * @param jugador char de entrada
     * @param i coordenada
     * @param j cordenada
     */
    public boolean checkRightDiagonal(char jugador, int i, int j) {
        int contador = 0;
        char jugadorActual = jugador;
        for (int y = 0; y < 5; y++) {
            if ((i + y) < n && (j + y) < m) {
                if (board.returnCordinates(i + y,j + y) == jugadorActual) {
                    contador++;
                }
            }
            if (contador == 5) {
                winnerCoordinates[0] = i;
                winnerCoordinates[1] = j;
                howWonTheGame = "RD"; //right diagonal
                return true;
            }
        }
        //System.out.println(contador + "  " + jugadorActual + "RD");
        return false;
    }

    /**
     * metodo que retorna las coordenadas en donde se gano
     * @return coordenadas en donde se gano
     */
    public int[] getWinnerCoordinates(){
        return winnerCoordinates;
    }

    /**
     * metodo para devolver como se gano el juego
     * @return string correspondiente a como se gano el juego, utilizado en main para ver en que direccion pintar
     */
    public String getHowWonTheGame() {
        return howWonTheGame;
    }

    private String howWonTheGame; // para ver con cual de los 4 algoritmos se gano
    private int [] winnerCoordinates;
    private int n,m;
    private int playerNumber;
    private boolean isThereAwinner;
    private Board board;
    private char winner;
}

