import java.awt.*;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.InetSocketAddress;

/**
 * Das JoinGame Panel dient zum setzten des Ports/IP-Adresse.
 * Anschließend kann das Verbinden Panel gezeigt werden.
 * @author Lucas Bronson
 */
public class JoinGame extends JPanel {

    // Grafiken
    ImageIcon backButtonIcon = new ImageIcon("graphics/backButton.png");

    // Labels
    JLabel spielBeitretenLabel;
    JLabel ipLabel = new JLabel("IP-Adresse");
    JLabel portLabel = new JLabel("Port");

    // Textfelder
    JTextField ipTextField = new JTextField(20);
    JTextField portTextField = new JTextField(20);

    // Buttons
    JButton losButton = new JButton("Los!");
    JButton backButton = new JButton(backButtonIcon);

    // Font
    Font robotoFont = new Font("Roboto", Font.BOLD, 45);

    /**
     * Erstellt mittels Funktionsaufrufen das Panel.
     * @param frame Der Mainframe der Anwendung über den alle Panels angezeigt werden.
     * @param g int-Anzeige, ob es sich um "spiel erstellen" oder "spiel beitreten" handelt.
     * @param playerType int-Anzeige, ob es sich um einen HumanPlayer,AIEasy... handelt.
     * @param playerName Name des Spielers
     * @author Lucas Bronson, Joshua Kuklok
     */
    public JoinGame(MainFrame frame,int g,int playerType,String playerName) {
        setLayout(null);
        buildPanel(frame,g,playerType,playerName);
    }

    /**
     * Erstellt das Panel.
     * @param frame Der Mainframe der Anwendung über den alle Panels angezeigt werden.
     * @param g int-Anzeige, ob es sich um "spiel erstellen" oder "spiel beitreten" handelt.
     * @param playerType int-Anzeige, ob es sich um einen HumanPlayer,AIEasy... handelt.
     * @param playerName Name des Spielers
     * @author Lucas Bronson, Joshua Kuklok
     */
    private void buildPanel(MainFrame frame,int g,int playerType,String playerName) {
        if(g==1){
            spielBeitretenLabel= new JLabel("Spiel beitreten");
        }else{
            spielBeitretenLabel= new JLabel("Spiel erstellen");
        }

        spielBeitretenLabel.setBounds(20,20,700, 100);
        losButton.setBounds(320, 225, 100, 50);
        backButton.setBounds(1380, 20, 80, 80);

        portLabel.setBounds(50, 200, 200, 30);

        if(g==1) { // Wenn man Spiel erstellen will, werden IP-Felder nicht angezeigt.
            ipLabel.setBounds(50, 125, 200, 30);
            ipTextField.setBounds(50, 150, 250, 50);
        }

        portTextField.setBounds(50, 225, 250, 50);

        spielBeitretenLabel.setFont(robotoFont.deriveFont(50f));

        add(spielBeitretenLabel);
        add(ipLabel);
        add(portLabel);
        add(losButton);
        add(ipTextField);
        add(portTextField);
        add(backButton);

        // ActionListener für Buttons.
        // Um in das MultiplayerGame zurückzuwechseln.
        backButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                frame.showPanel("MultiplayerGame");
            }
        });

        // Um das Verbinden Panel anzuzeigen und Daten an Backend weiterzureichen.
        losButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                String ipAddress = ipTextField.getText();
                if (ipAddress.isEmpty()) {
                    ipAddress = "0.0.0.0";
                }
                String portText = portTextField.getText();

                int port = Integer.parseInt(portText);
                InetSocketAddress address = new InetSocketAddress(ipAddress, port);

                frame.showPanel("Verbinden");

                try {
                    if(playerType == 0) {
                        GameController.startOnlineGame(HumanPlayer.class, playerName, address,GameController.semesterToBoardSize(2));
                    } else if(playerType == 1) {
                        GameController.startOnlineGame(SpecificAiPlayerEasy.class, playerName, address,GameController.semesterToBoardSize(2));
                    } else if (playerType == 2) {
                        GameController.startOnlineGame(SpecificAiPlayerMedium.class, playerName, address,GameController.semesterToBoardSize(2));
                    } else if (playerType == 3) {
                        GameController.startOnlineGame(SpecificAiPlayerHard.class, playerName, address,GameController.semesterToBoardSize(2));
                    }
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }
            }
        });
    }
}