package com.csc.test;

import java.io.IOException;
import java.net.URISyntaxException;
import java.nio.ByteBuffer;
import java.util.concurrent.atomic.AtomicInteger;

import javax.websocket.DeploymentException;
import javax.websocket.EndpointConfig;
import javax.websocket.MessageHandler;
import javax.websocket.PongMessage;
import javax.websocket.Session;

public class TestPingEndpoint extends EndpointBase{
	private String TAGNAME = "";
	private Session session;
	private static AtomicInteger counter = new AtomicInteger();
	public static void main(String[] arg) throws DeploymentException, IOException, URISyntaxException{
		
		for(int i = 0; i<500; i++){
			Thread t = new Thread(new Runnable() {
				@Override
				public void run() {
					try {
						new TestPingEndpoint().process();
					} catch (DeploymentException e) {
						e.printStackTrace();
					} catch (IOException e) {
						e.printStackTrace();
					} catch (URISyntaxException e) {
						e.printStackTrace();
					}
				}
			});
			t.start();
		}
	}
	public TestPingEndpoint() throws DeploymentException, IOException, URISyntaxException{
		this.TAGNAME = Thread.currentThread().getName();
		ClientEndpointFactory.getInstance().connect(this);
		
	}
	public void process() throws DeploymentException, IOException, URISyntaxException{
		while(true){
			try{
//				println("ping");
				session.getBasicRemote().sendPing(ByteBuffer.wrap(String.valueOf(System.currentTimeMillis()).getBytes()));
				Thread.sleep(3000);
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	}
	
	@Override
	public void onOpen(Session session, EndpointConfig config) {
		println("session.open");
		this.session = session;
		session.addMessageHandler(new MessageHandler.Whole<PongMessage>() {
			@Override
			public void onMessage(PongMessage message) {
				try{
					println("pong : " + counter.incrementAndGet());
					
					String s = new String(message.getApplicationData().array());
					System.out.println("Latency : "+(System.currentTimeMillis()-Long.valueOf(s)));
				}catch(Exception e){
					e.printStackTrace();
				}
			}
		});
	}
	
	public void println(String message){
		System.out.println(TAGNAME + " : " + message);
	}

	@Override
	public String getURL() {
		return String.format(WebsocketConfig.URIPATH_PATTERN, this.TAGNAME , System.currentTimeMillis());
	}
}