package com.jzy.game.gate.server.handler;

import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.jzy.game.engine.mina.config.MinaServerConfig;
import com.jzy.game.engine.mina.handler.ClientProtocolHandler;
import com.jzy.game.engine.script.ScriptManager;
import com.jzy.game.engine.server.Service;
import com.jzy.game.engine.util.MsgUtil;
import com.jzy.game.gate.script.IUserScript;
import com.jzy.game.gate.struct.UserSession;
import com.jzy.game.model.constant.Config;
import com.jzy.game.model.constant.Reason;

/**
 * udp消息处理器
 * @author JiangZhiYong
 * @QQ 359135103
 * 2017年9月1日 下午2:06:36
 */
public class GateUdpUserServerHandler extends ClientProtocolHandler{
	private static final Logger LOGGER = LoggerFactory.getLogger(GateUdpUserServerHandler.class);
	
	public GateUdpUserServerHandler() {
		super(8);
	}
	
	public GateUdpUserServerHandler(Service<MinaServerConfig> service){
		this();
		this.service=service;
	}

	/**
	 * 消息转发到大厅服或游戏服务器
	 * 
	 * @param bytes
	 *            前8字节分别为消息ID、protobuf长度
	 */
	@Override
	protected void forward(IoSession session, int msgID, byte[] bytes) {
		// 转发到大厅服
		if (msgID < Config.HALL_MAX_MID) {
			forwardToHall(session, msgID, bytes);
			return;
		}
		// 转发到游戏服
		Object attribute = session.getAttribute(Config.USER_SESSION);
		if (attribute != null) {
			UserSession userSession = (UserSession) attribute;
			if (userSession.getRoleId() > 0) {
				if (userSession.sendToGame(MsgUtil.clientToGame(msgID, bytes))) {
					return;
				} else {
					LOGGER.warn("角色[{}]没有连接游戏服务器,消息{}发送失败", userSession.getRoleId(),msgID);
					return;
				}
			}

		}
		LOGGER.warn("{}消息[{}]未找到玩家", MsgUtil.getIp(session), msgID);
	}

	/**
	 * 消息转发到大厅服务器
	 * 
	 * @author JiangZhiYong
	 * @QQ 359135103 2017年7月21日 上午10:14:44
	 * @param session
	 * @param msgID
	 * @param bytes
	 */
	private void forwardToHall(IoSession session, int msgID, byte[] bytes) {
		Object attribute = session.getAttribute(Config.USER_SESSION);
		if (attribute != null) {
			UserSession userSession = (UserSession) attribute;
			if (userSession.getRoleId() > 0) {
				if (!userSession.sendToHall(MsgUtil.clientToGame(msgID, bytes))) {
					LOGGER.warn("角色[{}]没有连接大厅服务器", userSession.getRoleId());
					return;
				}

			}
		}
		LOGGER.warn("[{}]消息未找到对应的处理方式", msgID);
	}

	@Override
	public Service<MinaServerConfig> getService() {
		return service;
	}

	@Override
	public void sessionOpened(IoSession session) {
		super.sessionOpened(session);
//		UserSession userSession = new UserSession(session);
//		session.setAttribute(Config.USER_SESSION, userSession);
		//TODO
	}

	@Override
	public void sessionClosed(IoSession session) {
		super.sessionClosed(session);
//		ScriptManager.getInstance().getBaseScriptEntry().executeScripts(IUserScript.class,
//				script -> script.quit(session, Reason.SessionClosed));
		session.closeNow();	//TODO ?
	}

	@Override
	public void sessionIdle(IoSession session, IdleStatus idleStatus) {
		super.sessionIdle(session, idleStatus);
//		ScriptManager.getInstance().getBaseScriptEntry().executeScripts(IUserScript.class,
//				script -> script.quit(session, Reason.SessionIdle));
		session.closeNow();	//TODO ?
	}
	
}