package pp.monopoly.client;

import com.jme3.input.KeyInput;
import com.jme3.scene.Spatial;
import com.simsilica.lemur.Button;
import org.junit.Before;
import org.junit.Test;

import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;

public class ClientLogicTest {

    private MonopolyApp app;

    @Before
    public void setUp() {
        app = new MonopolyApp();
        app.simpleInitApp();
    }

    @Test
    // T001: UC-game-01 - Überprüft, ob die Anwendung erfolgreich gestartet wird und das Hauptmenü angezeigt wird
    public void testStartApplication() {
        Spatial mainMenu = app.getGuiNode().getChild("MainMenu");
        assertNotNull("Das Hauptmenü sollte sichtbar sein", mainMenu);
    }
/*
    @Test
    // T002: UC-game-02 - Überprüft, ob das Startmenü nach dem Start der Anwendung angezeigt wird
    public void testOpenStartMenu() {
        Spatial startMenu = app.getGuiNode().getChild("StartMenu");
        assertNotNull("Das Startmenü sollte sichtbar sein", startMenu);
    }
*/
@Test
// T002: UC-game-02 - Überprüft, ob das Startmenü (MainMenu) angezeigt wird und die Buttons korrekt funktionieren
public void testMainMenuButtons() {
    Spatial mainMenu = app.getGuiNode().getChild("MainMenu");
    assertNotNull("Das Hauptmenü (MainMenu) sollte sichtbar sein", mainMenu);

    Spatial playButtonSpatial = app.getGuiNode().getChild("PlayButton");
    assertNotNull("Der 'Spielen'-Button sollte existieren", playButtonSpatial);

    Spatial settingsButtonSpatial = app.getGuiNode().getChild("SettingsButton");
    assertNotNull("Der 'Einstellungen'-Button sollte existieren", settingsButtonSpatial);

    Spatial exitButtonSpatial = app.getGuiNode().getChild("ExitButton");
    assertNotNull("Der 'Spiel beenden'-Button sollte existieren", exitButtonSpatial);

    // Optional: Überprüfung der Funktionalität (Simulation von Button-Klicks)
    if (playButtonSpatial instanceof Button) {
        Button playButton = (Button) playButtonSpatial;
        playButton.click();

        Spatial newGameMenu = app.getGuiNode().getChild("NewGameMenu");
        assertNotNull("Das Spielerstellungsmenü sollte nach dem Klicken auf 'Spielen' sichtbar sein", newGameMenu);
    } else {
        throw new AssertionError("'PlayButton' ist kein Button-Objekt.");
    }

    if (settingsButtonSpatial instanceof Button) {
        Button settingsButton = (Button) settingsButtonSpatial;
        settingsButton.click();

        Spatial settingsMenu = app.getGuiNode().getChild("SettingsMenu");
        assertNotNull("Das Einstellungsmenü sollte nach dem Klicken auf 'Einstellungen' sichtbar sein", settingsMenu);
    } else {
        throw new AssertionError("'SettingsButton' ist kein Button-Objekt.");
    }

    if (exitButtonSpatial instanceof Button) {
        Button exitButton = (Button) exitButtonSpatial;
        exitButton.click();

        Spatial mainMenuAfterExit = app.getGuiNode().getChild("MainMenu");
        assertNull("Das Hauptmenü sollte nach dem Klicken auf 'Spiel beenden' nicht mehr sichtbar sein", mainMenuAfterExit);
    } else {
        throw new AssertionError("'ExitButton' ist kein Button-Objekt.");
    }
}
    @Test
    // T003: UC-game-03 - Überprüft, ob der „Spiel starten“-Button das Spielerstellungsmenü öffnet
    public void testNavigateToPlayOption() {
        Spatial startGameButtonSpatial = app.getGuiNode().getChild("StartGameButton");
        assertNotNull("Der 'Spiel starten'-Button sollte existieren", startGameButtonSpatial);

        if (startGameButtonSpatial instanceof Button) {
            Button startGameButton = (Button) startGameButtonSpatial;
            startGameButton.click();

            Spatial newGameMenu = app.getGuiNode().getChild("NewGameMenu");
            assertNotNull("Das Spielerstellungsmenü sollte sichtbar sein", newGameMenu);
        } else {
            throw new AssertionError("'StartGameButton' ist kein Button-Objekt.");
        }
    }

    @Test
    // T004: UC-game-04 - Testet, ob die Anwendung geschlossen wird, wenn „Beenden“ im Hauptmenü gewählt wird
    public void testExitApplicationFromMenu() {
        Spatial exitButtonSpatial = app.getGuiNode().getChild("ExitButton");
        assertNotNull("Der 'Beenden'-Button sollte existieren", exitButtonSpatial);

        if (exitButtonSpatial instanceof Button) {
            Button exitButton = (Button) exitButtonSpatial;
            exitButton.click();

            Spatial mainMenuAfterExit = app.getGuiNode().getChild("MainMenu");
            assertNull("Das Hauptmenü sollte nach dem Beenden nicht mehr sichtbar sein", mainMenuAfterExit);
        } else {
            throw new AssertionError("'ExitButton' ist kein Button-Objekt.");
        }
    }

    @Test
    // T005: UC-game-05 - Überprüft, ob das Einstellungen-Menü aus dem Hauptmenü aufgerufen werden kann
    public void testOpenSettingsFromMenu() {
        Spatial settingsButtonSpatial = app.getGuiNode().getChild("SettingsButton");
        assertNotNull("Der 'Einstellungen'-Button sollte existieren", settingsButtonSpatial);

        if (settingsButtonSpatial instanceof Button) {
            Button settingsButton = (Button) settingsButtonSpatial;
            settingsButton.click();

            Spatial settingsMenu = app.getGuiNode().getChild("SettingsMenu");
            assertNotNull("Das Einstellungsmenü sollte sichtbar sein", settingsMenu);
        } else {
            throw new AssertionError("'SettingsButton' ist kein Button-Objekt.");
        }
    }

    @Test
    // T006: UC-game-06 - Testet, ob das Spielmenü geöffnet wird, wenn der Spieler im Spiel „ESC“ drückt
    public void testOpenGameMenuWithESC() {
        app.escape(true); // Simuliert das Drücken der ESC-Taste

        Spatial gameMenu = app.getGuiNode().getChild("GameMenu");
        assertNotNull("Das Spielmenü sollte nach Drücken von ESC sichtbar sein", gameMenu);

        app.escape(false); // Simuliert das Loslassen der ESC-Taste
    }


    @Test
    // T083: UC-menu-05 - Überprüfen, ob der Spieler erfolgreich ins Spiel zurückkehren kann
    public void testReturnToGame() {
        Spatial returnButtonSpatial = app.getGuiNode().getChild("ReturnButton");
        assertNotNull("Der 'Zurück'-Button sollte existieren", returnButtonSpatial);

        if (returnButtonSpatial instanceof Button) {
            Button returnButton = (Button) returnButtonSpatial;
            returnButton.click();

            Spatial gameScene = app.getGuiNode().getChild("GameScene");
            assertNotNull("Die Spielszene sollte nach dem Klick auf 'Zurück' sichtbar sein", gameScene);
        } else {
            throw new AssertionError("'ReturnButton' ist kein Button-Objekt.");
        }
    }
}