#ifndef __MONKEYCAR_AREA__
#define __MONKEYCAR_AREA__


//#include "monkeycar_person.h"
//#include "monkeycar_bus.h"
#include <mutex>
#include <memory>
#include "area.h"
#include "fp_path.h"

struct db_area 
{
	std::vector<point> m_point;
	double m_default_speed;
};


struct monkey_bus;
struct monkey_person;

struct monkey_area : area,std::enable_shared_from_this<monkey_area>
{
public:
	monkey_area(std::shared_ptr<db_area> dap,int area_id,int over_count_person,int over_time_person,double scale,int32_t ,int32_t);
	~monkey_area()
	{}
	std::shared_ptr<monkey_person> find(uint32_t cardid);


	virtual void on_hover(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c);
	virtual	void on_enter(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c);
	virtual	void on_leave(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c);
	void on_card_leave(uint32_t cardid);
	void on_card_enter(const std::shared_ptr<card_location_base>&);
	void on_card_move(uint32_t cardid,const st_coord & st,uint64_t);
	
	inline  double map(double x, double y)
	{
		return m_path.map(x,y);
	}
	inline point_2 map(double d)
	{
		return m_path.map(d);
	}
	inline double get_total_length()
	{
		return m_path.get_total_length();
	}
	double getScale()
	{
		return scale();
	}

	static  uint64_t m_startTime;
private:
	std::map<uint32_t ,std::shared_ptr<monkey_person>> card_map_;
	std::vector<std::shared_ptr<monkey_bus>> bus_;
	fp_path m_path;
	std::mutex  m_mtx;
};

#endif