<?php

function storeDB($db, $filepath)
{
	$data = serialize($db);
	$fp = fopen($filePath, "w");
    fwrite($fp, $data);
    fclose($fp);
}

function deviceTree(string $topic, array $fnTree, array &$device)
{

}

function mkDevicesDB($topic, $json, $group=false)
{
	global $devices, $listProperties, $indexDevices, $dbInit, $logFh;
	if (!isset($devices[$topic]))   $devices[$topic]= array();
	foreach ($json as $jsonDevice)
	{
		//print_r($device);
		$fn = $jsonDevice->friendly_name;
		$fnTree = explode("/", $fn);
		$device = & $devices[$topic];
		foreach($fnTree as $fnPart)
		{
			$device[$fnPart] = array();
			$device = & $device[$fnPart];
		}

		$device["device"] = new device;
		$device["device"]->topic = $topic;
		//$device["device"]->device = $jsonDevice;
		$device["device"]->friendlyName = $jsonDevice->friendly_name;
		if ($group)
		{
			//print_r($device);
			$device["device"]->groupID = $jsonDevice->id;
			$indexDevices[$device["device"]->groupID] = $jsonDevice->friendly_name;
		}else
		{
			$device["device"]->type = $jsonDevice->type;
			$device["device"]->ieeeAddress = $jsonDevice->ieee_address;
			if ( !empty($jsonDevice->power_source ) )
			{
				$device["device"]->powerSource = $jsonDevice->power_source;
			}
			if ($jsonDevice->definition != null)
			{
				$device["device"]->description = $jsonDevice->definition->description;
			}
			//searchProperty($fn, $device["device"], $jsonDevice, $listProperties);
			$indexDevices[$device["device"]->ieeeAddress] = & $device["device"];
			//print_r($device);
		}
	}
	$dbInit = true;
	fwrite($logFh, "################################START##################################################");
	fwrite($logFh, print_r($devices, true));
	fwrite($logFh, "################################END##################################################");

	echo "Devices DB made" .EOL;
	//print_r($devices);
}

function searchProperty($fn, &$device, $object, $listProperties)
{
	$objectArray = (array)$object;
	foreach($listProperties as $key => $value)
	{
		if (in_array($value, $objectArray))
		{
			//echo "$value trouvé =>";
			$device->$key = $value;
			//echo $device->$key . EOL;
		}
	}
}

function changeDevice($topic, $fn, &$device, $json)
{
	//print_r($device);
	/*foreach($fnTree as $fn)
	{
		//print_r($device);
		if (!isset($device[$fn]))
		{

		}
		$device = & $device[$fn];
	}*/

	//print_r($json);
	$fnTree = explode("/", $fn);
	print_r($json);
	if ( ($jsonDevice = json_decode($json)) === null )
	{
		echo "json ========>>>>>>> " . print_r($json,true) . EOL;
		if (!isset($device->value))
		{
			$device->{"value"} = $json;
			$device->type = true;			//set this as parameter and not device
		}
		print_r($device);
	}else
	{
		iterateDevice($topic, $fn, $device, $jsonDevice);
	}
}

function iterateDevice($topic, $fn, &$device, $json)
{
	global $changed;

	//echo "device =>";print_r($device);echo EOL;
	foreach($json as $key => $value)
	{
		$oldValue = 0;
		//echo "key =>"; print_r($key); echo EOL;
		//echo "value =>"; print_r($value); echo EOL;

		//echo "type : " . gettype($value) .EOL;
		if (gettype($value) == "object")
		{
			//echo " is Object" . EOL;
			if (!property_exists($device, $key))
			{
				$device->{$key} = null;
			}
			//echo "iterating" . EOL;
			iterateDevice($topic, $fn, $device, $value);
		}elseif (gettype($value) == "array")
		{
			//echo "is array" . EOL;

			iterateDevice($topic, $fn, $device, $value);
		}else
		{
			if (empty($device->$key) or $value != null)
			{
				if (isset($device->$key)) $oldValue = $device->$key;
				if ($oldValue != $value)
				{
					$device->{$key} = $value;
					$changed[$fn]["key"] = $key;
					$changed[$fn]["value"] = $value;

					//echo "oldvalue => " . print_r($oldValue, true) . EOL;
					/*if (empty($oldValue))
					{
						echo "Initializing " . $key;
					}else
					{
						echo "changed " . $key . " value " . $oldValue;;
					}
					echo  " to " . $value . EOL;*/
				}
				//print_r($device->functions);
				if (!empty($device->functions))
				{
					echo "executing notifications functions " . EOL;
					foreach($device->functions as $function)
					{
						//print_r($function);
						$function($topic, $fn, $key, $value);
					}
				}
			}
		}
	}
}


?>