#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <ctype.h>
#include "spieler.h"
#include "Moving.h"
#include "Koenig.h"

bool GreiftBauerAn(char** Brett, int x, int y, Player player) {
    // Checke für weißen Bauer
    if (player == PLAYER_BLACK) {
        if (y > 0 && x > 0 && Brett[y - 1][x - 1] == 'P') { // Linke Diagonale
            return true;
        }
        if (y > 0 && x < 7 && Brett[y - 1][x + 1] == 'P') { // Rechte Diagonale
            return true;
        }
    }
    // Checke für schwarzen Bauer
    if (player == PLAYER_WHITE) {
        if (y < 7 && x > 0 && Brett[y + 1][x - 1] == 'p') { // Linke Diagonale
            return true;
        }
        if (y < 7 && x < 7 && Brett[y + 1][x + 1] == 'p') { // Rechte Diagonale
            return true;
        }
    }
    return false;
}

bool GreiftTurmAn(char** Brett, int x, int y, Player player) {
    char Turm = player == PLAYER_WHITE ? 'r' : 'R';

    // Check Vertikal Hoch
    for (int i = y - 1; i >= 0; i--) {
        if (Brett[i][x] != ' ') { 
            if (Brett[i][x] == Turm) {
                return true;
            }
            break; // Stoppt wenn irgendeine Figur gefunden wird
        }
    }

    // Vertikal Runter
    for (int i = y + 1; i < 8; i++) {
        if (Brett[i][x] != ' ') {
            if (Brett[i][x] == Turm) {
                return true;
            }
            break;
        }
    }

    // Horizontal Links
    for (int j = x - 1; j >= 0; j--) {
        if (Brett[y][j] != ' ') {
            if (Brett[y][j] == Turm) {
                return true;
            }
            break;
        }
    }

    // Horizontal Rechts
    for (int j = x + 1; j < 8; j++) {
        if (Brett[y][j] != ' ') {
            if (Brett[y][j] == Turm) {
                return true;
            }
            break;
        }
    }
    return false;
}

bool GreiftSpringerAn(char** Brett, int x, int y, Player player) {
    int Springerzüge[8][2] = {
        {2, 1}, {1, 2}, {-1, 2}, {-2, 1},
        {-2, -1}, {-1, -2}, {1, -2}, {2, -1}
    };

    for (int i = 0; i < 8; i++) {
        int neuX = x + Springerzüge[i][0];
        int neuY = y + Springerzüge[i][1];
        if (neuX >= 0 && neuX < 8 && neuY >= 0 && neuY < 8) {
            char Figur = Brett[neuY][neuX];
            if (player == PLAYER_WHITE && Figur == 'n') {
                return true;
            } else if (player == PLAYER_BLACK && Figur == 'N') {
                return true;
            }
        }
    }
    return false;
}
bool istFeldUnsicher(char** Brett, int x, int y, Player player) {
    
    if (GreiftSpringerAn(Brett, x, y, player)) {
        return true;
    }
        if (GreiftBauerAn(Brett, x, y, player)) {
        return true;
    }
     if (GreiftTurmAn(Brett, x, y, player)) {
        return true;
    }

    return false;
}

bool istzugerlaubt_Koenig(char** Brett, int startX, int startY, int endX, int endY, Player player) {
    // Schauen ob der zug auf dem Spielbrett passiert
    if (endX < 0 || endX >= 8 || endY < 0 || endY >= 8) 
    return false;

    // Berechnung des unterschieds der start und endpositionen
    int dx = abs(endX - startX);
    int dy = abs(endY - startY);

    // Schauen ob sich nur ein feld bewegt wird
    if (dx > 1 || dy > 1) return false;

    // Nicht auf befreundete Figuren bewegen
    char endPosition = Brett[endY][endX];
    if (player == PLAYER_WHITE && isupper(endPosition)) 
    return false;
    if (player == PLAYER_BLACK && islower(endPosition)) 
    return false;

    // mehr checks noch benötigt

    return true;
}