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

/**
 * Der MainFrame dient als Hub und Übergreifendes Fenster auf dem alle weiteren Panel angezeigt werden.
 * Dadurch werden keine weiteren Fenster geöffnet.
 * @author Lucas Bronson, Luca Conte, Joshua Kuklok
 */
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;
    // ---------- //

    private GameBoard gameBoard;

    /**
     * Konstruktor von MainFrame.
     * Ermöglicht es Panel anzuzeigen.
     * @author Lucas Bronson, Luca Conte, Joshua Kuklok
     */
    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");
       // mainPanel.add(winLooseScreen, "WinLooseScreen");

        // 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
     * @author Joshua Kuklok
     */
    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
     * @author Lucas Bronson, Joshua Kuklok
     */
    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();
        mainPanel.repaint();
        cardLayout.show(mainPanel, panelName);
    }

    /**
     * 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
     * @author Lucas Bronson, Luca Conte, Joshua Kuklok
     */
    public void showPanelSLG(String panelName,int semesterCounter, Player p1, Player p2) {
        this.semesterCounter = semesterCounter;

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

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

        startLocalGameLoadingScreen LocalGameLoadingScreen = new startLocalGameLoadingScreen(this, semesterCounter);
        mainPanel.add(LocalGameLoadingScreen, panelName);
        mainPanel.revalidate();
        mainPanel.repaint();
        cardLayout.show(mainPanel, panelName); // Panel anzeigen
    }

    /**
     * Spezifische ShowPanel für WinScreen Klasse
     * @param panelName Name des anzuzeigenden Panels
     * @param player Player von dem die funktion aufgerufen worden ist
     * @author Lucas Bronson, Peer Ole Wachtel
     */
    public void showPanelWin(String panelName, Player player){
        if(player != gameBoard.getP1()){
            return;
        }
        WinScreen winScreen = new WinScreen(this);
        mainPanel.add(winScreen, panelName);
        mainPanel.revalidate();
        mainPanel.repaint();
        cardLayout.show(mainPanel, panelName);
    }

    /**
     * Spezifische ShowPanel für LooseScreen Klasse
     * @param panelName Name des anzuzeigenden Panels
     * @param player Player von dem die funktion aufgerufen worden ist
     * @author Lucas Bronson, Peer Ole Wachtel
     */
    public void showPanelLoose(String panelName, Player player){
        if(player != gameBoard.getP1()){
            return;
        }
        this.gameBoard.getP1().destroy();
        this.gameBoard.getP2().destroy();
        LooseScreen looseScreen = new LooseScreen(this);
        mainPanel.add(looseScreen,panelName);
        mainPanel.revalidate();
        mainPanel.repaint();
        cardLayout.show(mainPanel, panelName);
    }

    /**
     * Aktualisiert das Spielfeld (kontextText)
     * @author Luca Conte
     */
    public void refreshGameBoard() {
        if(this.gameBoard == null) {
            return;
        }
        this.gameBoard.refresh();
    }
}