package game;

import java.util.ArrayList;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import account.Account;
import framework.model3D.CollisionResult;
import framework.model3D.Object3D;
import framework.model3D.Position3D;
import framework.physics.PhysicsUtility;
import framework.physics.Velocity3D;
import room.Room;

public class GameManager implements IGameElement,Runnable {
	
	//シングルトンパターン
	private static GameManager theInstance;
	private GameManager() {
	}
	public static GameManager getInstance() {
		if (theInstance == null) {
			theInstance = new GameManager();
			System.out.println("GameManager theInstance.start() 前");
			theInstance.start();	//start()起動
		}
		return theInstance;
	}
	
	public static final int DELAY_TIME = 100;	//1000ms = 1s 
	
	int countTime = 0;
	
	//GameをgameListで持つ
	private ArrayList<Game> gameList = new ArrayList<Game>();
	
	//タイマー処理部分開始
	public void start() {
		ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
		scheduler.scheduleAtFixedRate(this, 0, DELAY_TIME, TimeUnit.MILLISECONDS);
	}
	
	//あたり判定・レーザ光線や爆弾の処理　run()
	@Override
	public void run() {

System.out.println("scheduler : " + countTime);
		countTime++;
		
		//gameがある時に
		if(gameList.size() > 0) {
			Game game;
			for(int j=0; j<gameList.size(); j++) {
				game = getGame(j);
				//removeFlagがtrueの時にgameを消去
				if(game.getRemoveFlag() == true) {
					game.getRoom().removeGame();
					removeGame(game);
				//Flagがfalseならupdate
				} else {
					getGame(j).update(countTime);;
				}
			}
		}

	}
	
	
	//ゲームを増やす
	public void addGame(Game game) {
		game.placeStage();
		gameList.add(game);
	}

	//ゲームを減らす
	public void removeGame(Game game) {
		gameList.remove(game);
	}

	//ゲームの個数をカウント
	public int getGameCount() {
		return gameList.size();
	}
	
	//n番目のゲーム情報を取得
	public Game getGame(int n){
		return gameList.get(n);
	}
	
	//重複して在籍しているgameが無いか探す
	public void searchGameSid(Room room) {

System.out.println("　　　　　　　　　　　　　　　　　　　　searchGameSid：in");

		for(int i=0; i<Room.MAX_MEMBERS; i++) {
			String sId = room.getMember(i).getsId();
		

System.out.println("　　　　　　　　　　　　　　　　　　　　searchGameSid：for文 " + i + " 回目");
			
			//++++++++++++++++++++++++++++++++++visitor++++++++++++++++++++++++++++++++++
	
			PlayerSearchVisitor visitor = new PlayerSearchVisitor(sId);
			accept(visitor);
			
			Team team = visitor.getTeam();					//所属チームの特定

System.out.println("　　　　　　　　　　　　　　　　　　　　searchGameSid：Team ok");

			Account account = visitor.getPlayerAccount();	//個人を特定
			

System.out.println("　　　　　　　　　　　　　　　　　　　　searchGameSid：Account ok");
			
			//++++++++++++++++++++++++++++++++++visitor++++++++++++++++++++++++++++++++++
			
			//該当した場合、そのアカウントをゲームから削除する
			if(account != null) {
				team.removeMember(account);

System.out.println("　　　　　　　　　　　　　　　　　　　　searchGameSid：ifの中のremoveMember");

		}
		}
	}
	
	//visitorによる処理を受け入れる
	public boolean accept(IGameElementVisitor v) {
		if (!v.visit(this)) { return false; }
		for (Game game: gameList) {
			if (!game.accept(v)) return false;
		}
		return true;
	}
	
}
