<?php

class ItemSearch {

	private $config;
	protected $base_object;
	protected $db;
	
	private $searchData = array();
	

	public function __construct($base_object) {
		$this->config = $base_object->config;
		$this->db = $base_object->db;
		$this->base_object = $base_object;
	}

	public function searchItems($searchString) {
		$timer_start = microtime(true);

//		$searchString_trimmed = trim($searchString);
//		$searchString_filtered = preg_replace("@[^\p{L}\p{N}]@sui", '', $searchString_trimmed);

		$results = false;
		if (ctype_digit($searchString)) {
			$results = $this->_getItemByNumber($searchString);
		}
		if (!$results) {
			$results = $this->_searchItemWithinItemsAndAssociations('', $searchString);
		}
               
		$running_time = microtime(true) - $timer_start;

		$result = array(
			'searchstring' => $searchString,
			'results' => count($results),
			'queryTime' => $running_time,
			'data' => $results
		);
		
		$this->searchData = array(
			'string1' => $searchManufacturer,
			'string2' => $searchString,
			'used1' => $searchManufacturer_ready,
			'used2' => $searchString_ready,
			'results' => count($results)
		);

		return $result;
	}

	private function _searchItemWithinItemsAndAssociations($searchManufacturer, $searchString, $idsOnly = false, $searchManufacturer_filtered = false, $searchString_filtered = false, $searchRefinement_filtered = false) {
 		$queries = $this->_queryLike($searchManufacturer_filtered, $searchString);
		
		$results = array();
		
                $idArray = array();
		foreach ($queries as $query) {

                        $rs = $this->db->query($query);
			while ($I = $rs->fetch_object()) {
                            if ($I->anumber) {
				$results[$I->anumber] = $I->anumber;
                                $idArray[] = $I->anumber;
                            }
			}
		}
		
		//$idArray = $this->_getIdsByNumbers($results, true, $searchRefinement_filtered);

		
		return $idArray;
	}
	
	private function _getIdsByNumbers($numbers, $withAlternatives = true, $refinement = false) {
		if (is_array($numbers) && count($numbers) > 0) {
			$numberList = implode("','", $numbers);
			
			$queryAddAlternatives = '';
			if ($withAlternatives) {
				$queryAddAlternatives = "
					OR
						attribute_17 IN ('" . $numberList . "')
				";
			}
			
			$queryAddRefinement = '';
			if ($refinement) {
				$refinement = $this->db->real_escape_string($refinement);
				$queryAddRefinement = "
					AND (
						name LIKE '%" . $refinement . "%'
					OR
						detail_description LIKE '%" . $refinement . "%'
					OR
						detail_description LIKE '%" . htmlentities($refinement, null, 'UTF-8') . "%'
					OR
						attribute_1 LIKE '%" . $refinement . "%'
					OR
						attribute_9 LIKE '%" . $refinement . "%'
					OR
						attribute_20 LIKE '%" . $refinement . "%'
					OR
						attribute_6 LIKE '%" . $refinement . "%'
					)								
				";
                                $queryAddRefinement = "
					AND (
						name LIKE '%" . $refinement . "%'
					OR
						attribute_1 LIKE '%" . $refinement . "%'
					OR
						attribute_9 LIKE '%" . $refinement . "%'
					OR
						attribute_20 LIKE '%" . $refinement . "%'
					OR
						attribute_6 LIKE '%" . $refinement . "%'
					)								
				";
			}
			
//			$query = "
//				SELECT
//					id
//				FROM
//					items
//				WHERE (
//					number IN ('" . $numberList . "') OR
//					attribute_7 IN ('" . $numberList . "')
//					" . $queryAddAlternatives . "
//				)
//				" . $queryAddRefinement . "
//			";
                        $query = "
				SELECT
					id
				FROM
					items
				WHERE 
					attribute_7 IN ('" . $numberList . "')
			";
			$rs = $this->db->query($query);
//			echo '<pre>';echo $query;exit();
			$idArray = array();
			while ($I = $rs->fetch_object()) {
				$idArray[$I->id] = $I->id;
			}
			
			return $idArray;
		}
		
		return array();
	}
	
	private function _queryLike($searchManufacturer_filtered, $searchString_filtered) {
		$searchManufacturer_filtered = $this->db->real_escape_string($searchManufacturer_filtered);
		$searchString_filtered = $this->db->real_escape_string($searchString_filtered);

		$queries = array();

            if (ctype_alpha($searchString_filtered)) {
                $queries[] = "						
			SELECT 
				id AS anumber
			FROM 
				items 
			WHERE 
				active = 1 
			AND 
				parent_id = 0 
			AND (
				REPLACE(REPLACE(REPLACE(vendor_item_number, ' ', ''), '/', ''), '-', '') = '" . $searchString_filtered . "'
			OR
				REPLACE(REPLACE(REPLACE(name, ' ', ''), '/', ''), '-', '') LIKE '%" . $searchString_filtered . "%'
			OR
				-- mögliche Aufschrift
				REPLACE(REPLACE(REPLACE(attribute_4, ' ', ''), '/', ''), '-', '') LIKE '%" . $searchString_filtered . "%' 
			OR
				-- Aufdrucke
				REPLACE(REPLACE(REPLACE(attribute_9, ' ', ''), '/', ''), '-', '') LIKE '%" . $searchString_filtered . "%' 
			OR
				-- Merkmale
				REPLACE(REPLACE(REPLACE(attribute_8, ' ', ''), '/', ''), '-', '') LIKE '%" . $searchString_filtered . "%' 
			OR
				-- Internes DB-Feld
				REPLACE(REPLACE(REPLACE(attribute_20, ' ', ''), '/', ''), '-', '') LIKE '%" . $searchString_filtered . "%' 
			OR
				-- Synonyme
				REPLACE(REPLACE(REPLACE(attribute_6, ' ', ''), '/', ''), '-', '') LIKE '%" . $searchString_filtered . "%'  
			)
			GROUP BY
				number
                        LIMIT 100
		";
            }
            else {
//			$queries[] = "		
//				SELECT 
//					DISTINCT anr AS anumber
//				FROM 
//					import_geraetezuordnung
//				WHERE
//					REPLACE(REPLACE(REPLACE(nr, ' ', ''), '/', ''), '-', '') LIKE '%" . $searchString_filtered . "%'
//				OR
//					REPLACE(REPLACE(REPLACE(bezeichnung1, ' ', ''), '/', ''), '-', '') LIKE '%" . $searchString_filtered . "%'
//			";
                       
                        $queries[] = "	
                                SELECT 
                                        DISTINCT i.id AS anumber
                                FROM 
					import_geraetezuordnung kg
				LEFT JOIN items i on i.attribute_7=kg.navisionid
				WHERE
					REPLACE(REPLACE(REPLACE(kg.nr, ' ', ''), '/', ''), '-', '') LIKE '%" . $searchString_filtered . "%'
				OR
					REPLACE(REPLACE(REPLACE(kg.bezeichnung1, ' ', ''), '/', ''), '-', '') LIKE '%" . $searchString_filtered . "%'
                                LIMIT 100
			";
                
                        /*$queries[] = "	
                                SELECT 
                                        DISTINCT i.id AS anumber
                                FROM 
					krempl_geraete kg
				LEFT JOIN krempl_artikelgeraet ka on ka.geraet=kg.id
				LEFT JOIN items i on i.krempl_id=ka.ersatzteil
				WHERE
					REPLACE(REPLACE(REPLACE(kg.nr, ' ', ''), '/', ''), '-', '') LIKE '%" . $searchString_filtered . "%'
				OR
					REPLACE(REPLACE(REPLACE(kg.bezeichnung1, ' ', ''), '/', ''), '-', '') LIKE '%" . $searchString_filtered . "%'
			";*/

			$queries[] = "		
				SELECT 
					DISTINCT i.id AS anumber
				FROM 
                                        passendwie_2018 pw
                                LEFT JOIN items i on i.attribute_7=pw.navisionid
				WHERE
					REPLACE(REPLACE(REPLACE(bestellcode, ' ', ''), '/', ''), '-', '') LIKE '%" . $searchString_filtered . "%'
                                LIMIT 100
			";
		
            }
		return $queries;
	}
	
	private function _getItemByNumber($searchString_ready) {
		$query = "		
			SELECT 
				id
			FROM 
				items
			WHERE
				number = '" . $this->db->real_escape_string($searchString_ready) . "' OR
                                ean_code = '" . $this->db->real_escape_string($searchString_ready) . "' OR
                                attribute_7 = '" . $this->db->real_escape_string($searchString_ready) . "'
                        LIMIT 100
		";
		$rs = $this->db->query($query);
		
		$idArray = array();
		if ($rs->num_rows > 0) {
			while ($I = $rs->fetch_object()) {
				$idArray[$I->id] = $I->id;
			}
			return $idArray;
		}
                else {
                    return false;
                }
	}
	
	public function makeHistory() {
		$indexString = $this->searchData['used1'] . $this->searchData['used2'];
		
		$query = "
			INSERT INTO
				search_history (id, string1, string2, used1, used2, results)
			VALUES (
				'" . $this->db->real_escape_string($indexString)  . "',
				'" . $this->db->real_escape_string($this->searchData['string1'])  . "',
				'" . $this->db->real_escape_string($this->searchData['string2'])  . "',
				'" . $this->db->real_escape_string($this->searchData['used1'])  . "',
				'" . $this->db->real_escape_string($this->searchData['used2'])  . "',
				'" . $this->db->real_escape_string($this->searchData['results'])  . "'
			)
			ON DUPLICATE KEY
				UPDATE
					cnt = cnt + 1,
					results = VALUES(results)
		";
		
		$this->db->query($query);
	}
}