package servlet;

import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import account.Account;
import account.AccountManager;
import framework.model3D.Position3D;
import game.Game;
import game.Stage;
import room.Room;
import room.RoomManager;

public class RoomServlet extends  HttpServlet {
	
	public static final int TEAM_RED = 0;
	public static final int TEAM_BLUE = 1;
	
	// 受け取る部分							↓reqで受け取る　　　　　　　　　　　↓respで返す
	public void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, java.io.IOException {

		// RoomManagerを使うために宣言しておく                      　↓シングルトンパターンを利用しているため
		RoomManager roommgr = RoomManager.getInstance();
		AccountManager accountmgr = AccountManager.getInstance();

		// 返す文字の宣言 ↓返すためresp
		PrintWriter printwriter = resp.getWriter();
		
		/*******************************
		 *	パラメータを受け取る req
		 *******************************/
		String state =  req.getParameter("state");
		String sId = req.getSession().getId();		
		String clSelfWait = req.getParameter("wait");
					
		/*******************************
		 *	sIdからアカウントを取得
		 *******************************/
		Account svSelf = accountmgr.getAccount(sId);
		
		//部屋を取得
		Room myRoom = svSelf.getRoom();
		
		//最終通信時間を更新
		svSelf.setFinalConnectTime();
		
		/*******************************
		 *	enter / update　の処理
		 *******************************/
		if((state.equals("enter")) || (state.equals("update"))) {

if(state.equals("enter")) {
  System.out.println("<state> : " + state);
}
			printwriter.println("<room>");
			
			//waitが異なる時、更新する
			if(!clSelfWait.equals(svSelf.getWait())) {
				svSelf.setWait(clSelfWait);
			}
			
			//Room内の人の最終接続時間確認
			myRoom.removeNotConnectMember();

			//Room内のアカウント情報を取得
			Account account = new Account();
			for(int i=0; i<myRoom.getMemberCount(); i++) {
				account = myRoom.getMember(i);
				
				printwriter.println("<player sid=\"" + account.getsId() + "\" name = \"" + account.getName() + "\" wait = \"" + account.getWait() +"\">");
				printwriter.println("</player>");

if(state.equals("enter")) {
  System.out.println("player" + i + " sId : " + account.getsId());
  System.out.println("             wait : " + account.getWait());
}
			}
			
			printwriter.println("</room>");
		}

		/*******************************
		 *	exit　の処理
		 *******************************/
		else if(state.equals("exit")) {
			
			//部屋から自分を削除
			myRoom.removeMember(svSelf);
			
			//部屋の人数が0になった場合部屋を削除
			if(myRoom.getMemberCount() == 0) {
				roommgr.removeRoom(myRoom);
			}
			printwriter.println("<result id=\"ok\">");
			printwriter.println("</result>");

		}
		
		/*******************************
		 *	divide　の処理
		 *******************************/
		else if(state.equals("divide")){ 

System.out.println("state : divide");

			if(myRoom.getDivideFlag() == 0) {
				myRoom.setDivideFlag(1);
				myRoom.divideTeam();
				myRoom.setDivideFlag(2);
			}

			//他のクライアントがチーム分け処理中の場合、ngを送信する
			if(myRoom.getDivideFlag() != 2) {
				printwriter.println("<divide id=\"ng\">");
				printwriter.println("</divide>");
			}
			
			//チーム分け完了していた場合　チーム分け情報転送
			if(myRoom.getDivideFlag() == 2) {
				Game game = new Game();
				game = myRoom.getGame();

				int myTeam = 0;
				int myNum = 0;

				printwriter.println("<team>");

				//赤チームの情報を転送
				printwriter.println("<teamRed>");
				
System.out.println("+++++++ teamRed +++++++");
				for(int i=0; i<Room.MAX_MEMBERS/2; i++){
					
					Account ac = new Account();
					ac = game.getTeamMember(i, TEAM_RED);
					String  getsId = ac.getsId();
					String  getname = ac.getName();
	
					printwriter.println("<player sid=\""+getsId+"\" name=\""+ getname +"\">");

					printwriter.println("</player>");

					//自分が存在するとき　myTeam=0,myNum=0~2
					if(getsId.equals(sId)){
						myTeam = 0;
						myNum = i;						
					}

				}

				printwriter.println("</teamRed>");

				//青チームの情報を転送
				printwriter.println("<teamBlue>");
				
System.out.println("+++++++ teamBlue +++++++");
				for(int i=0; i<Room.MAX_MEMBERS/2; i++){

					Account ac = new Account();
					ac = game.getTeamMember(i, TEAM_BLUE);
					String getsId = ac.getsId();
					String getname = ac.getName();
				
					printwriter.println("<player sid=\""+getsId+"\" name=\""+ getname +"\">");

					printwriter.println("</player>");
					
					//自分が存在するとき　myTeam=1,myNum=0~2
					if(getsId.equals(sId)){
						myTeam = 1;
						myNum = i;												
					}

				}
				printwriter.println("</teamBlue>");

				//自分の座標を設定
				Stage stage = new Stage();
				Position3D p = stage.getSpawnPoint(myTeam, myNum);
System.out.println("point x=" + p.getX() + " y=" + p.getY() + " z=" + p.getZ());
				printwriter.println("<point x=\"" + p.getX() + "\" y=\"" + p.getY() + "\" z=\"" + p.getZ() + "\"></point>");
				printwriter.println("</team>");

				}
			}
		}
	
	// 返す部分(テスト用)
	public void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, java.io.IOException {

		// 共有させることによってこちらだけで実効できる
		doPost(req, resp);

	}
}