package com.isartdigital.game;


import com.isartdigital.game.sprites.Arrow;
import com.isartdigital.game.sprites.BackgroundGame;
import com.isartdigital.game.sprites.CheckItem;
import com.isartdigital.game.sprites.Foule;
import com.isartdigital.game.sprites.Player;
import com.isartdigital.game.sprites.Score;
import com.isartdigital.game.sprites.Template;
import com.isartdigital.game.sprites.TimerHUD;
import com.isartdigital.ui.CheatPanel;
import com.isartdigital.ui.UIManager;
import com.isartdigital.utils.Config;
import com.isartdigital.utils.events.EventType;
import com.isartdigital.utils.game.CollisionManager;
import com.isartdigital.utils.sounds.SoundManager;
import com.isartdigital.utils.system.DeviceCapabilities;
import com.isartdigital.utils.game.GameStage;
import pixi.core.display.Container;
import pixi.core.sprites.Sprite;
import pixi.core.textures.Texture;
import pixi.extras.MovieClip;
import pixi.interaction.EventTarget;
import pixi.interaction.InteractionManager;

/**
 * Manager (Singleton) en charge de gérer le déroulement d'une partie
 * @author Mathieu ANTHOINE
 */
class GameManager
{
	
	/**
	 * instance unique de la classe GameManager
	 */
	private static var instance: GameManager;
	
	public var background:Sprite;
	public static inline var MAXLAYER: Int = 2;
	public static var levelLayer:UInt = 0;
	public var pause:Bool = false;
	public static var layer:Int = 0;
	public var currentSound:String = "MainloopCouche1";
	
	/**
	 * Retourne l'instance unique de la classe, et la crée si elle n'existait pas au préalable
	 * @return instance unique
	 */
	public static function getInstance (): GameManager {
		if (instance == null) instance = new GameManager();
		return instance;
	}
	
	private function new() {
		
	}
	
	public function start (): Void {
		
		// demande au Manager d'interface de se mettre en mode "jeu"
		UIManager.getInstance().startGame();	
		
		// début de l'initialisation du jeu
		//GameStage.getInstance().getGameContainer().addChild(Template.getInstance());
		//Template.getInstance().start();	
		//CheatPanel.getInstance().ingame();
		background = new Sprite(Texture.fromImage(Config.assetsPath + "background_decor.png"));
		GameStage.getInstance().getDecorContainer().addChild(background);
		
		GameStage.getInstance().getDecorContainer().addChild(BackgroundGame.getInstance());
		var lFoule:Foule = new Foule();
		GameStage.getInstance().getDecorContainer().addChild(lFoule);
		lFoule.init();
		MoveManager.getInstance().init();
		//Ajoute un nouveau controller
		Controller.getInstance();
		
		Player.getInstance().init();
		GameStage.getInstance().getGameContainer().addChild(Player.getInstance());
		LevelManager.getInstance().apparitionTimer();
		createHUD();
		LevelManager.getInstance().setTimer();
		
		// enregistre le GameManager en tant qu'écouteur de la gameloop principale
		Main.getInstance().on(EventType.GAME_LOOP, gameLoop);
		
		//Faire les 3 sons jouer en meme temps :D
		SoundManager.getSound("MainloopCouche1").play();
		SoundManager.getSound("MainloopCouche2").play().volume(0);
		SoundManager.getSound("MainloopCouche3").play().volume(0);
	}
	
	/**
	 * boucle de jeu (répétée à la cadence du jeu en fps)
	 */
	public function gameLoop (pEvent:EventTarget): Void {
		
		if (pause) return;
		
		// le renderer possède une propriété plugins qui contient une propriété interaction de type InteractionManager
		// les instances d'InteractionManager fournissent un certain nombre d'informations comme les coordonnées globales de la souris
		//if (DeviceCapabilities.system==DeviceCapabilities.SYSTEM_DESKTOP) trace (CollisionManager.hitTestPoint(Template.getInstance().hitBox, cast(Main.getInstance().renderer.plugins.interaction,InteractionManager).mouse.global));
		MoveManager.doAction();
		Player.getInstance().doAction();
		Score.getInstance().doAction();
		BackgroundGame.getInstance().doAction();
		initAction(Arrow.arrowsArray);
		Foule.doActionManager();
		initAction(Foule.arrayFoule);
		initAction(CheckItem.arrayCheckItem);
		Controller.getInstance().reset();
	}
	
	private function initAction (pArray : Array<Dynamic>) {
		
		var i:Int = pArray.length - 1;
		while (i >= 0) {
			pArray[i].doAction();
			i--;
		}
	}
	
	private function createHUD():Void {
		GameStage.getInstance().addChild(Score.getInstance());
		GameStage.getInstance().addChild(TimerHUD.getInstance());
		
	}
	
	/**
	 * détruit l'instance unique et met sa référence interne à null
	 */
	public function destroy (): Void {
		Main.getInstance().off(EventType.GAME_LOOP,gameLoop);
		instance = null;
	}
}