package com.csc.library.factory;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.csc.library.properties.CscSession;
import com.csc.library.properties.ResponsePools;
import com.csc.library.request.RequestWebsocket;
import com.csc.library.response.ResponseData;
import com.csc.library.response.ResponsePropertiesImpl;
import com.csc.library.response.ResponseStatus;
import com.csc.library.response.ResponseWebsocket;
import com.csc.library.utilities.MyLog;

public class ResponseFactory {
	private static ResponseFactory instance;
	//private Map<CscSession,List<ResponseWebsocket>> response = new HashMap<CscSession ,List<ResponseWebsocket>>();
	private ResponsePools<ResponsePropertiesImpl> response;
	private PropertiesFactory propInstance;
	
	private ResponseFactory(){
	}
	
	public static ResponseFactory getInstance(){
		if(instance == null){
			instance = new ResponseFactory();
			instance.propInstance = PropertiesFactory.getInstance();
			instance.response = ResponsePools.getInstance();
		}
		return instance;
	}
	
	public void sendResponseWebsocket(CscSession session , RequestWebsocket req ,ResponseStatus state, String message){
		ResponsePropertiesImpl res = this.getResponseWebsocket(session);
		res.setRequestWebsocket(req);
		res.setMessage(message);
		res.setResponseStatus(state);
		this.sendResponse(session, res);
	}
	
	public void sendResponseWebsocket(CscSession session , RequestWebsocket req ,ResponseData resData, String message){
		ResponsePropertiesImpl res = this.getResponseWebsocket(session);
		res.setRequestWebsocket(req);
		res.setMessage(message);
		res.setResponseStatus(ResponseStatus.Complete);
		res.setResponseData(resData);
		this.sendResponse(session, res);
	}
	
	protected ResponsePropertiesImpl getResponseWebsocket(CscSession session){
		ResponsePropertiesImpl res = null;
		try{
			res = this.response.pop();
			if(res == null){
				res = new ResponsePropertiesImpl(); 
			}
		}catch(Exception e){
			MyLog.error(this , session.getUProfile() , e);
		}
		return res;
	}
	
	protected void sendResponse(CscSession session , ResponseWebsocket res){
		session.sendMessage(propInstance.toJson(res));
		res.clear();
		this.response.push((ResponsePropertiesImpl)res);
	}
}