import javax.swing.*;
import java.awt.*;

//TODO Generell Buttons in GameBoard anpassen

/**
 * Der MainFrame dient als Hub und Übergreifendes Fenster auf dem alle weiteren Panel angezeigt werden.
 * Dadurch werden keine weiteren Fenster geöffnet.
 */
public class MainFrame extends JFrame {

    private CardLayout cardLayout;
    private JPanel mainPanel;

    // ---------- //
    // Diverse Hilfsvariablen (für Parameterübergabe etc.)
    // Von startMultiplayerGame an JoinGame
    int localMult;

    // Von startLocalGame an startLocalGameLoadingScreen
    // Von startLocalGameLoadingScreen an GameBoard
    int semesterCounter;
    // ---------- //

    /**
     * Konstruktor von MainFrame.
     * Ermöglicht es Panel anzuzeigen.
     */
    public MainFrame() {

        GameController.setMainFrame(this);

        setTitle("Studium Versenken");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(1500, 1000);
        setLocationRelativeTo(null);

        // CardLayout und Hauptpanel erstellen
        cardLayout = new CardLayout();
        mainPanel = new JPanel(cardLayout);

        // Panels erstellen
        MainMenuView mainMenuView = new MainMenuView(this);
        startLocalGame localGame = new startLocalGame(this);
        startMultiplayerGame multiplayerGame = new startMultiplayerGame(this);
        coinToss coinToss = new coinToss(this);
        Verbinden verbinden = new Verbinden(this);

        // Panels hinzufügen
        mainPanel.add(mainMenuView, "MainMenu");
        mainPanel.add(localGame, "LocalGame");
        mainPanel.add(multiplayerGame, "MultiplayerGame");
        mainPanel.add(coinToss, "coinToss");
        mainPanel.add(verbinden, "Verbinden");

        // Hauptpanel in JFrame hinzufügen
        add(mainPanel);

        // Hauptmenü anzeigen
        cardLayout.show(mainPanel, "MainMenu");
    }

    /**
     * Methode, um die Ansicht zu wechseln
     * @param panelName Name des anzuzeigenden Panels
     */
    public void showPanel(String panelName) {
        cardLayout.show(mainPanel, panelName);
    }

    /**
     * Spezifische ShowPanel-Funktion der startMultiplayerGame Klasse
     * @param panelName Name des anzuzeigenden Panels
     * @param num Hilfsvariable um abzugleichen, ob "Spiel erstellen" oder "Spiel beitreten" ausgewählt wurde
     * @param playerType Spielertyp(HumanPlayer, AIEasy etc.)
     * @param playerName Name des Spielers
     */
    public void showPanelSMG(String panelName, int num, int playerType,String playerName) {
        this.localMult = num;

        JoinGame joinGame = new JoinGame(this, localMult, playerType, playerName);
        mainPanel.add(joinGame, panelName);
        mainPanel.revalidate(); // Refresh
        mainPanel.repaint();
        cardLayout.show(mainPanel, panelName); // Show the panel
    }

    /**
     * Spezifische ShowPanel der startLocalGameLoadingScreen Klasse (DURCH BACKEND AUFGERUFEN)
     * @param panelName Name des anzuzeigenden Panels
     * @param semesterCounter Ausgewähltes Semester
     * @param p1 Erstes Spielerobjekt
     * @param p2 Zweites Spielerobjekt
     */
    public void showPanelSLG(String panelName,int semesterCounter, Player p1, Player p2) {
        this.semesterCounter = semesterCounter;

        GameBoard gameBoard = new GameBoard(this, semesterCounter, p1, p2);
        mainPanel.add(gameBoard, panelName);
        mainPanel.revalidate();
        mainPanel.repaint();
        cardLayout.show(mainPanel, panelName); // Show the panel
    }

    /**
     * Spezifische ShowPanel der startLocalGame Klasse
     * @param panelName Name des anzuzeigenden Panels
     * @param semesterCounter Ausgewähltes Semester
     */
    public void showPanelSLGLS(String panelName,int semesterCounter) {
        this.semesterCounter = semesterCounter;

        startLocalGameLoadingScreen LocalGameLoadingScreen = new startLocalGameLoadingScreen(this, semesterCounter);
        mainPanel.add(LocalGameLoadingScreen, panelName);
        mainPanel.revalidate(); // Refresh
        mainPanel.repaint();
        cardLayout.show(mainPanel, panelName); // Show the panel
    }
}