package robot.mj;

import java.util.Map;

import com.robot.GameController;
import com.robot.Global;
import com.robot.MainServer;
import com.robot.data.Player;
import com.robot.data.Room;
import com.robot.player.state.PlayerWaitState;
import com.robot.room.state.RoomStartGameState;

/**
 * 长沙麻将机器人主服务器
 * 作为客户端连接game_mj_cs，处理AI逻辑和协议交互
 */
public class EXMainServer extends MainServer{
	
	// 机器人连接管理器
	private static RobotConnectionManager connectionManager;
	
	// 协议处理器
	private static ProtocolHandler protocolHandler;
	
	@Override
	public void onStart() {
		super.onStart();
		System.out.println("长沙麻将机器人服务已启动");

		// 初始化组件
		initializeComponents();
		
		// 注册到Redis服务
		registerToRedis();
		
		// 启动定时任务
		startScheduledTasks();
	}

	/**
	 * 初始化组件
	 */
	private void initializeComponents() {
		connectionManager = RobotConnectionManager.getInstance();
		
		// 创建默认AI处理器用于协议处理
		CSMJHandler defaultHandler = new CSMJHandler();
		protocolHandler = new ProtocolHandler(defaultHandler);
		
		System.out.println("长沙麻将机器人组件初始化完成");
	}
	
	/**
	 * 注册到Redis服务
	 */
	private void registerToRedis() {
		if (connectionManager != null) {
			connectionManager.registerToRedis();
			
			// 启动定期注册任务
			Global.scheduleAtFixedRate(() -> {
				connectionManager.updateServiceStatus();
			}, 30, 30, java.util.concurrent.TimeUnit.SECONDS);
		}
	}
	
	/**
	 * 启动定时任务
	 */
	private void startScheduledTasks() {
		// 定期更新服务状态
		Global.scheduleAtFixedRate(() -> {
			if (connectionManager != null) {
				connectionManager.updateServiceStatus();
			}
		}, 0, 60, java.util.concurrent.TimeUnit.SECONDS);
		
		System.out.println("长沙麻将机器人定时任务已启动");
	}
	
	/**
	 * 连接到游戏服务器
	 */
	public static boolean connectToGameServer(String host, int port, int playerId, int groupId, String roomId) {
		if (connectionManager != null) {
			return connectionManager.connectToGameServer(host, port, playerId, groupId, roomId);
		}
		return false;
	}
	
	/**
	 * 获取连接管理器
	 */
	public static RobotConnectionManager getConnectionManager() {
		return connectionManager;
	}
	
	/**
	 * 获取协议处理器
	 */
	public static ProtocolHandler getProtocolHandler() {
		return protocolHandler;
	}

	@Override
	public Room newRoom(String roomid, Map<String, String> redis_room_map) {
		// 机器人服务不需要创建房间，直接返回null或基础房间
		return new EXRoom(roomid, redis_room_map);
	}


	@Override
	public Player newPlayer(int playerid, Room room, String session_id) {
		// 机器人服务不需要创建玩家，直接返回基础玩家
		return new EXPlayer(playerid, room, session_id);
	}


	@Override
	protected GameController newController() {
		// 返回基础控制器
		return new EXGameController();
	}
}