#ifndef SCENEOBJECT_H
#define SCENEOBJECT_H
#include "scenemanager.h"
#include "video_int.h"
#include "config_classes.h"
#include "config.h"
#include <iostream>
#include "event.h"
#include "slot.h"

class Video_Surface;
/**
Базовый класс, для всех объектов которые могут находить на сцене.

	@author Messenger of death aka Denis A. Birukov <messengerofdeath@gmail.com>
 */
class SceneObject
{
	public:
		/**
		* Рисование объекта в точке где ему положено находиться. Координаты храняться в объекте
		* @author Messenger of death aka Denis A. Birukov <messengerofdeath@gmail.com>
		* @date 31.05.2007
		         */
		virtual void draw() = 0;

		/**
		 * Загрузка данных объекта
		 * @param storage_name имя хранилища из которого загружать данные
		 * @param storage_prefix префикс по которому находятся данные
		 * @param scene_name имя сцены в которую загружается объект
		 * @param object_name имя загружаемого объекта
		 * @return true при успехе
		 * @author Messenger of death aka Denis A. Birukov <messengerofdeath@gmail.com>
		 * @date 31.05.2007
		         */
		virtual bool load ( std::string storage_name, std::string storage_prefix, std::string scene_name, std::string object_name );

		/**
		 * Получение активной зоны объекта. При событии MOUSE_PRESS попадающим в эту зону объект будет считаться активным
		 * @param rect указатель на структуру для созранения координат
		 * @author Denis A. Birukov aka Messenger of death
		 * @date 11.01.2008
		         */
		virtual void _get_active_area_rect ( VideoRect *rect );
		/**
		 * Получение имени объекта
		 * @return имя объекта
		 * @author Denis A. Birukov aka Messenger of death
		 * @date 14.03.2008
		 */
		virtual std::string _get_name() { return _object_name_;}

		/**
		 * Вызывает в случае, если объект стал активным
		 * @author Denis A. Birukov aka Messenger of death
		 * @date 11.01.2008
		 */
		DECLARE_SLOT ( SceneObject, _on_activate ) {return true;};

		/**
		 * Вызывает в случае, если объект стал неактивным
		 * @author Denis A. Birukov aka Messenger of death
		 * @date 11.01.2008
		         */
		DECLARE_SLOT ( SceneObject, _on_deactivate ) {return true;};

		/**
		 * Вызывается для активного объекта, если была нажата любая кнопка на клавиатуре
		 * @author Denis A. Birukov aka Messenger of death
		 * @date 11.01.2008
		         */
		DECLARE_SLOT ( SceneObject, _on_key_press ) {return true;};

		/**
		 * Вызывается для активного объекта, если была отжата любая кнопка на клавиатуре
		 * @author Denis A. Birukov aka Messenger of death
		 * @date 11.01.2008
		 */
		DECLARE_SLOT ( SceneObject, _on_key_release ) {return true;};

		/**
		 * Вызывается для активного объекта, если был введен печатный символ.
		 * @author Denis A. Birukov aka Messenger of death
		 * @date 11.01.2008
		 */
		DECLARE_SLOT ( SceneObject, _on_character ) {return true;};

		/**
		 * Вызывается для активного объекта, если была отпущена ранее нажатая кнопка мыши
		 * @author Denis A. Birukov aka Messenger of death
		 * @date 11.01.2008
		 */
		DECLARE_SLOT ( SceneObject, _on_mouse_release ) {return true;};

		/**
		 * Вызывается в случае переинициализации сцены. Подключается по умолчанию.
		 * @author Denis A. Birukov aka Messenger of death
		 * @date 06.07.2009
		 */
		DECLARE_SLOT ( SceneObject, _on_scene_reinit ) {return false;};

		void set_video_name ( std::string video_name ) {_video_name_ = video_name;}
		SceneObject( ) :
				INIT_SLOT ( SceneObject, this, _on_activate ),
				INIT_SLOT ( SceneObject, this, _on_deactivate ),
				INIT_SLOT ( SceneObject, this, _on_key_press ),
				INIT_SLOT ( SceneObject, this, _on_key_release ),
				INIT_SLOT ( SceneObject, this, _on_character ),
				INIT_SLOT ( SceneObject, this, _on_mouse_release ),
				INIT_SLOT ( SceneObject, this, _on_scene_reinit ),
				_video_name_ ( "" ),
				_scene_name_ ( "" ),
				_object_name_ ( "" ),
				_x_ ( 0.0 ),
				_y_ ( 0.0 )
		{_signal_connections_.clear();};

		virtual ~SceneObject() {};
		std::string _get_error() {return _error_;}
		void _set_error ( std::string error ) {_error_ = error;}
		void register_slots();
		void unregister_slots();
		/**
		 * Вызывается для подключения слотов объекта к сигналу
		 * @author Denis A. Birukov aka Messenger of death
		 * @date 25.06.2008
		 */
		virtual void connect_signals();

		/**
		 * Вызывается для отключения слотов объекта от сигналов
		 * @author Denis A. Birukov aka Messenger of death
		 * @date 25.06.2008
		 */
		virtual void disconnect_signals();

	protected:
		/**
		* Вызывается для загрузки карты сигналов объекта. Вызов производится из load
		* @author Denis A. Birukov aka Messenger of death
		* @date 25.06.2008
		*/
		virtual void load_signals ( Config_Interface *intf, std::string storage_prefix );

		std::string _video_name_;
		std::string _scene_name_;
		std::string _object_name_;
		double _x_;
		double _y_;
		std::string _error_;
		struct SignalConnection
		{
			std::string signal_name;
			std::string slot_name;
			SignalConnection ( std::string t_signal_name, std::string t_slot_name )
					: signal_name ( t_signal_name ), slot_name ( t_slot_name ) {};
		};
		std::vector<SignalConnection> _signal_connections_;

};




#endif
