<?php
	require_once("../../config/connect.php");
	require_once("../../config/sIT_global_db_functions.php");  
	require_once("../../global_functions.php");
	
	ini_set('max_execution_time', -1);
	$debug=false;
	

	function get_table_api_shopify_url($strurl,$object_shopify)
	{
		global $debug;
		$token = FILIALSYSTEM_TOKEN;
		$url = FILIALSYSTEM_URL_ZENTRALSYSTEM;
		$nextPage = NULL;
		$url .= $strurl;
		$curl = curl_init();

		// set result limit and Basic auth

		curl_setopt_array(
			$curl,
			array(
				CURLOPT_URL => $url."?limit=250",
				CURLOPT_RETURNTRANSFER => true,
				CURLOPT_ENCODING => "",
				CURLOPT_CUSTOMREQUEST => "GET",
				CURLOPT_SSL_VERIFYHOST => 0,
				CURLOPT_SSL_VERIFYPEER => 0,
				CURLOPT_HTTPHEADER => array(
					"Content-Type: application/json",
					"X-Shopify-Access-Token: $token"
				)
			)
		);

		// call back function to parse Headers and get Next Page Link
		curl_setopt(
			$curl,
			CURLOPT_HEADERFUNCTION,
			function($curl, $header) use (&$nextPage) {
				//echo $header;
				$len = strlen($header);
				$header = explode(':', $header, 2);

				if (count($header) < 2) // ignore invalid headers
				return $len;
				
				if (trim(strtolower($header[0])) === "link" && strpos($header[1], 'next') !== false) {
					$links = explode(',', $header[1], 2);

					$link = count($links) === 2 ? $links[1] : $links[0];
					if (preg_match('/<(.*?)>/', $link, $match) === 1) $nextPage = $match[1];
				}

				return $len;
			}
		);

		// First request

		$response = curl_exec($curl);
		//$header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
				
		//$header = substr($response_shopify, 0, $header_size);
		//$response = substr($response_shopify, $header_size);

		if (curl_errno($curl)) {
			echo "Fehler beim CURL aufruf \n";
			$error_msg = curl_error($curl);
			print_r($error_msg);
			exit;
		}
		//var_dump($response);
		$parsedResponse =json_decode($response, true);
		
		if (isset ($parsedResponse['errors']))
		{
			if ($debug) echo "Datensatz wurde nicht gefunden";
			return (null);
		}

		$result = null;
		//echo "<br>-->".$object_shopify."<--<br>";
		//var_dump($parsedResponse);
		$result = $parsedResponse[$object_shopify];

		// generate new requests till next page is available

		while ($nextPage !== NULL) 
		{
			curl_setopt($curl, CURLOPT_URL, $nextPage);
			$parsedResponse[$object_shopify] = [];
			

			//$parsedResponse->$object_shopify = [];
			$nextPage = NULL;

			$response = curl_exec($curl);
			$parsedResponse = json_decode($response, true);

			if (curl_errno($curl)) {
				$error_msg = curl_error($curl);
			} 
			else 
			{
				$result =array_merge($result,  $parsedResponse[$object_shopify]);
				//sleep(2);
			}
		};

	curl_close($curl);
	return  $result;
}
	
	function existiert_id_in_sitpos($id, $table, $primary_key)
	{
		global $con_i;
		
		$sql="SELECT $primary_key from $table where $primary_key=".$id.";";
		//echo $sql."<br>";
		$Q1 = sIT_mysql_run_query($con_i, $sql, true);
		
		$retval = 0;
		
		if (sIT_mysql_num_rows($Q1)>0) 
			$retval = 1;
		
		return $retval;
	}
	
	function get_tax_from_sitpos($c)
	{
		$retVal = NULL;
		
		if ( $c['title'] == '20% Steuer' )
			$retVal = 0.2000;
		else if($c['title'] == '10% Steuer')
			$retVal = 0.1000;
		else if($c['title'] == '0% Steuer')
			$retVal = 0.0000;
		
		return $retVal;
	}
	

	
	//*************************************************************

	function get_single_collection_metafield($c_id)
	{
		$meta_data = get_table_api_shopify_url('collections/'.$c_id.'/metafields.json','metafields');		
		return($meta_data);
	}

	function import_collection_into_sitpos($collection)
	{
		global $debug;
		global $con_i;
		$anzeigen = 1;
		
		$meta_data=get_single_collection_metafield($collection['id']);
		foreach ($meta_data as $metafield)
		{
			if ( isset($metafield['namespace']) && $metafield['namespace']== 'markta' && $metafield['key'] == 'hide_on_cash_register' )
			{
				echo "HIDE value: ";
				var_dump($metafield);
				if ($metafield['value']==true)
				{
					// importiere die collection
					echo "Die Collection ".$collection['id']." wurde hide_on_cash_register gesetzt\n";
					$anzeigen = 0;
				}
				
			}
			
		}
		
		if (existiert_id_in_sitpos($collection['id'], 'categories', 'id') == 0) {

			$sql_insert = "INSERT into categories SET ID=" . $collection['id'] . ",NAME = '" . $collection['title'] . "',anzeigen=".$anzeigen.";";
			//echo $sql_insert . "<br>";
			mysqli_set_charset($con_i, "utf8");
			sIT_mysql_run_query($con_i, $sql_insert, true);
		} else {
			$sql_update = "UPDATE categories SET anzeigen=".$anzeigen.",NAME = '" . $collection['title'] . "' WHERE ID=" . $collection['id'] . ";";
			//echo $sql_update . "<br>";
			mysqli_set_charset($con_i, "utf8");
			sIT_mysql_run_query($con_i, $sql_update, true);
		}
	}

	function import_products_into_sitpos($product, $taxcat, $collection)
	{
		global $debug;

		date_default_timezone_set("Europe/Berlin");
		$timestamp = time();
		global $con_i;

		$geloescht = 1;
		if ( $product['status'] == 'active' )
		{
			$geloescht = 0;
			if ($debug) echo "Gelöscht: ";
		}
		
		// WaWi für Waagenexport
		
		$waagen_nr = null;
		$preis_pro_kilo = null;
		$haltbarkeit_in_tagen = null;
		$waage_produkt_aktivieren = 0;
		$produkt_name=mysql_real_escape_string($product['title']);
		
		
		//echo "get variants<br>";
		//echo date("H:i",$timestamp);
		//echo "<br>";
		$variations = get_table_api_shopify_url('products/'.$product['id'].'/variants.json', 'variants');
		
		$meta_data = get_table_api_shopify_url('products/'.$product['id'].'/metafields.json','metafields');
		if ($debug) echo $product['id']."\n";
		//if ($debug) echo "--------------------------------------\n";
		//var_dump($meta_data);
		//var_dump($variations);
		$price = null;
		$barcode = null;
		$tax_product = null;
		$sku = null;
		if($taxcat == '0.1')
				$tax_product = 2;
		if($taxcat == '0.2')
				$tax_product = 4;
		if($taxcat == '0.0')
				$tax_product = 1;
		//echo "--------------------------------------\n";	
		
		//$price = $variations[0]['price'];
		//if(!is_null($preis_pro_kilo))
		$negativer_preis=false;
		$meta_data = get_table_api_shopify_url('products/'.$product['id'].'/metafields.json','metafields');
		echo "Product ID: ".$product['id']."\n";
		echo "Tax: ".$taxcat."\n";
		echo "Tax: ID".$tax_product."\n";
		log_to_file("Product ID: ".$product['id']);	
		log_to_file ("Tax: ".$taxcat);
		log_to_file ("Tax: ID".$tax_product);
		foreach ( $meta_data as $metafield)
		{
			if ( isset($metafield['namespace']) && $metafield['namespace']== 'markta' && $metafield['key'] == 'price_in_kg' )
			{ 
				//var_dump($metafield['value']);
				$value_array=json_decode($metafield['value'], true);
				//var_dump($value_array['amount']);
				if ( isset($value_array['amount']))
					$preis_pro_kilo = $value_array['amount'];
				//exit;
				//if ( isset($metafield['value']) && isset($metafield['value']['amount']))
				//	$preis_pro_kilo = $metafield['value']['amount'];
			}
			if ( isset($metafield['namespace']) && $metafield['namespace']== 'markta' && $metafield['key'] == 'deposit_product' )
			{ 
				if ($metafield['value']==true)
				{
					$negativer_preis = true;
					if ($debug) echo "Das Produkt ist mit dem Flag fuer negativen Preis versehen\n";
				}
				
			}
			/*
			if ( isset($metafield['namespace']) && $metafield['namespace']== 'markta' && $metafield['key'] == 'sku_scale' )
			{ 
				var_dump($metafield['value']);
				if (isset($metafield['value']))
				{
					$sku = $metafield['value'];
					if ($debug) echo "Das Produkt ist sku_scale versehen\n";
				}
				
			}
			*/
			if ( isset($metafield['namespace']) && $metafield['namespace']== 'markta' && $metafield['key'] == 'barcode_application_identifier' )
			{ 
				
				if(isset($metafield['value']))
					$sku = $metafield['value'];
				
				
				if ($debug)
				{
					echo "Barcode aus Metadata wurde gesetzt\n";
					log_to_file("Barcode aus Metadata wurde gesetzt");
				}
				
			}
		}
		
		if(!is_null($preis_pro_kilo))
			$price = $preis_pro_kilo; 
		else if (isset($variations) && isset($variations[0]) && isset($variations[0]['price']))
			$price = $variations[0]['price'];
		
		
		if (is_null($sku) && isset($variations) && isset($variations[0]) && isset($variations[0]['sku']))
		{
			$sku = preg_replace("/\s+/", "",str_replace('37-','',$variations[0]['sku']));
			$sku = preg_replace("/\s+/", "",str_replace('38-','',$sku));
			if (strlen($sku)<5) $sku=str_pad($sku, 5, '0', STR_PAD_LEFT);
		}
		

		if (isset($variations) && isset($variations[0]) && isset($variations[0]['barcode']))
		{
			$barcode = $variations[0]['barcode'];
			$barcode = preg_replace("/\s+/", "",str_replace('-','',$barcode));
		}

		if (existiert_id_in_sitpos($product['id'], 'products', 'id') == 0 )
		{
			
			$sql_insert="INSERT into products SET geloescht = ".$geloescht.",REFERENCE= '".$sku."', CATEGORY=".$collection.",id=".$product['id'].",NAME = '".$produkt_name."'";
			if (!is_null($price)) {
				list($netto_einzel, $netto_summe, $steuer, $steuer_summe) = berechne_nettopreis($price, $taxcat, 1);
				$netto_einzel = $price / (1 + $taxcat);
				
				//echo "<br>PRICE: ".$price . "<br>" . (1 + $taxcat) . "<br>";
				
				// Pfand Rückgabe 10% & Pfand Rückgabe 20% in Shopify keinen Minuswert eingeben
				if ($negativer_preis)
				{
					$netto_einzel = $netto_einzel*-1;
					//echo "netto_einzel ".$netto_einzel."<br>";
					
				}

				if (!is_null($tax_product))
					$sql_insert .= ",PRICESELL='" . $netto_einzel . "'";
			}
			if (!is_null($barcode))
				$sql_insert .= ",CODE='" . $barcode . "'";

			if (!is_null($tax_product))
				$sql_insert .= ",TAXCAT=" . $tax_product;

			$sql_insert .= ";";

			//echo $sql_insert . "<br>";
			mysqli_set_charset($con_i, "utf8");
			sIT_mysql_run_query($con_i, $sql_insert, true);
		}
		else
		{
			$sql_update="UPDATE products SET geloescht = ".$geloescht.",REFERENCE= '".$sku."',CATEGORY=".$collection.",NAME = '".$produkt_name."'";
			if (!is_null($price)) {
				list($netto_einzel, $netto_summe, $steuer, $steuer_summe) = berechne_nettopreis($price, $taxcat, 1);
				$netto_einzel = $price / (1 + $taxcat);
				//echo "Taxcat<br>".$taxcat."<br>";
				
				//echo "<br>PRICE: ".$price . "<br>" . (1 + $taxcat) . "<br>";
				
				// Pfand Rückgabe 10% & Pfand Rückgabe 20% in Shopify keinen Minuswert eingeben
				if ($negativer_preis)
				{
					$netto_einzel = $netto_einzel*-1;
					echo "netto_einzel ".$netto_einzel."<br>";
					
				}
				// Wenn keine Tax angegeben, dann auch keinen Preis berechnen
				if (!is_null($tax_product))
					$sql_update .= ",PRICESELL='" . $netto_einzel . "'";
			}
			if (!is_null($barcode))
				$sql_update .= ",CODE='" . $barcode . "'";

			if (!is_null($tax_product))
				$sql_update .= ",TAXCAT=" . $tax_product;

			$sql_update .= " WHERE ID=" . $product['id'] . ";";
			//echo $sql_update . "<br>";
			mysqli_set_charset($con_i, "utf8");
			sIT_mysql_run_query($con_i, $sql_update, true);
		}
		
		//echo "ende get variants";
		//echo "<br>";
		//echo date("H:i",$timestamp);
		//echo "<br>";
	}

	function get_inventory_level($product, $location_id)
	{
		global $debug;
		if (isset($location_id) && !empty($location_id)) 
		{
			if ($debug) echo "Location ID ist in sITpos gesetzt \n";
			//var_dump($product);
			$variations = get_table_api_shopify_url('products/'.$product['id'].'/variants.json', 'variants');
			//var_dump($variations);
			$inventory_item_id=$variations[0]['inventory_item_id'];
			if ($debug) echo "Inventory Item ID: " . $variations[0]['inventory_item_id'] ."\n";
			$inventory_levels = get_table_api_shopify_url('inventory_levels.json?inventory_item_ids='.$inventory_item_id.'&location_ids='.$location_id, 'inventory_levels');
			if ($debug) echo "Anzahl der inventory_levels:".count($inventory_levels)."\n";
			if (count($inventory_levels)===0)
			{
				if ($debug) echo "Produkt ist nicht in der Location - wird nicht importiert \n";
				return(false);
			}
			else return(true);
		} 
		else 
		{
			if ($debug) echo "Location ID ist NICHT gesetzt";
			return false;
		}
	}

	function import_products_for_collection($c_id, $tax=NULL)
	{
		global $debug;
		global $con_i;

		$products = get_table_api_shopify_url('collections/'.$c_id.'/products.json','products');
		//var_dump($products);
		$i=0;
		foreach ($products as $product)
		{
			if ($debug) echo "----------------------------------------------\n";
			$ist_in_location=get_inventory_level($product, SHOPIFY_FILIALE);
			//echo $ist_in_location;
			//exit;

			if ($ist_in_location)
			{
				if ($debug) echo "Produkt $i: Importiere Produkt ".$product['title']." in collection $c_id \n";
				import_products_into_sitpos($product, $tax, $c_id);				
				$i++;
			}
			elseif (existiert_id_in_sitpos($product['id'], 'products', 'id') == 1 )
			{
				$sql_update="UPDATE products SET geloescht = 1 WHERE id=".$product['id'];
				sIT_mysql_run_query($con_i, $sql_update, true);
			}
		}
	}

	// Hier wird nur mehr ein array übergeben mit allen collection Ids, die importiert werden sollen
	function import_all_products($collect_array)
	{
		global $debug;
		//$collect_array = array (404137935079, 404137967847, 603475968338, 603475902802, 603475837266, 603548385618,603592196434,603592360274,603891073362,604735930706,604735799634);
		//$collect_array = array (384112951512,384189858008);
		//$collect_array = array (604735930706,604735799634);
		
		// Zuerst werden alle collections importiert, die eine Steuer haben
		foreach ($collect_array as $c_id)
		{
			$collection = get_table_api_shopify_url('collections/'.$c_id.'.json', 'collection' );
			import_collection_into_sitpos($collection);
			$tax = get_tax_from_sitpos($collection);
			if (is_null($tax))
			{
				// Die Collection ist keine Steuer Collection
				// echo "Fehlerhafte Steuer für Collection: $c_id \n";
				
			}
			else
			{
				echo "Importiere Collection $c_id mit Steuer: $tax \n";
				import_products_for_collection($c_id, $tax);
			}
		}
		// Und danach für alle, die keine Steuer angegeben haben (diese sind dann in der extra Warengruppe)
		foreach ($collect_array as $c_id)
		{
			$collection = get_table_api_shopify_url('collections/'.$c_id.'.json', 'collection' );
			$tax = get_tax_from_sitpos($collection);
			if (is_null($tax))
			{
				// Die Collection ist keine Steuer Collection
				echo "Importiere Produkte ohne Steuer aus Collection: $c_id \n";
				import_products_for_collection($c_id, NULL);
			}
			else
			{
				// hier wird nichts gemacht
			}
		}

	}

	// Durchsucht alle Collections ob das Metafield cash_register_group gesetzt ist
	// Wenn, ja wir die Collection ID in die Liste der zu importierenden IDs hinzugefügt
	function get_collections_to_import($c_array)
	{
		global $debug;

		$import_c_array=array();
		if ($debug) echo "Durchsuche alle collections \n";
		$i=1;
		foreach ($c_array as $c_id)
		{
			if ($debug) echo($i . ":". $c_id."\n");
			$meta_data=get_single_collection_metafield($c_id);
			foreach ($meta_data as $metafield)
			{
				if ( isset($metafield['namespace']) && $metafield['namespace']== 'markta' && $metafield['key'] == 'cash_register_group' )
				{
					if ($metafield['value']==true)
					{
						// importiere die collection
						//if ($debug) echo "Die Collection $c_id wurde für den Import in die Kassa gefunden\n";
						echo "Die Collection $c_id wurde für den Import in die Kassa gefunden\n";
						log_to_file("Die Collection $c_id wurde für den Import in die Kassa gefunden");
						array_push($import_c_array, $c_id);
					}
					
				}
				
			}
			$i++;
		}
		return($import_c_array);
	}

	function get_custom_collections()
	{
		$c_array=array();
		$collections=array();
		$collections = get_table_api_shopify_url('custom_collections.json', 'custom_collections' );
		foreach ((array) $collections as $collection)
		{
			$c_id=$collection['id'];
			array_push($c_array, $c_id);
		}
		return($c_array);
	}

	function get_smart_collections()
	{
		$c_array=array();
		$collections=array();
		$collections = get_table_api_shopify_url('smart_collections.json', 'smart_collections' );
		foreach ((array) $collections as $collection)
		{
			$c_id=$collection['id'];
			array_push($c_array, $c_id);
		}
		return($c_array);
	}

	// Funktion gibt ein array mit allen collections IDs aus shopify
	function get_all_collections()
	{
		$c_id=array();
		$c_id=get_custom_collections();
		$cc_id=get_smart_collections();
		$c_id=array_merge($c_id, $cc_id);
		return $c_id;
	}

	function import_shopify_collections_and_files()
	{
		log_to_file("Starte Shopify import");
		$c_id=get_all_collections();
		$import_c_array=array();
		$import_c_array=get_collections_to_import($c_id);

		//$import_c_array=array(384112951512, 384189858008, 384831553752); // 10 Prozen 20 Prozent Obst&Gemüse
		//$import_c_array=array(384189858008); // 20 Prozent

		//var_dump($import_c_array);
		import_all_products($import_c_array);
		log_to_file("Shopify import wurde beendet");
	}

	// Funktion liest die Location Ids aus - wird nicht gebraucht ID wird schon in Konstante SHOPIFY_FILIALE gespeichert, nur zum testen
	function get_location_ids()
	{
		$l_array=array();
		$ocations=array();
		$locations = get_table_api_shopify_url('locations.json', 'locations' );
		foreach ((array) $locations as $location)
		{
			$l_id=$location['id'];
			$l_name=$location['name'];
			echo "location $l_id Name: $l_name \n";
			array_push($l_array, $l_id);
		}
		return($l_array);
	}

	function delete_non_existing_products()
	{
		global $con_i;
		global $debug;

		//$c_id=get_all_collections();
		//$import_c_array=array();
		//$import_c_array=get_collections_to_import($c_id);
		//var_dump($import_c_array);
		//$import_c_array=$c_id;
		//var_dump($import_c_array);

		$i=1;
		$sql="SELECT id, name from products WHERE geloescht=0";
		//echo $sql."<br>";
		$Q1 = sIT_mysql_run_query($con_i, $sql, true);
		while ($produkte=sIT_mysql_get_row($Q1))
		{
			$id=$produkte['id'];
			$name=$produkte['name'];
			if ($debug) echo "$i: Checke Produke ID $id - $name aus sITpos \n";
			$product = get_table_api_shopify_url('products/'.$id.'.json', 'product' );
			if (count($product)>0)
			{
				if ($debug) echo "Produkt existiert in shopify \n";
			}
			else
			{
				echo "Loesche Produkt $id - $name aus sITpos \n";
				$sql1="UPDATE products SET geloescht=1 WHERE id=$id";
				//echo $sql1."\n";
				sIT_mysql_run_query($con_i, $sql1, true);
			}	
			$i++;
		} 
				
	}

	function delete_non_existing_collections()
	{
		global $con_i;
		global $debug;

		$c_id=get_all_collections();
		$import_c_array=array();
		$import_c_array=get_collections_to_import($c_id);
		//var_dump($import_c_array);
		
		$sql="SELECT id, name from categories WHERE geloescht=0";
		//echo $sql."<br>";
		$Q1 = sIT_mysql_run_query($con_i, $sql, true);
		while ($warengruppe=sIT_mysql_get_row($Q1))
		{
			$id=$warengruppe['id'];
			$name=$warengruppe['name'];
			if ($debug) echo "Checke Warengruppe ID $id $name aus sITpos \n";
			if (in_array($id, $import_c_array, false))
			{
				$sql2="UPDATE categories SET geloescht=false WHERE id=$id";
				sIT_mysql_run_query($con_i, $sql2, true);
				if ($debug) echo "Warengruppe existiert in shopify \n";
			}
			else
			{
				"Loesche Warengruppe $id - $name aus sITpos\n";
				$sql1="UPDATE categories SET geloescht=true WHERE id=$id";
				sIT_mysql_run_query($con_i, $sql1, true);
			}
					
		} 
				
	}
	
	function delete_non_existing_collections_and_products()
	{
		delete_non_existing_collections();
		delete_non_existing_products();
	}

	// Mache einen API Call auf Shop. Wenn mehr als 10 Antworten kommen, dann funktioniert der Shop.
	// Shopify akzeptiert nämlich irgend einen namen vor myshopify.com - bringt dann aber nur not found zurück. 
	function kann_auf_shop_zugegriffen_werden()
	{
		global $debug;

		$shop = get_table_api_shopify_url('shop.json', 'shop' );
		//var_dump($shop);
		if (count($shop)<10)
		{
			return (false);
		}
		else 
		{
			return (true);
		}

	}
	
	$shop_online=kann_auf_shop_zugegriffen_werden();
	if ($shop_online)
	{
		if ($debug) echo "Shop antwortet, Funktion wird fortgesetzt \n";
	}
	else
	{
		echo "Shop antwortet nicht korrekt - Breche Funktionen ab \n";
		exit;
	}

	echo "Starte Shopify Import";
	import_shopify_collections_and_files();
	delete_non_existing_collections_and_products();
	echo "Ende Shopify Import";
	//get_location_ids();
	//get_collection_ids();
	exit;

	/*
	if (isset($_REQUEST['funktion'])) {
		$funktion = $_REQUEST['funktion'];
	}
	else
	{
		sitpos_sync_categories_and_products();
		exit;
	}
	
	switch ($funktion) {		
		case "sync_categories_and_products":

			sitpos_sync_categories_and_products();
			break;
		default:
			echo "Falscher Aufruf";
	}
	*/
	
?>