<?php
//https://u-labs.de/portal/tag/php/
ini_set('max_execution_time', 0); 		// Reini erhöht von 15 Minuten auf 0!
require_once(__DIR__ . "/../config/connect.php");
require_once(__DIR__ . "/../global_functions.php");
set_time_limit(0);		
ini_set('memory_limit', '-1');
// Keine Ahnung, warum das gesetzt wurde, habs jetzt auch erhöht
session_write_close();
$debug_log = true;

// Funktion ladet die Dateien hoch
function sendFile_sync($files, $token, $incremental, $bon_id=null) {
	global $debug_log;
	$time_start = microtime(true);
	try
	{
		log_to_file("------> SYNC DATA TO WaWi : sendFile_sync");
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, FILIALSYSTEM_URL_ZENTRALSYSTEM . "/synchronize/sync.php");
		//curl_setopt($ch, CURLOPT_HEADER, false);
		curl_setopt($ch,CURLOPT_HEADER,false);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
		
		$files['kassa'] = FILIALSYSTEM_KASSA_NAME;
		$files['token'] = $token;
		$files['incremental'] = $incremental;
		$files['kassa_token'] = FILIALSYSTEM_TOKEN;
		
		
		log_to_file("kassa: ".FILIALSYSTEM_KASSA_NAME);
		log_to_file("token: ".$token);
		log_to_file("incremental: ".$incremental);
		log_to_file("kassa_token: ".FILIALSYSTEM_TOKEN);
		
		if($bon_id != null)
		{
			$files['bon_id'] = $bon_id;
		}

		curl_setopt($ch, CURLOPT_POST, true);
		curl_setopt($ch, CURLOPT_POSTFIELDS, $files);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($ch, CURLOPT_FAILONERROR, true);
		
		
		log_to_file("curl_exec");
		$result = curl_exec($ch);
		log_to_file("ENDE curl_exec");

		if ($result===false) 
		{
			log_to_file("CURL Fehler :". curl_error($ch)."<br>");
			echo "CURL Fehler :". curl_error($ch)."<br>";
		}
		else
		{

			$resultStr = substr($result, strpos($result,"{"));
			//log_to_file("vorher -->".$resultStr."<--");
			if (strpos($resultStr,"FINsuccsessfullids")!==false)
			{
				$resultStr = substr($resultStr, 0,strpos($resultStr,"FINsuccsessfullids"));
			}
			else 
			{
				if ($debug_log) echo "FINsuccsessfullids nicht gefunden\n";
				//$resultStr = $result;
			}

			$result_arr = json_decode($resultStr,true);
			echo("-->".$resultStr."<--");
			if ( empty($resultStr) )
			{
				echo "Error: Return von Server ist falsch :".$result."\n";
				log_to_file("Error: ".$result);
				exit;
			}
			else
			{
				if ($debug_log) log_to_file("-->".$resultStr."<--");
			}
			// Wenn der result_arr['errorcode'] nicht auf 0 ist, dann dann steht ein Fehlercode drinnen
			//log_to_file("Insert succsessfullids<br>");
			$time_end = microtime(true);
			$time = $time_end - $time_start;
			echo("<br>Sync nach Filialsystem ( retur id für Update ): " . $time."<br>");
			$time_start = microtime(true);
			//echo "<br><br><br>";
			$table_ausgabe = null;
			//var_dump($result_arr);
			foreach($result_arr['succsessfullids'] as $item)
			{
				if ( $table_ausgabe != $item['table'])
				{
					if ($debug_log) echo "Update Tabelle ".$item['table']." wurde aufgerufen\n";
					$table_ausgabe = $item['table'];
				}
				
				//echo "Primarykey: ".$item['primarykey'].'<br>';
				//echo "Update Table: ".$item['table'].'<br>';
				//echo "ID: ".$item['id']."<br>";
				//log_to_file("ID: ".$item['id'].", Table: ".$item['table'].", Primarykey: ".$item['primarykey']);
				$successfull = true;
				if (isset($item['successfull']))
					$successfull = $item['successfull'];
				
				update_succsessfull_ids($item['id'],$item['table'],$item['primarykey'], $successfull);
			}
			
			//log_to_file("ENDE Insert succsessfullids<br>");
			
			/*
			if ($result_arr['errorcode']!==0)
			{
				echo "<br>Fehler :".$result_arr['errorcode']."<br>";
				echo "<br>Fehler :".$result_arr['error']."<br>";
				return (false);
			}
			*/

		}
		$time_end = microtime(true);
		$time = $time_end - $time_start;
		echo("<br>Gesamte Sync Dauer: " . $time);
	}
	catch(Exception $e)
	{
		log_to_file("Exeption: ".$e);
		echo "Exeption: ".$e;
	}
	finally
	{
		log_to_file("<-------- SYNC DATA TO WaWi : end sendFile_sync");
		curl_close($ch);
		return(true);
	}
	
}

function update_succsessfull_ids($id, $table, $primarykey,$successfull)
{
	global $con_i;
	$id = htmlspecialchars($id,ENT_QUOTES | ENT_HTML5 | ENT_DISALLOWED | ENT_SUBSTITUTE,'UTF-8');
	
	$sqlUpdateSuccsessFullId = "UPDATE ".$table." SET sync_success_filialsystem = ".$successfull." WHERE ".$primarykey."='".$id."';";
	//log_to_file($sqlUpdateSuccsessFullId);
	//echo ($sqlUpdateSuccsessFullId.'<br>');
	mysqli_set_charset($con_i, "utf8");
	$retval = sIT_mysql_run_query($con_i,$sqlUpdateSuccsessFullId);
	//log_to_file("Retval sIT_mysql_run_query: ".$retval);
	//log_to_file("Retval mysqli_affected_rows: ".mysqli_affected_rows($con_i));
	if ( !$retval )
		log_to_file("ERROR: Update wurde nicht ausgefuehrt. Statment: ". $sqlUpdateSuccsessFullId."<br>");
	
	
	if(!$retval)
	{
		echo "Error sync_success_filialsytem.<br>";
		echo "SQL Query: ".$sqlUpdateSuccsessFullId."<br>";
		//log_to_file("SQL Query: ".$sqlUpdateSuccsessFullId);
	}
	
}

function get_all_tables_abgeschlossener_bon()
{
	return array('abgeschlossener_bon','abgeschlossener_bon_steuern','abgeschlossener_bon_frei','abgeschlossener_bon_produkte','abgeschlossener_bon_produkte_frei','abgeschlossener_bon_zahlung','dep');
	
}

function get_all_tables()
{
	$files=array();
	// Alex geändert von 'sitpos' auf SQL_DB name
	$sql="SELECT table_name FROM information_schema.tables WHERE table_schema ='".SQL_DB."'";
	//echo $sql;
	$Q1=mysql_query($sql);
	if (!$Q1) echo "Fehler:".mysql_error();
	else
	{
		while ($row=mysql_fetch_assoc($Q1))
		{
			if ( $row['table_name'] != 'offener_bon')
				array_push($files, $row['table_name']);
		}
	}
	return($files);
}

function create_xml_for_table($tb, $condition)
{
	$millisec=microtime();
	$millisec=substr($millisec,0,strpos($millisec," "));
	$stempel=date("Ymd_His").$millisec; 
	$filename=__DIR__ . "/../synchronize/uploads/".FILIALSYSTEM_KASSA_NAME."_". $tb."_".$stempel. "_data.xml";
	if (file_exists($filename)) unlink($filename);
	$xmlWriter = new XMLWriter();
	$xmlWriter->openMemory();
	$xmlWriter->startDocument('1.0', 'UTF-8');
	$xmlWriter->startElement($tb);
    
	/* $XMLDoc = new SimpleXMLElement("<?xml version='1.0' standalone='yes'?><$tb></$tb>"); */

    $query = mysql_query("describe $tb");
	//echo "describe $tb \n";
	
	$table_key = "";
	if (!$query) echo "Error: ".mysql_error();
	else
	{
		while ($row = mysql_fetch_assoc($query)) {
			if ($row["Key"] == "PRI") {
				$table_key = $row['Field'];
			}
		}
	}
	
	$found_row=false;
	mysql_query("set GLOBAL net_read_timeout=360");
	$query1 = mysql_unbuffered_query("SELECT * FROM $tb $condition");
	log_to_file("SELECT * FROM $tb $condition");
    //echo "\n QUERY: SELECT * FROM $tb $condition; \n";
	if (!$query1) echo "Error: ".mysql_error();
	else
	{
		// Bei einem unbuffered query gibt es kein mysql_num_rows deswegen mit $found_row arbeiten!!!
		//if (mysql_num_rows($query1) > 0) {
			
			
			$j=0;
			
			while ($row1 = mysql_fetch_object($query1)) {
				if ($j % 20000 === 0) 
				{
					//if($j>0) echo $j."\n";
					file_put_contents($filename, $xmlWriter->flush(true),FILE_APPEND);
					echo "Zeile $j: Exportiere $filename \n ";
					//ob_flush();
				}
				$j++;
				$found_row=true;
				$xmlWriter->startElement("row");
				//$xmlrow = $XMLDoc->addChild("row");
				foreach($row1 as $spalte => $wert) {
					//log_to_file("Spalte: ".$spalte.", Wert: ".$wert);
					$spalte = "A" . $spalte;
					//$xmlrow->$spalte = urlencode($wert);
					$xmlWriter->writeElement($spalte, urlencode($wert));
				}
				//$xmlrow->PRIMARY_KEY = urlencode($table_key);
				//echo "writeElement<br>";
				$xmlWriter->writeElement("PRIMARY_KEY", urlencode($table_key));
				//echo "endElemet<br>";
				$xmlWriter->endElement();
			}
		//} 
		$xmlWriter->endElement();
	}
	//echo $found_row."<br>";
	if($found_row)
	{
		//echo "exportiere Table: $tb \n";
		file_put_contents($filename, $xmlWriter->flush(true), FILE_APPEND);

	}
	else 
	{
		return(false);
	}
	return($filename);

}

function delete_files($filenames)
{
	foreach ($filenames as $filename)
	{
		//echo "Lösche $filename \n";
		unlink($filename);
	}
}

function upload_all_files($selVal,$bon_id)
{
	$timestamp = date("Y-m-d H:i:s");
	//echo "\n";
											// wird nachher überschrieben, daher gleich weg!
	$incremental = "false";
	
	// ************ Abfrage wenn es command line ist
	if (isset($argv[2])) {
		if ($argv[2] == "true") {
			$incr = true;
			$incremental = "true";
		} else {
			$incr = false;
		}
	} else {
		$incr = false;
	}
	// ************* Ende command line parameter
	
	// hier nur wenn mittels Post aufgerufen
	if (isset($_POST['type']) && $_POST['type'] === "full") {
		$incr = false;
		$incremental = "false";
	} 
	else 
	{
		$incr = true;  
	}
	//echo "selVal :".$selVal;
	
	if( !isset($bon_id))
		$bon_id = null;

	$condition = "";
	if (isset($selVal) && $selVal === "full") 
	{
		$incr = false;
		$incremental = "false";		// wenn setVal full ist, dann setze $incremental auf true ???????
	} else 
	{
		// differential ist 7 tage - das wird beim Kassenabschluss gemacht!
		if (isset($selVal) && $selVal === "diff") 
		{
			$condition = "WHERE update_ts >= (NOW() - INTERVAL 7 DAY)";
			$incr=false;
			$incremental = "false";
		}
		else
		{
			$incr = true;
			$incremental = "true";	
		}
	}

	//if (defined("FILIALSYSTEM_SYNCHRONISATION_BON") && FILIALSYSTEM_SYNCHRONISATION_BON == "ja") 
	//	$tables=get_all_tables_abgeschlossener_bon();
	//else
		$tables=get_all_tables();
	// Zum testen 2 Tables machen
	//$tables = ["abgeschlossener_bon_steuern", "auditing"];

	//echo "\ncontents: " . print_r($argv[1]) . "\n";

	$rand = substr(md5(microtime()),rand(0,26),5);
	$token = FILIALSYSTEM_KASSA_NAME . "_" . $rand . "_" . date(DATE_ATOM);

	// RFR: ausgebessert: das gilt nur wenn der letzte nicht ein structure sync war!!! ansonsten ist hier ein Fehler!
	// Hier wird der letzte Sync herausgesucht
	if ($incr) {
		//$result = mysql_query("SELECT ts FROM sync_info WHERE wert!='structure' ORDER BY ts DESC LIMIT 0,1;");
		//if (mysql_num_rows($result) > 0) {
		//	$row = mysql_fetch_assoc($result);
			//$condition = "WHERE sync_success_filialsystem='0' order by update_ts DESC";
			
			$condition = "WHERE sync_success_filialsystem=false";
		//}
	}

	$files = array();
	$filenames= array();	// Array mit allen XML Dateinamen
	$i = 0;
	$anzahl_fehler=0;

		if (!file_exists(__DIR__ . "/../synchronize/uploads/")) {
			mkdir(__DIR__ . "/../synchronize/uploads/", 0777, false);
		}

	// zippe alle Dateien und leade sie hoch
	$millisec=microtime();
	$millisec=substr($millisec,0,strpos($millisec," "));
	$stempel=date("Ymd_His").$millisec; 
	$zipfile=__DIR__ . "/../synchronize/uploads/".FILIALSYSTEM_KASSA_NAME."_".$stempel. "_data.zip";
	if (file_exists($zipfile)) unlink($zipfile);
	
	$i=0;
	$zip = new ZipArchive();
	if($zip->open($zipfile,ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE) == true)
	{
		foreach($tables as $tb) 
		{
		   
		   // echo $tb;
		   
		   if ( $tb == 'offener_bon')
				continue;
		   
		   $condition_string = $condition;
		   
		   /*
		   // hole tabellen von Einstellungen Filialsystem welche mit sync_success_filialsystem abgefragt werden
		   $gettables = explode(";",FILIALSYSTEM_SYNCHRONISATION_TABELLE_SUCCESS); 
		   
		   // wenn nicht im Array dann immer die ganze tabelle syncronisieren
			if(isset($gettables) && !in_array($tb,$gettables)) 	
				$condition_string= '';
			*/	
			$filename=create_xml_for_table($tb, $condition_string);
			//var_dump($filename);
			if ($filename!==false)
				
			{
				$result=$zip->addFile($filename, $tb);
				//echo "$tb zu zip Datei hinzugefügt Ergebnis: $result \n";
				//echo "$tb zu zip Datei hinzugefügt\n";
				//$files[$key] = new CurlFile(realpath($filename));
				array_push($filenames, $filename);
				$i++;
			}			
		}
		if ($i>0) $zip->close();
	}
	else echo "Fehler beim erstellen der Zip Datei";
	
	$files['file[0]'] = new CurlFile(realpath($zipfile));
	$rc=sendFile_sync($files, $token, $incremental,$bon_id);
	if ($rc===false) $anzahl_fehler=$anzahl_fehler+1;
	delete_files($filenames);
	if (file_exists($zipfile)) unlink($zipfile);
	
	/*
	foreach($tables as $tb) {
	   // echo $tb;
		$filename=create_xml_for_table($tb, $condition);
		//var_dump($filename);
		if ($filename!==false)
		{
			$key = "file[$i]";
			$files[$key] = new CurlFile(realpath($filename));
			array_push($filenames, $filename);
			$i++;
		}			
		// RFR: immer nur zwei Files hochladen, nicht 20 Files!!!
		// RFR: 20190828 - testweise auf 8 erhöht mit Version 2.20
		if ($i == 8) {
			//var_dump($files);
			$rc=sendFile_sync($files, $token, $incremental);
			delete_files($filenames);
			$filenames= array();
			if ($rc===false) $anzahl_fehler=$anzahl_fehler+1;
			//else echo $rc;
			$files =  array();
			$i = 0;
		}
	}

	if ($i > 0) {
		$rc=sendFile_sync($files, $token, $incremental);
		delete_files($filenames);
		$filenames= array();
		if ($rc===false) $anzahl_fehler=$anzahl_fehler+1;
		//else echo $rc;
	}
	*/
	
	// das sollte nur gemacht werden, wenn der upload auch OK war !!!!
	if ($anzahl_fehler===0)
	{
		//echo "Keine Fehler<br>";
		mysql_query("INSERT INTO sync_info(type, wert, ts) VALUES('upsync', '$selVal', '$timestamp');");
		//echo "Anzahl Fehler: $anzahl_fehler";
	}
	else echo "Fehler beim synchronisieren der Tabellen - Anzahl Fehler: $anzahl_fehler";
}
upload_all_files($selVal,$bon_id);
?>