import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 * Das startMultiplayerGame Panel dient dem Erstellen eines Online Spiels.
 * Hier kann der Benutzer Spieler inklusive Namen und das Semester, in dem sich der Benutzer befindet, einstellen.
 * @author Joshua Kuklok
 */
public class startMultiplayerGame extends JPanel {

    // Funktionshilfen
    int semesterCounter = 1;
    String PlayerNickname = "Spieler 1";

    // Grafiken
    ImageIcon backButtonIcon = new ImageIcon("graphics/backButton.png");
    ImageIcon humanPlayerIcon = new ImageIcon("graphics/humanPlayer.png");
    ImageIcon aiPlayerEasyIcon = new ImageIcon("graphics/botPlayerEasy.png");
    ImageIcon aiPlayerNormalIcon = new ImageIcon("graphics/botPlayerNormal.png");
    ImageIcon aiPlayerHardIcon = new ImageIcon("graphics/botPlayerHard.png");

    // Labels
    JLabel frameTitle = new JLabel("Multiplayer Spiel");
    JLabel semesterLabel = new JLabel("Semester");
    JLabel PlayerName = new JLabel("Name");
    JLabel PlayerIcon = new JLabel(humanPlayerIcon);
    JLabel semesterCounterLabel = new JLabel(String.valueOf(semesterCounter));

    // Buttons
    JButton backButton = new JButton(backButtonIcon);
    JButton PlayerLeftButton = new JButton("<-");
    JButton PlayerRightButton = new JButton("->");
    JButton semesterUpButton = new JButton("^");
    JButton semesterDownButton = new JButton("v");
    JButton createGameButton = new JButton("Spiel erstellen");
    JButton joinGameButton = new JButton("Spiel beitreten");

    // Textfelder
    JTextField PlayerTextField = new JTextField(20);

    /**
     * Konstruktor der startLocalGame.
     * Fügt Buttons, Textfelder und Label hinzu.
     * Fügt ebenfalls ActionListeners hinzu, damit Buttons etc. ihre gewünschte Funktion haben
     * @param frame Der Mainframe der Anwendung über den alle Panels angezeigt werden.
     * @author Joshua Kuklok
     */
    startMultiplayerGame(MainFrame frame) {

        // Layout des Panels
        setLayout(null);

        // Setze Komponentenpositionen
        frameTitle.setBounds(20, 20, 200, 30);
        add(frameTitle);

        semesterLabel.setBounds(700, 300, 200, 30);
        add(semesterLabel);

        PlayerName.setBounds(50, 625, 200, 30);
        add(PlayerName);

        PlayerIcon.setBounds(75, 400, 200, 128);
        add(PlayerIcon);

        semesterCounterLabel.setBounds(725, 475, 50, 50); // zwischen den Up/Down-Buttons
        semesterCounterLabel.setHorizontalAlignment(SwingConstants.CENTER);
        add(semesterCounterLabel);

        backButton.setBounds(1380, 20, 80, 80);
        add(backButton);

        PlayerLeftButton.setBounds(50, 450, 50, 50);
        add(PlayerLeftButton);

        PlayerRightButton.setBounds(250, 450, 50, 50);
        add(PlayerRightButton);

        semesterUpButton.setBounds(725, 400, 50, 50);
        add(semesterUpButton);

        semesterDownButton.setBounds(725, 550, 50, 50);
        add(semesterDownButton);

        joinGameButton.setBounds(1100, 350, 200, 50);
        add(joinGameButton);

        createGameButton.setBounds(1100, 550, 200, 50);
        add(createGameButton);

        PlayerTextField.setBounds(50, 650, 250, 50);
        PlayerTextField.setText(PlayerNickname);
        add(PlayerTextField);

        // ActionListener für Buttons
        // Um das Semester zu erhöhen.
        semesterUpButton.addActionListener(e -> {
            if (semesterCounter < 6) {
                semesterCounter++;
                semesterCounterLabel.setText(String.valueOf(semesterCounter));
            }
        });

        // Um das Semester zu senken.
        semesterDownButton.addActionListener(e -> {
            if (semesterCounter > 1) {
                semesterCounter--;
                semesterCounterLabel.setText(String.valueOf(semesterCounter));
            }
        });

        // Um Player nach links zu "rotieren".
        PlayerLeftButton.addActionListener(e -> {
            togglePlayerIconLeft();
            updateTextFields();
        });

        // Um Player nach rechts zu "rotieren".
        PlayerRightButton.addActionListener(e -> {
            togglePlayerIconRight();
            updateTextFields();
        });

        // Um Namen des linken Spielers zu speichern.
        PlayerTextField.addActionListener(e -> {
            PlayerNickname = PlayerTextField.getText();
            System.out.println("Linker Spielername geändert zu: " + PlayerNickname); // Debugging-Ausgabe
        });

        // Um Namen des linken Spielers zu speichern, auch wenn nicht Enter gedrückt wird.
        PlayerTextField.addFocusListener(new java.awt.event.FocusAdapter() {
            @Override
            public void focusLost(java.awt.event.FocusEvent evt) {
                PlayerNickname = PlayerTextField.getText();
                System.out.println("Linker Spielername geändert zu: " + PlayerNickname); // Debugging-Ausgabe
            }
        });

        // Um zum MainMenu zu wechseln.
        backButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                frame.showPanel("MainMenu");
            }
        });

        // Um zu JoinGame mit richtigen Parametern zu wechseln.
        joinGameButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (PlayerIcon.getIcon() == humanPlayerIcon) {
                    frame.showPanelSMG("JoinGame",1,0, PlayerNickname);
                } else if ( PlayerIcon.getIcon() == aiPlayerEasyIcon) {
                    frame.showPanelSMG("JoinGame",1,1, PlayerNickname);
                } else if ( PlayerIcon.getIcon() == aiPlayerNormalIcon) {
                    frame.showPanelSMG("JoinGame",1,2, PlayerNickname);
                } else if ( PlayerIcon.getIcon() == aiPlayerHardIcon) {
                    frame.showPanelSMG("JoinGame",1,3, PlayerNickname);
                }
            }
        });

        // Um zu JoinGame mit richtigen Parametern zu wechseln.
        createGameButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //Parameter -> panelName, Spiel erstellen oder beitreten (int), Spielertyp(int 0-3), Spielername
                if (PlayerIcon.getIcon() == humanPlayerIcon) {
                    frame.showPanelSMG("JoinGame",0,0, PlayerNickname);
                } else if ( PlayerIcon.getIcon() == aiPlayerEasyIcon) {
                    frame.showPanelSMG("JoinGame",0,1, PlayerNickname);
                } else if ( PlayerIcon.getIcon() == aiPlayerNormalIcon) {
                    frame.showPanelSMG("JoinGame",0,2, PlayerNickname);
                } else if ( PlayerIcon.getIcon() == aiPlayerHardIcon) {
                    frame.showPanelSMG("JoinGame",0,3, PlayerNickname);
                }
            }
        });
    }

    // Hilfsfunktionen

    /**
     * Setzt das jeweils "nächste" Icon, wenn der PlayerLeftButton gedrückt wird.
     * @author Joshua Kuklok
     */
    private void togglePlayerIconLeft() {
        if (PlayerIcon.getIcon() == humanPlayerIcon) {
            PlayerIcon.setIcon(aiPlayerHardIcon);
        } else if (PlayerIcon.getIcon() == aiPlayerEasyIcon){
            PlayerIcon.setIcon(humanPlayerIcon);
        } else if (PlayerIcon.getIcon() == aiPlayerNormalIcon) {
            PlayerIcon.setIcon(aiPlayerEasyIcon);
        } else if (PlayerIcon.getIcon() == aiPlayerHardIcon) {
            PlayerIcon.setIcon(aiPlayerNormalIcon);
        }
    }

    /**
     * Setzt das jeweils "nächste" Icon, wenn der PlayerRightButton gedrückt wird.
     * @author Joshua Kuklok
     */
    private void togglePlayerIconRight() {
        if (PlayerIcon.getIcon() == humanPlayerIcon) {
            PlayerIcon.setIcon(aiPlayerEasyIcon);
        } else if (PlayerIcon.getIcon() == aiPlayerEasyIcon){
            PlayerIcon.setIcon(aiPlayerNormalIcon);
        } else if (PlayerIcon.getIcon() == aiPlayerNormalIcon) {
            PlayerIcon.setIcon(aiPlayerHardIcon);
        } else if (PlayerIcon.getIcon() == aiPlayerHardIcon) {
            PlayerIcon.setIcon(humanPlayerIcon);
        }
    }

    /**
     * Aktualisiert die Textfelder basierend auf den Icons
     * @author Joshua Kuklok
     */
    private void updateTextFields() {
        if (PlayerIcon.getIcon() == humanPlayerIcon) {
            PlayerTextField.setText(PlayerNickname);
        } else if (PlayerIcon.getIcon() == aiPlayerEasyIcon){
            PlayerTextField.setText("Einfach");
        } else if (PlayerIcon.getIcon() == aiPlayerNormalIcon) {
            PlayerTextField.setText("Mittel");
        } else if (PlayerIcon.getIcon() == aiPlayerHardIcon) {
            PlayerTextField.setText("Schwer");
        }
    }
}