import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.util.*;
import java.lang.*;

/**
 * Clase encargada de inicializar y mostrar la ventana grafica del programa cliente,
 * configura la barra de menu, atiende eventos de barra de menu, atiende eventos
 * de mouse y teclado. (Incompleto aun)
 * 
 */
public class ClientFrame extends JFrame implements ActionListener
{
   /**
    * Encargado de manejar la conexion al servidor.
    */
   private Connection conn;
   
   /**
    * (uso interno)
    */
   private Container contentPane;
   
   /**
    * Barra de menu.
    */
   private JMenuBar menuBar;
   
   
   private Panel panel;
   
   /**
    * Identificador del jugador, para que los jugadores sea claramente distinguibles.
    */
   private int myID = 0;
   
   /**
    * Inicializa la ventana grafica, crea la estructura de menus.
    */
   public ClientFrame()
   {
      setTitle("KaBoom");
      setResizable(false);
      setSize(800, 600);
      
      menuBar = new JMenuBar();
      
      JMenu menuJuego = new JMenu("Juego");
      menuBar.add(menuJuego);
      
      JMenuItem menuJuegoConectar = new JMenuItem("Conectar a");
      menuJuego.add(menuJuegoConectar);
      menuJuegoConectar.addActionListener(this);
      
      JMenuItem menuJuegoSalir = new JMenuItem("Salir");
      menuJuego.add(menuJuegoSalir);
      menuJuegoSalir.addActionListener(this);
      
      setJMenuBar(menuBar);
      
      panel = new Panel();
      
      contentPane = getContentPane();
      contentPane.add(panel);
      //menuPanel.buildMainMenu();
      contentPane.validate();
      setVisible(true);
      
      conn = new Connection();
   }
   
   /**
    * Atiende eventos de la barra de menu. (Incompleto aun) por ahora contiene tambien
    * una secuencia de comandos de prueba que son enviados al servidor.
    * @param e (uso interno)
    */
   public void actionPerformed(ActionEvent e)
   {
      String cmd = e.getActionCommand();
      String data;
      ArrayList<String> _data;
      
      if(cmd.equals("Conectar a"))
      {
         String servAddr = JOptionPane.showInputDialog("Ingrese direccion del servidor",
                                                       "192.168.0.150");
         
         String _port = JOptionPane.showInputDialog("Ingrese puerto", "10000");
         int port = Integer.parseInt(_port);
         
         String err = conn.connect(servAddr, port);
         
         if (!err.equals("success"))
         {
            JOptionPane.showMessageDialog(this,
               "No se pudo establecer la conexion",
               "Error de conexion",
               JOptionPane.ERROR_MESSAGE);
               return;
         }
         else if (err.equals("wrongserver"))
         {
            JOptionPane.showMessageDialog(this,
               "No es un servidor de KaBoom",
               "Error de servidor",
               JOptionPane.ERROR_MESSAGE);
               return;
         }
         
         data = conn.recv(true);
         myID = Integer.parseInt(data);
         System.out.println("myId = " + myID);
         
         _data = new ArrayList<String>();
         data = conn.recv(true);
         while (!data.equals("END_MAP"))
         {
            _data.add(new String(data));
            data = conn.recv(true);
         }
         //panel.createMap(_data);
         
         _data = new ArrayList<String>();
         data = conn.recv(true);
         while (!data.equals("END_WARRIOR"))
         {
            _data.add(new String(data));
            data = conn.recv(true);
         }
         panel.initWarriors(_data);
         System.out.println("initWarriors");
         panel.repaint();
         
         data = conn.recv(true);
         while (!data.equals("END_GAME"))
         {
            //panel.startClock(60);
            if (Integer.parseInt(data) == myID)
            {
               //mi turno
               try
               {
                  Thread.sleep(3000);
                  conn.send("move " + myID + " r");
                  panel.doCmd("move " + myID + " r");
                  panel.repaint();
                  contentPane.validate();
                  repaint();
                  Thread.sleep(3000);
                  conn.send("move " + myID + " r");
                  panel.doCmd("move " + myID + " r");
                  panel.repaint();
                  validate();
                  repaint();
                  Thread.sleep(3000);
                  conn.send("END_GAME");
                  System.exit(0);
               }
               catch (InterruptedException ei)
               {
                  System.out.println("sleep error");
                  System.exit(-1);
               }
            }
            else
            {
               //turno ajeno
               data = conn.recv(true);
               System.out.println("recibido: " + data);
               while (!data.equals("END_TURN"))
               {
                  panel.doCmd(data);
                  panel.repaint();
                  contentPane.validate();
                  repaint();
                  
                  data = conn.recv(true);
                  System.out.println("recivido: " + data);
               }
            }
         }
         
         return;
      }
      else if (cmd.equals("Salir"))
      {
         System.exit(0);
      }
   }
}
