import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;
import java.net.Socket;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.ResourceBundle;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

import java.rmi.*;
import java.rmi.registry.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;

public class ClienteRMI implements ActionListener, Runnable, Serializable {
        /**   
	 * @param host                  Nombre del host
	 * @param puerto        	Puerto que se usará para la conexión
	 * @param botonCapturar		Boton para la captura
 	 * @param botonGuardar  	Boton para guardar archivo
	 * @param botonSalir		Boton para salir de la aplicación
	 * @param chooser               Para seleccionar carpeta al guardar
         * @param extra                 Variable auxiliar para desplegar en pantalla
         * @param imagen                Imagen a capturar
         * @param panelImagen           Panel en el que se adjunta la imagen para desplegarla en pantalla
        */    
	private static String host;
	private static int puerto;
	private JButton botonCapturar;
	private JButton botonGuardar;
	private JButton botonSalir;
        private JPasswordField campoClave;
        private JTextField campoUsuario;
	private ObjectInputStream canal;
	private JFileChooser chooser;
	private String clave;
	private JFrame extra;
        private Thread hilo;
	private Image imagen = null;
	private InterfazRMI interfaz;
	private ImagePanel panelImagen2 = new ImagePanel();;
	private ResourceBundle propiedades;
        private Socket socket;
	private String usuario = "localhost";
	private JFrame ventana;
        private static Registry registro;
        private static String direccionServidor = "127.0.0.1";
        private int devolucion;
        private BufferedImage image2;
        private Image imagenFinal;
        private Graphics g;
        
    //---------------Se inicializan las variables
    public ClienteRMI() throws NotBoundException {
		propiedades = ResourceBundle.getBundle("cliente");

		host = propiedades.getString("host");
		puerto = Integer.parseInt(propiedades.getString("puerto"));
		interfaz = null;

		try {
                        registro = LocateRegistry.getRegistry(direccionServidor, (new Integer(puerto)).intValue());
                        // creando el objeto remoto
                        interfaz = (InterfazRMI) (registro.lookup("ServidorRMI"));
		} catch (RemoteException e) {
		} 		
		mostrarConexion();

        hilo = new Thread(this);
    }
    
    public static void main(String[] args) throws NotBoundException {
    	JFrame.setDefaultLookAndFeelDecorated(true);
    	JDialog.setDefaultLookAndFeelDecorated(true);

		ClienteRMI cliente = new ClienteRMI();
	}
    
    public JPanel agregarPanelImagen() {
        panelImagen2 = new ImagePanel();

        return panelImagen2;
    }

    public void actionPerformed(ActionEvent evento) {
        String accion = evento.getActionCommand();

        if (accion.equalsIgnoreCase("Conectar")) {
			try {
                            
                            devolucion = interfaz.recibirMensaje();
                            System.out.println(devolucion);
                            imagenFinal = interfaz.transform();                            
                            //imagenFinal = (Image) image2;
                            panelImagen2.setImage(imagenFinal);     
                            panelImagen2.paintComponent(g);
			} catch (RemoteException e1) {
			}   
            extra.dispose();
            agregarComponentes();
            botonCapturar.setEnabled(true);
        }

        if (accion.equalsIgnoreCase("Capturar")) {
            try {
                            
                            devolucion = interfaz.recibirMensaje();
                            System.out.println(devolucion);
                            imagenFinal = interfaz.transform();
                            //imagenFinal = (Image) image2;
                            panelImagen2.setImage(imagenFinal); 
                            //panelImagen2.paintComponent(g);
			} catch (RemoteException e1) {
			}
        }

        if (accion.equalsIgnoreCase("Guardar")) {
            imagen = panelImagen2.createImage(320, 240);

            if (imagen != null) {
                int result = chooser.showOpenDialog(ventana);

                if (result == JFileChooser.APPROVE_OPTION) {
                    File archivo = chooser.getSelectedFile();
                    String nombre = archivo.getName().toLowerCase();

                    if (!nombre.endsWith(".jpg")) {
                        nombre = archivo.getAbsolutePath() + ".jpg";
                    }

                    try {
                        ImageIO.write((RenderedImage) imagen, "JPEG", new File(nombre));
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                        JOptionPane.showMessageDialog(ventana, "No se pudo guardar la imagen");
                    }
                }
            } else {
                JOptionPane.showMessageDialog(ventana, "Primero debe realizar una captura");
            }
        }

        if (accion.equalsIgnoreCase("Salir")) {
            hilo.interrupt();

            try {
                canal.close();
            } catch (IOException e) {
            }                                           
            System.exit(0);
        }
    }

	public void agregarComponentes() {
		chooser = new JFileChooser(".");

		ventana = new JFrame("Cliente de video: \"" + usuario + "\"");
		ventana.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		ventana.getContentPane().add(agregarPanelBotones(), BorderLayout.CENTER);
		ventana.getContentPane().add(agregarPanelImagen(), BorderLayout.SOUTH);

		ventana.pack();
		ventana.setVisible(true);

		hilo.start();
	}

	public JPanel agregarPanelBotones() {
		JPanel panelBotones = new JPanel(new BorderLayout());

		botonCapturar = new JButton("Capturar");
		botonCapturar.setPreferredSize(new Dimension(110,25));
		botonCapturar.addActionListener(this);
		botonGuardar = new JButton("Guardar");
		botonGuardar.setPreferredSize(new Dimension(110,25));
		botonGuardar.addActionListener(this);
		botonSalir = new JButton("Salir");
		botonSalir.setPreferredSize(new Dimension(110,25));
		botonSalir.addActionListener(this);

		panelBotones.add(botonCapturar, BorderLayout.WEST);
		panelBotones.add(botonGuardar, BorderLayout.CENTER);
		panelBotones.add(botonSalir, BorderLayout.EAST);

		return panelBotones;
	}

    public void mostrarConexion() {
        extra = new JFrame("Conexión al servidor");
        extra.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        JPanel panelConexion = new JPanel();
        JButton botonConectar = new JButton("Conectar");
        botonConectar.addActionListener(this);
        campoUsuario = new JTextField(15);
        campoClave = new JPasswordField(15);
     
        panelConexion.add(botonConectar);

        extra.getContentPane().add(panelConexion, BorderLayout.CENTER);
        extra.setSize(300, 300);
        extra.setVisible(true);
    }

    public void run() {
        panelImagen2.setImage(image2);
    }
}