package com.softgraf.chat.cliente;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.LinkedHashSet;

import javax.swing.JOptionPane;

import com.softgraf.chat.Mensagem;


// Sincroniza os usuários online com o servidor
public class AtualizaClientesOnline extends Thread {

	private ObjectInputStream entrada;
	private ObjectOutputStream saida;
	private String idCliente;
	private Mensagem msgEntrada, msgSaida;
	private LinkedHashSet<String> listaUsuarios;
	private final int tempo; // tempo em milisegundos para a thread dormir

	// construtor
	public AtualizaClientesOnline(ObjectInputStream entrada, ObjectOutputStream saida, String idCliente) {
		this.entrada = entrada;
		this.saida = saida;
		this.idCliente = idCliente;
		this.tempo = 30000;  // dorme 30 segundos
	}

	@Override
	public void run() {

		while (true) {

			try {

				// envia solicitaçăo da lista de usuários online para o servidor
				msgSaida = new Mensagem(idCliente, Mensagem.LISTAR_USUARIOS, "usuarios online");
				saida.writeObject(msgSaida);
				saida.flush();
				
				// receba a lista de usuários online do servidor
				msgEntrada = (Mensagem) entrada.readObject();
				listaUsuarios = msgEntrada.getUsuariosOnline();
				listaUsuarios.remove(idCliente);  // remove o próprio cliente da lista
				ChatCliente.setUsuariosOnline(listaUsuarios);
				ChatCliente.mostraUsuariosOnline();
				ChatCliente.atualizaComboUsuarios();
				
				// dorme 10 segundos
				Thread.sleep(tempo);
				
				if (Thread.interrupted())        // thread acordada
					break;

			} catch (InterruptedException e) {   // thread dormindo
				break;
				
			} catch (ClassNotFoundException e) {
				JOptionPane.showMessageDialog(null, e.getMessage(),	"AtualizaClientesOnline Erro Fatal 1", JOptionPane.ERROR_MESSAGE);
				break;

			} catch (IOException e) {
				JOptionPane.showMessageDialog(null, e.getMessage(),	"AtualizaClientesOnline Erro Fatal 2", JOptionPane.ERROR_MESSAGE);
				break;

			} 

		} // while

	}

}