var IntrudersManager = Class.create();

IntrudersManager.URL_GET_INTRUDERS = '/4duk/deliverIntruders.action';
IntrudersManager.URL_GET_SIGHTS_COUNTS = '/4duk/getIntrudersSights.action';
IntrudersManager.URL_INCREASE_INTRUDER_SIGHT = '/4duk/increaseIntruderSight.action';
IntrudersManager.ID_PARAM_INCREASE_INTRUDER = 'intruderId';


IntrudersManager.prototype = {
 
 initialize: function(animator, windowDimensions){
  this.animator = animator;
  this.windowDimensions = windowDimensions;
  
  this.movementParser = new MovementParser(animator.getFrameMs(), windowDimensions);
  this.intrudersParser = new IntrudersParser(animator.getFrameMs());
  
  this.intruderSights = new Hash();
  this.didCountSightsComplete = false;
  this._requestIntruderSights();
  
  this.isAnIntruderVisible = false;
  this.pausedIntrudersStrategies = new Array();
 },
 
 startIntruding: function(){
  
  var intruders = this.intrudersParser.getIntruders();
  if(!this.intrudersParser.getIntruders()){
   this._requestAllIntruders();
   return;
  }
  
  // before doing intrusions check that response (wheter successful or not) 
  // for gettin count of seen intruders is processed
  if(!this.didCountSightsComplete){
    setTimeout(this.startIntruding.bind(this), 100);
    return;
  }
  
  for(var i = 0; i < intruders.length; i++){
	var intruder = intruders[i];
	this._doIntrusion(intruder);
  }
 },
 
 getAmountSights: function(intruderId){
  var sights = this.intruderSights[intruderId];
  if(!sights) return 0;
  return sights;
 },
 
 _wantsToIntrudeNow: function(strategy, rawIntruderStartPosition){
  if(this.isAnIntruderVisible){
    strategy.pause();
    strategy.rawStartPosition = rawIntruderStartPosition;
    this.pausedIntrudersStrategies.push(strategy);
  } 
 },
 
 _restartPausedIntruders: function(intruder){
   if(this.pausedIntrudersStrategies.length <= 0){
     return;
   }
   var nextIntrudersStrategy = this.pausedIntrudersStrategies.shift();
   if(nextIntrudersStrategy){
     if(!this.isAnIntruderVisible){
       var rawStartPos = nextIntrudersStrategy.rawStartPosition;
       if(rawStartPos != null){
         var intruderStartPosition = this.movementParser.parsePoint(rawStartPos);
         intruder.setPosition(intruderStartPosition);
       }
       nextIntrudersStrategy.resume();
       this.isAnIntruderVisible = true;
     } else {
       this.pausedIntrudersStrategies.unshift(nextIntrudersStrategy);
     }
   }
 },
 
 _doIntrusion: function(intruder){
  
  var id = intruder.id.substring(IntrudersParser.INTRUDER_ID_PREFIX.length, intruder.id.length);
  this._sendIntruderShown(id);

  var allMovements = new Array();
  
  var pauseRange = this.intrudersParser.getIntruderPause(id);
  var strategyForDelay = this.movementParser.parsePause(pauseRange, intruder);
  
  var amountSights = this.getAmountSights(id);
  if(amountSights > 0){
	strategyForDelay.setSteps(strategyForDelay.getSteps() * (amountSights + 1));
  }
  strategyForDelay.onEnd = function(){
	var rawPosition = this.intrudersParser.getIntruderStartPosition(id);
	var pos = this.movementParser.parsePoint(rawPosition);
	intruder.setPosition(pos);
	this._wantsToIntrudeNow(intrudersMovements, rawPosition);
	this.isAnIntruderVisible = true;
  }.bind(this);
  
  allMovements.push(strategyForDelay);
  
  
  
  var movements = this.intrudersParser.getIntruderMovement(id);
  for(var i = 0; i < movements.length; i++){
  	var strategy = movements[i];
	if(!strategy.isParsed){
	 strategy = this.movementParser.parseMovement(intruder,strategy);
	}
	allMovements.push(strategy);
  }

  var nextIntrusionStrategy = new StrategyPause(intruder, 2, 
	null, 
	function(){
	 this.isAnIntruderVisible = false;
	 this._restartPausedIntruders(intruder);
	 this._doIntrusion(intruder);
	}.bind(this)
  );
  allMovements.push(nextIntrusionStrategy);
  
  var intrudersMovements = new StrategyChain(allMovements);
  
  intruder.setMovementStrategy(intrudersMovements);
  this.animator.registerStrategyAutoUnregister(intrudersMovements);
 },
 
 _requestIntruderSights: function(){
  new Ajax.Request(IntrudersManager.URL_GET_SIGHTS_COUNTS,  {
	method:'get',
	onComplete: function(transport){ this.didCountSightsComplete = true; }.bind(this),
	onSuccess: function(transport){
	 var jsonIntruderSights = eval("(" +transport.responseText+ ")");
	 Object.extend(this.intruderSights, jsonIntruderSights);
	}.bind(this)
  });
 },
 _requestAllIntruders: function(){
 
  new Ajax.Request(IntrudersManager.URL_GET_INTRUDERS,  {
	method:'get',
	onSuccess: function(transport){
	 var jsonIntruders = eval("(" +transport.responseText+ ")");
	 this.intrudersParser.parseAllIntrudersResponse(jsonIntruders);
	 this.startIntruding();
	}.bind(this)
  });
 },
 _sendIntruderShown: function(intruderId){
	if(!this.intruderSights[intruderId]){
	  this.intruderSights[intruderId] = 1;
	} else {
	  this.intruderSights[intruderId]++;
	}
  new Ajax.Request(IntrudersManager.URL_INCREASE_INTRUDER_SIGHT + "?" + IntrudersManager.ID_PARAM_INCREASE_INTRUDER + "=" + intruderId ,  {
	method:'get'
  });
 }
}
