<?php
require_once("lib/php/include/dbPDO.php");
require_once('memcache.php');

class Location_model extends lib_Memcache
{

	function __construct()
	{
		$this->db = CommonPDOConnector::connect('MasterLP');		
	}

	public function ip2Location($ip)
	{

		$query = $this->db->query("select country, country3, city, state from envoyip where " . ip2long($ip) . " <= endip order by endip limit 1 ");

		if (!$query)
			return FALSE;

		$query->execute();
		$results = $query->fetch();
		return $results;
	}

	public function ip2Coordinates($ip)
	{
		$query = $this->db->query("select latitude, longitude from envoyip where " . ip2long($ip) . " <= endip order by endip limit 1");

		if (!$query)
			return FALSE;
		$query->execute();
		$results = $query->fetch();
		return $results;
	}

	public function envoyIp2Location($ip)
	{
		if(!$this->db){
			return FALSE;
		}
		$query = $this->db->prepare("select country, state, city, latitude, longitude, metro_code from envoyip where inet_aton('$ip') <= endip limit 1;");
		$query->execute();
		$results = $query->fetch();
		if (empty($results)) {
			return FALSE;
		}
		return $results;
	}

	public function zipToLoc($zip)
	{
		$query = $this->db->query("select city_name, state_name, state_abbr from zip_codes where zipcode = '$zip' limit 1;");
		$query->execute();
		$results = $query->fetch();
		if (empty($results)) {
			return FALSE;
		}
		return $results;
	}

	public function place2latlon($place)
	{
		if(!$this->db){
			return FALSE;
		}
		if (strlen($place) == 5 && is_number($place)) {
			return $this->zip2latlon($place);
		} elseif ((strlen($place) == 3) && is_number($place)) {
			return $this->area2latlon($place);
		}

		$locationarray = explode(',', $place);

		if (count($locationarray) >= 2) {
			$city = trim($locationarray[0]);
			$state = trim($locationarray[1]);
		} else {
			$city = trim($locationarray[0]);
		}

		if ($state) {
			$query = $this->db->query("select zipcode, lat, lon, state_abbr, city_name from zip_codes where city_name like '$city' and (state_abbr like '$state' or state_name like '$state') limit 1;");
		} else {
			$query = $this->db->query("select zipcode, lat, lon, state_abbr, city_name from zip_codes where city_name like '$city' limit 1;");
		}
		$query->execute();
		$results = $query->fetch();
		if (empty($results)) {
			return FALSE;
		}
		return $results;
	}

	public function area2latlon($areacode)
	{
		$query = $this->db->query("select zipcode, lat, lon, state_abbr, city_name from zip_codes where areacode like '$areacode' limit 1;");
		$query->execute();
		$results = $query->fetch();
		if (empty($results)) {
			return FALSE;
		}
		return $results;
	}

	public function zip2latlon($zip)
	{
		$query = $this->db->query("select zipcode, lat, lon, state_abbr, city_name from zip_codes where zipcode like '$zip' limit 1;");
		$results = $query->fetchAll(PDO::FETCH_ASSOC);
		if (count($results) !== 1) {
			return FALSE;
		}
		return $results;
	}

	public function getState($c)
	{
		$key = md5('getState' . $c);
		$ttl = 60 * 60 * 24 * 30; // 30 days

		$results = lib_Memcache::mGet()->get($key);
		if ($results === false) {
			$query = $this->db->query("select id, state_name, state_code, state_desc from bd_states where state_code = '" . $c . "' limit 1;");
			$query->execute();
			$results = $query->fetch();
			if (empty($results)) {
				return FALSE;
			}
			lib_Memcache::mGet()->set($key, $results, 0, $ttl);
			return $results;
		}

		return $results;
	}

	public function getStates($c)
	{
		$key = md5('getStates' . $c);
		$ttl = 60 * 60 * 24 * 30; // 30 days

		$results = lib_Memcache::mGet()->get($key);

		if ($results === false) {
			$query = $this->db->query("select id, state_name, state_code from bd_states where state_name like '" . $c . "%';");

			if ($query->num_rows() > 0) {
				$results = $query->result_array();
				lib_Memcache::mGet()->set($key, $results, 0, $ttl);
				return $results;
			} else {
				return false;
			}
		}

		return $results;
	}

	public function getAllStates()
	{
		$key = md5('getAllStates');
		$ttl = 60 * 60 * 24 * 30; // 30 days

		$results = lib_Memcache::mGet()->get($key);
		if ($results === false) {
			$query = $this->db->query("select id, state_name, state_code from bd_states;");
			$query->execute();
			$results = $query->fetchAll();
			if (!empty($results)) {
				lib_Memcache::mGet()->set($key, $results, 0, $ttl);
				return $results;
			} else {
				return false;
			}
		}

		return $results;
	}

	public function getCity($c, $state)
	{
		$key = md5('getCity' . $c . $state);
		$ttl = 60 * 60 * 24 * 30; // 30 days

		$results = lib_Memcache::mGet()->get($key);
		if ($results === false) {
			$query = $this->db->query("select id, accent_city, city_desc from cities where major = 1 and accent_city = '" . ucwords($c) . "' and region = '$state' limit 1;");
			$query->execute();
			$results = $query->fetchAll();
			if (!empty($results)) {
				lib_Memcache::mGet()->set($key, $results, 0, $ttl);
				return $results;
			} else {
				return false;
			}
		}

		return $results;
	}

	public function getCities($c, $state, $major = true, $limit = 10)
	{
		$key = md5('getCities' . $c . $state . $major . $limit);
		$ttl = 60 * 60 * 24 * 30; // 30 days

		$results = lib_Memcache::mGet()->get($key);

		if ($results === false) {
			$query = $this->db->query("select id, accent_city from cities where " . (($major == true) ? "major = 1 and " : "") . "city like '" . ucwords($c) . "%' and region = '$state' limit 0, " . $limit . ";");
			$results = $query->fetchAll(PDO::FETCH_ASSOC);
			if (count($results) > 0) {
				lib_Memcache::mGet()->set($key, $results, 0, $ttl);
				return $results;
			} else {
				return false;
			}
		}

		return $results;
	}

	public function getAllCities($state, $major = true)
	{
		$key = md5('getAllCities' . $state . $major);
		$ttl = 60 * 60 * 24 * 30; // 30 days

		$results = lib_Memcache::mGet()->get($key);

		if ($results === false) {
			$query = $this->db->query("select id, accent_city from cities where " . (($major == true) ? "major = 1 and " : "") . "region = '$state';");
			$results = $query->fetchAll(PDO::FETCH_ASSOC);
			if (count($results) > 0) {
				lib_Memcache::mGet()->set($key, $results, 0, $ttl);
				return $results;
			} else {
				return false;
			}
		}

		return $results;
	}

	public function stateShort2Long($state)
	{
		$key = md5('stateShort2Long' . $state);
		$ttl = 60 * 60 * 24 * 30; // 30 days

		$results = lib_Memcache::mGet()->get($key);

		if ($results === false) {
			$query = $this->db->query("select state_name from zip_codes where state_abbr like '$state' or state_name like '$state' limit 1;");
			$query->execute();
			$results = $query->fetch();
			if (empty($results)) {
				return false;
			}
			lib_Memcache::mGet()->set($key, $results, 0, $ttl);
			return $results;
		}

		return $results;
	}

	public function getStateAbout($state)
	{
		$key = md5('stateAbout' . $state);
		$ttl = 60 * 60 * 24 * 30; // 30 days

		$results = lib_Memcache::mGet()->get($key);

		if ($results === false) {
			$query = $this->db->query("select state_desc from bd_states where state_code like '$state' limit 1;");
			$query->execute();
			$results = $query->fetch();
			if (empty($results)) {
				return false;
			}
			lib_Memcache::mGet()->set($key, $results['state_desc'], 0, $ttl);
			return $results['state_desc'];
		}

		return $results;
	}

	public function completeLocation($search)
	{
		if (!isset($search)) return FALSE;
		$search = substr(ltrim(htmlspecialchars($search)), 0, 12);
		if (!$search) return false;
		$cacheKey = md5('completeLocation:' . $search);
		$locations = lib_Memcache::mGet()->get($cacheKey);
		if ($locations) return $locations;
		if (ctype_digit($search)) {
			$query = $this->db->query("select distinct city_name, state_name, state_abbr from zip_codes where zipcode = '{$search}';");
		} else {
			$query = $this->db->query("select distinct city_name, state_name, state_abbr from zip_codes where city_name like '{$search}%' limit 5;");
		}
		$query_result = $query->fetchAll(PDO::FETCH_ASSOC);
		if (count($query_result) > 0) {
			return FALSE;
		}
		$locations = array();
		foreach ($query->result_array() as $res) {
			$locations[] = $res['city_name'] . ", " . $res['state_abbr'];
		}
		lib_Memcache::mGet()->set($cacheKey, $locations, 0, 60 * 60 * 24);
		return $locations;
	}
}
