#include "special_area.h"

#include "db_api/CDBSingletonDefine.h"
#include "log.h"

special_area_list * special_area_list::instance()
{
	static special_area_list spl;
	return &spl;
}
int32_t special_area_list::get_special_id(uint32_t cardid,const point p,int32_t categoryid)
{
	int32_t f = -1;
	for(const auto s:m_v)	
	{
		if(p.x<=std::max(s.start_point.x,s.end_point.x)
			&&p.x>=std::min(s.start_point.x,s.end_point.x)
			&&p.y<=std::max(s.start_point.y,s.end_point.y)
			&&p.y>=std::min(s.start_point.y,s.end_point.y))	
			//&&p.z<=std::max(s.start_point.z,s.end_point.z)
			//&&p.z>=std::min(s.start_point.z,s.end_point.z))	
		{
			if(!s.car_type.empty())
				if(s.car_type.find(std::to_string(categoryid)) == std::string::npos)	
					continue;
			if(m_m.find(s.special_area_id) != m_m.end())
			{
				auto v=m_m[s.special_area_id];
				if(std::find(v.begin(),v.end(),cardid)==v.end())
					continue;
			}
			f=s.special_area_id;
		}
	}

	return f;
}
void special_area_list::init_from_db()
{
	init_special_area_entry();
	init_special_card();
}
void special_area_list::init_special_area_entry()
{
	const char * sql = "SELECT serial_num, start_point_x, start_point_y, start_point_z, end_point_x, end_point_y, \
					  end_point_z, special_area_id,car_type FROM dat_special_area_entry;";
	std::string Error;
	YADB::CDBResultSet DBRes;
	sDBConnPool.Query(sql,DBRes,Error);
	int nCount = DBRes.GetRecordCount( Error );
	if (nCount > 0)
	{
		log_info( "init_special_area. The record count=%d\n", nCount );

		while ( DBRes.GetNextRecod(Error) )
		{
			double start_x=0;
			DBRes.GetField( "start_point_x",start_x, Error );
			double start_y=0;
			DBRes.GetField( "start_point_y",start_y, Error );
			double start_z=0;
			DBRes.GetField( "start_point_z",start_z, Error );
			double end_x=0;
			DBRes.GetField( "end_point_x",end_x, Error );

			double end_y=0;
			DBRes.GetField( "end_point_y",end_y, Error );

			double end_z=0;
			DBRes.GetField( "end_point_z",end_z, Error );

			int areaid = 0;
			DBRes.GetField( "special_area_id",areaid, Error );
			std::string categoryid;
			DBRes.GetField( "car_type",categoryid, Error );
			
			m_v.emplace_back(start_x,start_y,start_z,end_x,end_y,end_z,areaid,categoryid);

			log_info("special area .....areaid:%d,categoryid:%s",areaid,categoryid.c_str());
		}
	}

}
void special_area_list::init_special_card()
{
	const char * sql = "SELECT b.vehicle_id,a.special_area FROM dat_special_card a , dat_vehicle b WHERE a.card_name = b.name;";
	std::string Error;
	YADB::CDBResultSet DBRes;
	sDBConnPool.Query(sql,DBRes,Error);
	int nCount = DBRes.GetRecordCount( Error );
	if (nCount > 0)
	{
		log_info( "init_special_card. The record count=%d\n", nCount );

		while ( DBRes.GetNextRecod(Error) )
		{
			int vehicle_id = 0;
			DBRes.GetField( "vehicle_id",vehicle_id, Error );
			
			int areaid=0;
			DBRes.GetField( "special_area",areaid, Error );

			auto iter = m_m.find(areaid);
			if(iter != m_m.end())
				iter->second.push_back(vehicle_id);
			else
				m_m[areaid].push_back(vehicle_id);

			log_info("special card .....areaid:%d,categoryid:%d %d ..... %d",areaid,vehicle_id,m_m.size(),m_m[areaid].size());
		}
	}


}