<?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");
ini_set('memory_limit', '-1');
set_time_limit(0);						// Keine Ahnung, warum das gesetzt wurde, habs jetzt auch erhöht
session_write_close();

// Funktion ladet die Dateien hoch
function sendFile_sync($files, $token, $incremental) {
	//return(0);
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, FILIALSYSTEM_URL_ZENTRALSYSTEM . "/synchronize/sync.php");
    //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;
    //var_dump($files);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $files);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_FAILONERROR, true);
    //echo "@" . realpath($filename);
    $result = curl_exec($ch);
    
	if ($result===false) 
	{
		echo "CURL Fehler :". curl_error($ch);
	}
	else
	{
		//echo "CURL Result :". curl_error($ch);
		//echo "CURL OK";
		//echo "XX".$result."XX";
		$result_arr=json_decode($result, true);
		//var_dump($result_arr);
		// Wenn der result_arr['errorcode'] nicht auf 0 ist, dann dann steht ein Fehlercode drinnen
		if ($result_arr['errorcode']!==0)
		{
			echo "Fehler :".$result_arr['errorcode'];
			echo "Fehler :".$result_arr['error'];
			return (false);
		}
	}
	curl_close($ch);
	return(true);
}

function get_all_tables()
{
	$files=array();
	$sql="SELECT table_name FROM information_schema.tables WHERE table_schema ='sitpos' ";
	$Q1=mysql_query($sql);
	if (!$Q1) echo "Fehler:".mysql_error();
	else
	{
		while ($row=mysql_fetch_assoc($Q1))
		{
			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 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");
    echo "\n QUERY: SELECT * FROM $tb $condition; \n";
	if (!$query1) echo 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);
					ob_flush();
				}
				$j++;
				$found_row=true;
				$xmlWriter->startElement("row");
				//$xmlrow = $XMLDoc->addChild("row");
				foreach($row1 as $spalte => $wert) {
					$spalte = "A" . $spalte;
					//$xmlrow->$spalte = urlencode($wert);
					$xmlWriter->writeElement($spalte, urlencode($wert));
				}
				//$xmlrow->PRIMARY_KEY = urlencode($table_key);
				$xmlWriter->writeElement("PRIMARY_KEY", urlencode($table_key));
				$xmlWriter->endElement();
			}
		//} 
		$xmlWriter->endElement();
	}
	
	if($found_row)
	{
		echo "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)
{
	$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 = "true";
	} 
	else 
	{
		$incr = true;
	}
	echo "selVal :".$selVal;
	
	$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";	
		}
	}

	$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 update_ts >= '" . $row['ts'] . "'";
		}
	}

	//echo $condition;
	
	$files = array();
	$filenames= array();
	$i = 0;
	$anzahl_fehler=0;

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

	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";
		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";
}

function upload_test_files()
{
	//$filename=create_xml_for_table($tb, $condition);
	//var_dump($filename);
	$anzahl_fehler=0;
	$files =  array();
	$filenames= array();
	$i=0;
	$filenames_test = glob('uploads/test/*.*');
	//var_dump($filenames_test);
	foreach($filenames_test as $filename) 
	{
	  //do your work here
		$key = "file[$i]";
		$files[$key] = new CurlFile(realpath($filename));
		array_push($filenames, $filename);
		$i++;
	}	
	$rc=sendFile_sync($files, "abc", "true");
	if ($rc===false) $anzahl_fehler=$anzahl_fehler+1;
	
	if ($anzahl_fehler===0)
	{
		echo "Keine Fehler";
		mysql_query("INSERT INTO sync_info(type, wert, ts) VALUES('upsync', '$in', '$timestamp');");
		echo "Anzahl Fehler: $anzahl_fehler";
	}
	else echo "Fehler beim synchronisieren der Tabellen - Anzahl Fehler: $anzahl_fehler";
}

//upload_test_files();
//upload_all_files("diff");
//exit;
upload_all_files($selVal);


?>