// Author: Juan Carlos De Abreu (jcabreur@gmail.com)

#ifndef ACTOR_H__
#define ACTOR_H__

#include "global.h"
#include "math/vector.h"
#include "base/singleton.h"
#include "vector"
#include "ai.h"
#include "Scene/scene_inl.h"

BEGIN_TEG_NAMESPACE();

namespace ai {

// TODO: definir unas clases especialies para cada personaje [personal, niNo, ladron]
// cada una de estas personas va a implementar un metodo que sea algo como next move..

// TODO: definir unos puntos, los cuales son objetivos comunes entre las personas que caminan.

class IActor {
 public:
  IActor();
  IActor(math::Vec2<int> position);
  virtual ~IActor();

  virtual void nextMove() = 0;

  int idleCount;
  bool moving;
  std::vector< math::Vec2<int> > path;
  math::Vec2<int> destiny;
  math::Vec2<int> position;
  int dir;

 private:
  //DISALLOW_COPY_AND_ASSIGN(IActor);
};

class Worker : public IActor {
 public:
  Worker();
  Worker(math::Vec2<int> position, int type);
  ~Worker();

  virtual void nextMove();
  void update(Tablero& t);
  void makeMove(Tablero& t);

	bool see;

  enum {POLICE = 0, DOCTOR, SERVICE};

private:
  static const int kMaxDeep = 60;
  int type;	// tipo de trabajador [doctor, policia, limpieza, etc...]
 // DISALLOW_COPY_AND_ASSIGN(Worker);
};


class Children : public IActor {
 public:
  Children();
  ~Children();

  bool withThief;
  void update(Tablero& t);
  virtual void nextMove();
  

 private:
  static const int kMaxDeep = 20;
  DISALLOW_COPY_AND_ASSIGN(Children);
};

class Thief : public IActor {
 public:
  Thief();
  ~Thief();

  virtual void nextMove();

 private:
  DISALLOW_COPY_AND_ASSIGN(Thief);
};

class ActorManagement : public Singleton<ActorManagement> {
 public:
  ActorManagement();
  ~ActorManagement();

  void UpdateMoves(Tablero& t);
  void UpdateChild(Tablero& t);

  // Este metodo debe ser invocado solo una vez, al momento de la inicializacion de la clase...
  void InitializeWorkers(Tablero& t);

  void release() {
	  workerTranslate.clear();
	  workerRotate.clear();
	  childTranslate = NULL;
	  childRotate = NULL;
  }


  bool capture;
  bool finish; 
  Thief theThief;
  Children theChild;
  std::vector<Worker> workers;
  std::vector<SmartPointer<TranslateNode> > workerTranslate;
  std::vector<SmartPointer<RotateNode> > workerRotate;

  SmartPointer<TranslateNode> childTranslate;
  SmartPointer<RotateNode> childRotate;

 private:
  DISALLOW_COPY_AND_ASSIGN(ActorManagement);
};



};

END_TEG_NAMESPACE();

#endif  // ACTOR_H__
