
<?php

class BuscadorGeneral extends Conexion1 {
public $mysqli;  public $data;
public function __construct() {$this->mysqli = parent::conectar();$this->data = array();}  
// --------------------------------------------------------------------------------------------------

public function buscador117($busqueda,$idCliente,$marca,$tipo,$idVendedor,$idBodega,$idEmpresa){$respuesta["tipo"]="general";
$busqueda=$this->quitarComas($busqueda); $productos=$this->totalProductos($tipo,$marca,$idBodega,$idEmpresa);

$campos=["descripcion","modelo", "categoria", "marca","codigo"];  $peso=[1,2,4,3,4];
$sepBusqueda=explode(" ",$busqueda);
for($ib=0;$ib<sizeof($sepBusqueda);$ib++){$sepBusqueda12[$ib]=NULL;$conteoLetrasAux=0; $cam[$ib]=NULL;
for($is=0;$is<sizeof($campos);$is++){for($i=0;$i<sizeof($productos);$i++){
$sep=explode(" ",strval($productos[$i][$campos[$is]])); for($p=0;$p<sizeof($sep);$p++){ 
$sim=similar_text($sepBusqueda[$ib],strtolower($sep[$p]),$por); 
$conteoLetras=$this->conteoLetras($sepBusqueda[$ib],strtolower($sep[$p]));
if($por>=35.0 && $conteoLetras>=$conteoLetrasAux){$conteoLetrasAux=$conteoLetras; $sepBusqueda12[$ib][$is]=array('palabra'=>$sep[$p],'campo'=>$campos[$is]) ;}
}}}} $res=array();

for($m=0;$m<sizeof($sepBusqueda12);$m++){ $sepAux=array_values($sepBusqueda12[$m]); if(sizeof($sepAux)==1){
$sepBusqueda12[$m]=$sepAux[0];}else{$porAux=0;for($n=0;$n<sizeof($sepAux);$n++){similar_text($sepBusqueda[$m],strtolower($sepAux[$n]["palabra"]),$por);
if($por==100){$por=$por*8;} if($sepAux[$n]["campo"]=="categoria"){$por=$por*6;} if($sepAux[$n]["campo"]=="codigo"){$por=$por*4;} if($sepAux[$n]["campo"]=="marca"){$por=$por*2;}
if($sepAux[$n]["campo"]=="modelo"){$por=$por*3;} if($sepAux[$n]["campo"]=="descripcion"){$por=$por*1;}
if($por>$porAux){ $sepBusqueda12[$m]=$sepAux[$n]; $porAux=$por;  }}}}


//var_dump(sizeof($productos)); var_dump($productos);

if($this->conteoPalabras($busqueda)==1){ 
if($sepBusqueda12[0]["campo"]=="codigo"){ $respuesta["tipo"]="codigo";
for($i=0;$i<sizeof($productos);$i++){similar_text(strtolower($sepBusqueda12[0]["palabra"]),strtolower($productos[$i][$sepBusqueda12[0]["campo"]]),$por);  if($por>70 ||($productos[$i][$sepBusqueda12[0]["campo"]]==$sepBusqueda12[0]["palabra"]) || (stripos($productos[$i][$sepBusqueda12[0]["campo"]], $sepBusqueda12[0]["palabra"]) !== false)){$res[]=$productos[$i];}  }    
}else{
for($i=0;$i<sizeof($productos);$i++){if($productos[$i][$sepBusqueda12[0]["campo"]] == $sepBusqueda12[0]["palabra"] || stripos($productos[$i][$sepBusqueda12[0]["campo"]], $sepBusqueda12[0]["palabra"]) !== false){ $res[]=$productos[$i]; }}
}

//var_dump($sepBusqueda12);
//for($i=0;$i<sizeof($productos);$i++){if($productos[$i][$sepBusqueda12[0]["campo"]] == $sepBusqueda12[0]["palabra"] || stripos($productos[$i][$sepBusqueda12[0]["campo"]], $sepBusqueda12[0]["palabra"]) !== false){ $res[]=$productos[$i]; }}
//if($sepBusqueda12[0]["campo"]=="codigo"){if(sizeof($res)>3){$res=auxQuitarAdic($res,$sepBusqueda12[0]["palabra"]);}}
}else{ $separacion=[array(),array(),array(),array(),array()];
foreach ($sepBusqueda12 as $elemento) { $campo = $elemento["campo"]; $palabra = $elemento["palabra"];
if($campo === "categoria") {$separacion[2][] = $palabra;} if($campo === "modelo") {$separacion[1][] = $palabra;}
if($campo === "descripcion"){$separacion[0][]=$palabra;} if($campo === "marca"){$separacion[3][]=$palabra;}
if($campo === "codigo"){$separacion[4][]=$palabra;}} 
for($i=0;$i<sizeof($productos);$i++){ $conteo=0; for($j=0;$j<sizeof($sepBusqueda12);$j++){
if(stripos(strval($productos[$i][$sepBusqueda12[$j]["campo"]]), strval($sepBusqueda12[$j]["palabra"])) !== false || $sepBusqueda12[$j]["palabra"]==$productos[$i][$sepBusqueda12[$j]["campo"]]){$conteo++;}}
if($conteo!=0){$res[]=$productos[$i];}} $resAux=array();
$union=[$this->combinaciones(trim(implode(" ",$separacion[0]))),$this->combinaciones(trim(implode(" ",$separacion[1]))),$this->combinaciones(trim(implode(" ",$separacion[2]))),$this->combinaciones(trim(implode(" ",$separacion[3]))),$this->combinaciones(trim(implode(" ",$separacion[4])))];
$resAux=$this->auxLista($res,$union,$campos,"normal");
if(sizeof($union[4])!=0 && (sizeof($resAux)>25 || sizeof($resAux)==0)){$resAux=$this->auxLista($res,$union,$campos,"particular"); }
if(sizeof($resAux)!=0){$res=$resAux;}else{$resAux=$this->auxLista22($res,$union,$campos);
if(sizeof($resAux)!=0){$res=$resAux;}else{ $resAux=$this->auxLista33($res,$union,$campos); if(sizeof($resAux)!=0){$res=$resAux;}}}  
}
//var_dump(sizeof($res));  var_dump($res);
if(sizeof($res)==0){return NULL;}else{$respuesta["lista"]=$res; $respuesta["palabraCorregida"]=strtolower($res[0]["categoria"])." ".$res[0]["marca"]; return $respuesta;  }   
}

public function auxLista33($res,$union,$campos){$resAux11=array();
for($i=0;$i<sizeof($res);$i++){
if($this->formarIF($union[1],$this->quitarGuion($res[$i][$campos[1]]))||
$this->formarIF($union[2],$res[$i][$campos[2]]) || $this->formarIF($union[3],$res[$i][$campos[3]]) ||(
$this->formarIF($union[4],$res[$i][$campos[4]])||$this->formarIF($union[0],$res[$i][$campos[0]]))){$resAux11[]=$res[$i];}}
return $resAux11;}

public function auxLista22($res,$union,$campos){$resAux11=array();
for($i=0;$i<sizeof($res);$i++){
if((($this->formarIF($union[1],$this->quitarGuion($res[$i][$campos[1]]))&&$this->formarIF($union[2],$res[$i][$campos[2]])) ||
($this->formarIF($union[3],$res[$i][$campos[3]])&&$this->formarIF($union[2],$res[$i][$campos[2]])))
&&($this->formarIF($union[4],$res[$i][$campos[4]])||$this->formarIF($union[0],$res[$i][$campos[0]]))){$resAux11[]=$res[$i]; }}
return $resAux11;}
 
public function auxLista($res,$union,$campos,$control){$resAux11=array();
for($i=0;$i<sizeof($res);$i++){
if($control=="normal"){
if($this->formarIF($union[0],$res[$i][$campos[0]])&& $this->formarIF($union[1],$this->quitarGuion($res[$i][$campos[1]]))&&
$this->formarIF($union[2],$res[$i][$campos[2]]) && $this->formarIF($union[3],$res[$i][$campos[3]]) &&
$this->formarIF($union[4],$res[$i][$campos[4]])){$resAux11[]=$res[$i];}
}else{
if($this->formarIF($union[1],$this->quitarGuion($res[$i][$campos[1]]))&&
$this->formarIF($union[2],$res[$i][$campos[2]]) && $this->formarIF($union[3],$res[$i][$campos[3]]) &&(
$this->formarIF($union[4],$res[$i][$campos[4]])||$this->formarIF($union[0],$res[$i][$campos[0]]))){$resAux11[]=$res[$i];}}}
return $resAux11;}

public function quitarGuion($palabra){return str_replace('-', '', $palabra);}

public function formarIF($union, $valor) {
if(sizeof($union)>0){
$res = false;
for($i = 0; $i <sizeof($union); $i++) {
if($this->conteoPalabras($union[$i])>1 && sizeof($union)>2){
$res = $res || (stripos($valor, $union[$i]) !== false || $valor == $union[$i] || $this->contienenMismasPalabras($valor, $union[$i]));
}else{
if(sizeof($union)<=2){
$res = $res || (stripos($valor, $union[$i]) !== false || $valor == $union[$i]);}
}
}
return $res;}else{
return true;
}
}

public function contienenMismasPalabras($cadena1, $cadena2) {
$palabras1 = explode(" ", $cadena1); $palabras2 = explode(" ", $cadena2);
$palabras1 = array_map('strtolower', $palabras1);$palabras2 = array_map('strtolower', $palabras2);
return count(array_diff($palabras2, $palabras1)) == 0;}



function auxQuitarAdic($lista,$codigo){ $codigoAux=quitarLinea($codigo); $respuesta=array();
for($i=0;$i<sizeof($lista);$i++){ if(quitarLinea($lista[$i]["codigo"])==$codigoAux){$respuesta[]=$lista[$i];}} 
return $respuesta;}

function quitarLineaCero($valor){ $a=explode("-",$valor); return $a[0];}

function quitarLinea($valor) { if(strpos($valor, "-") !== false) {if(strlen(explode("-", $valor)[0]) <= 6){return $valor;
}else{$valorAux = substr($valor, -3); 
if(strpos($valorAux, "-") !== false){return explode("-", $valor)[0]; }return $valor;}}else{return $valor;}}



function eliminarDuplicadosPorId($matriz) { $matrizUnica = array(); $idsVistos = array();
foreach($matriz as $elemento) {$id = $elemento['id'];if(!in_array($id, $idsVistos)){$idsVistos[] = $id; $matrizUnica[] = $elemento;
}} return $matrizUnica;}

function muestreo($palabras, $tam, $combinaciones = array()) {
if(empty($combinaciones)){$combinaciones = $palabras;} if($tam == 1){return $combinaciones;} $nuevaCombinacion = array();
foreach($combinaciones as $combinacion){foreach($palabras as $palabra){
if(!in_array($palabra, explode(' ', $combinacion))){$nuevaCombinacion[] = $combinacion . ' ' . $palabra;}}}
return $this->muestreo($palabras, $tam - 1, $nuevaCombinacion);}

function combinaciones($rep){ $palab11=explode(" ",$rep); $palab12=$palab11;  
for($i=0;$i<sizeof($palab11);$i++){if(strlen($palab11[$i])<=2){unset($palab12[$i]);}} $palab=array_values($palab12);
$resultado=[]; for($i=1;$i<=count($palab);$i++){$resultado = array_merge($resultado,$this->muestreo($palab, $i));} return $resultado;}


public function mostrar($lista){
for($i=0;$i<sizeof($lista);$i++){
echo $lista[$i]["id"].":::::". $lista[$i]["descripcion"].":::::".$lista[$i]["modelo"].":::".$lista[$i]["categoria"].":::".$lista[$i]["codigo"]."::::";
echo "<br>";
}    
}

public function quitarComas($busqueda){
$conv = array('-'=>'','Š'=>'S', 'š'=>'s', 'Ž'=>'Z', 'ž'=>'z', 'À'=>'A', 'Á'=>'A', 'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A', 'Å'=>'A', 'Æ'=>'A', 'Ç'=>'C', 'È'=>'E', 'É'=>'E','Ê'=>'E', 'Ë'=>'E', 'Ì'=>'I', 'Í'=>'I', 'Î'=>'I', 'Ï'=>'I', 'Ñ'=>'N', 'Ò'=>'O', 'Ó'=>'O', 'Ô'=>'O', 'Õ'=>'O', 'Ö'=>'O', 'Ø'=>'O', 'Ù'=>'U','Ú'=>'U', 'Û'=>'U', 'Ü'=>'U', 'Ý'=>'Y', 'Þ'=>'B', 'ß'=>'Ss', 'à'=>'a', 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'ä'=>'a', 'å'=>'a', 'æ'=>'a', 'ç'=>'c','è'=>'e', 'é'=>'e', 'ê'=>'e', 'ë'=>'e', 'ì'=>'i', 'í'=>'i', 'î'=>'i', 'ï'=>'i', 'ð'=>'o', 'ñ'=>'n', 'ò'=>'o', 'ó'=>'o', 'ô'=>'o', 'õ'=>'o','ö'=>'o', 'ø'=>'o', 'ù'=>'u', 'ú'=>'u', 'û'=>'u', 'ý'=>'y', 'þ'=>'b', 'ÿ'=>'y' );
$busqueda=strtr($busqueda,$conv); return trim(strtolower($busqueda)); }

public function conteoLetras($letras,$texto){ if($texto!=$letras){
$cont=0; for($i=0;$i<strlen($letras);$i++){$letra=$letras[$i];$contador = 0;
for($x=0;$x<strlen($texto);$x++){$actual=$texto[$x];if($actual ===$letra){$contador++;}}if($contador>0){$cont++;}}
if($cont>1){if(strlen($letras)>=2){
$uno=stristr($texto, substr($letras,0,2));if(strlen($uno)>=2){$cont=$cont+4;}
if($this->compaLetra($letras,$texto,0,2,0,2)){$cont=$cont+8;}
if(strlen($letras)>=3){
if($this->compaLetra($letras,$texto,0,2,1,2)){$cont=$cont+4;} if($this->compaLetra($letras,$texto,0,3,0,3)){$cont=$cont+4;}
if($this->compaLetra2($letras,$texto,-2)){$cont=$cont+6;}}
if(strlen($letras)>=4){
if($this->compaLetra($letras,$texto,0,3,1,3)){$cont=$cont+4;} if($this->compaLetra($letras,$texto,0,4,0,4)){$cont=$cont+64;}
if($this->compaLetra2($letras,$texto,-3)){$cont=$cont+4;}}
if(strlen($letras)>=5){
if($this->compaLetra($letras,$texto,0,4,1,4)){$cont=$cont+4;} if($this->compaLetra($letras,$texto,0,5,0,5)){$cont=$cont+32;} }
if(strlen($letras)>=6){
if($this->compaLetra($letras,$texto,0,5,1,5)){$cont=$cont+4;} if($this->compaLetra($letras,$texto,0,6,0,6)){$cont=$cont+32;}}
if(strlen($letras)>=7){
if($this->compaLetra($letras,$texto,0,6,1,6)){$cont=$cont+4;} if($this->compaLetra($letras,$texto,0,7,0,7)){$cont=$cont+32;}} }
return $cont;
}else{return 0;}}else{return 256;}}

public function compaLetra($letra,$texto,$uno,$dos,$tres,$cuatro){
$u1=substr($letra,$uno,$dos); $r1=substr($texto,$tres,$cuatro);if($u1==$r1){$res=1;}else {$res=0;} return $res;}

public function compaLetra2($letra,$texto,$uno){
$u1=substr($letra,$uno); $r1=substr($texto,$uno);if($u1==$r1){$res=1;}else {$res=0;} return $res;}

public function conteoPalabras($palabra){$sep=explode(" ",$palabra); return sizeof($sep);}

public function matrisUnica($matrix) { $matrixAux = $matrix; foreach($matrix as $key => $subMatrix){unset($matrixAux[$key]);
foreach($matrixAux as $subMatrixAux) {if($subMatrix === $subMatrixAux) {unset($matrix[$key]);}}} return $matrix; }

// -------------------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------------------

public function todosProductosAdmin($idBodega){
$cc7=new Consulta(); $ccAux=$cc7->arregloConsultaProducto($idBodega);
$cc6=$ccAux["general"].$ccAux["adicional"]." ORDER BY categoria ASC;";
$azz=$this->mysqli->query($cc6);  while($f=$azz->fetch_assoc()){$res[]=$f;} return $res; }


public function totalProductos($tipo,$marca,$idBodega,$idEmpresa){
$cc7=new Consulta(); $baseGeneral=$cc7->arregloConsultaProducto($idBodega); $estado=" productos.candado = '1')"; 
if($tipo=="admi"){$consulta=$baseGeneral["general"]."WHERE id_empresa='$idEmpresa' ".$baseGeneral["adicional"];}else{
if($marca!="vacio"){$consulta=$baseGeneral["general"]." WHERE id_empresa='$idEmpresa' AND ".$estado." AND ".$this->obtenerMarcaOnly($marca).$baseGeneral["adicional"].";";}else{$consulta=$baseGeneral["general"]." WHERE id_empresa='$idEmpresa' AND ".$estado.$baseGeneral["adicional"].";";} }
$b=$this->mysqli->query($consulta); if($b->num_rows!=0){while($fila=$b->fetch_assoc()){$bB[]=$fila;} return $bB;}return NULL;}


// public function totalProductos($tipo,$marca){
// $a1="SELECT DISTINCT productos.*, JSON_UNQUOTE(JSON_EXTRACT(productos.datos_productos, '$.descripcion')) as descripcion,";
// $a2="IFNULL(categorias.categoria, 'DISPONIBLE') as categoria, marca.marca, marca.imagen, ";
// $a3="IFNULL(modelos.modelo, 'DISPONIBLE') as modelo FROM productos "; 
// $a4="LEFT JOIN categorias ON JSON_UNQUOTE(JSON_EXTRACT(productos.datos_productos, '$.id_categoria')) = categorias.id_categoria ";
// $a5="LEFT JOIN modelos ON JSON_UNQUOTE(JSON_EXTRACT(productos.datos_productos, '$.id_modelo')) = modelos.id_modelo ";
// $a6="LEFT JOIN marca ON JSON_UNQUOTE(JSON_EXTRACT(productos.datos_productos, '$.id_marca')) = marca.id_marca ";
// $estado=" (JSON_UNQUOTE(JSON_EXTRACT(productos.estado, '$.candado')) = '1')"; 
// $baseGeneral=$a1.$a2.$a3.$a4.$a5.$a6; if($tipo=="admi"){$consulta=$baseGeneral;}else{
// if($marca!="vacio"){$consulta=$baseGeneral." WHERE ".$estado." ".$this->obtenerMarcaOnly($marca).";";}else{$consulta=$baseGeneral." WHERE ".$estado.";";} }
// $b=$this->mysqli->query($consulta); if($b->num_rows!=0){while($fila=$b->fetch_assoc()){$bB[]=$fila;} return $bB;}return NULL;}

public function obtenerMarcaOnly($marca){ $m=json_decode($marca,true);  $r=" AND (";
for($i=0;$i<sizeof($m);$i++){ $r.="productos.id_marca=".$m[$i]." AND ";  } 
$r=substr($r,0,(strlen($r)-4)).") "; return $r; }

public function dado($json,$idCliente){ return $this->productosGeneAccion(json_decode($json,true),$idCliente); }

public function productosGeneAccion($res,$idCliente){
$ca=$this->mysqli->query("SELECT id_producto, id_usuario, cantidad, id_carrito FROM carrito WHERE id_usuario='$idCliente' AND estado='general';");    
$car1=NULL; if($ca->num_rows!=0){while($f=$ca->fetch_assoc()){$car1[]=$f;}}
$s1=$this->mysqli->query("SELECT perfil, tipo_cliente, favoritos FROM usuarios WHERE id_usuario='$idCliente';")->fetch_assoc();
if(isset($s1["tipo_cliente"])){$tipoCliente=$s1["tipo_cliente"]; }else{$s1["tipo_cliente"]="minoritario"; $tipoCliente="minoritario";}
for($i=0;$i<sizeof($res);$i++){  $palta=new Consulta(); 
$res[$i]["tipoCliente"]=$s1["tipo_cliente"]; if(!isset($s1["perfil"])){$res[$i]["perfil"]="Cliente";}else{ $res[$i]["perfil"]=$s1["perfil"];}
$auxPrGene=$palta->obtenerPrecioGeneral(json_decode($res[$i]["precios"],true),json_decode($res[$i]["precios_promocion"],true),strval($res[$i]["estado_promocion"]),$tipoCliente);
$res[$i]["pPar"]=$auxPrGene["precio"]; $res[$i]["estado_promocion"]=$auxPrGene["estadoPromocion"];
$res[$i]["carritoInterno"]="no"; $res[$i]["cantidadInterno"]=0; $res[$i]["idCarrito"]=0; $res[$i]["gustaUsuario"]="no";
if(!isset($s1["favoritos"])){$s1["favoritos"]="";}
if($s1["favoritos"]!="[]" && $s1["favoritos"]!="" && $s1["favoritos"]!="null"){$sF1=json_decode($s1["favoritos"],true); 
for($k=0;$k<sizeof($sF1);$k++){if($sF1[$k]["id"]==$res[$i]["id"]){$res[$i]["gustaUsuario"]="si";}}}
if($car1!=NULL){$tam_car1=sizeof($car1);for($ij=0; $ij <$tam_car1 ; $ij++){if($car1[$ij]["id_producto"]==$res[$i]["id"]){
$res[$i]["carritoInterno"]="si"; $res[$i]["cantidadInterno"]=$car1[$ij]["cantidad"]; $res[$i]["idCarrito"]=$car1[$ij]["id_carrito"]; }}}} return $res; }

//public function obtenerPrecioGeneral($po,$pP,$eP,$tC){
//if($eP=="0"){if($tC=="empresarial" || $tC=="master"){$pr=$po[3];}else{if($tC=="mayoritario" || $tC=="puntoventa" || $tC=="vendedor"){$pr=$po[2];}else{$pr=$po[1];}}}else{
//if($tC=="empresarial" || $tC=="master"){ if($pP[2]==0){$pr=$po[3]; $eP="0"; }else{$pr=$pP[2];}  }else{
//if($tC=="mayoritario" || $tC=="puntoventa" || $tC=="vendedor"){ if($pP[1]==0){$pr=$po[2]; $eP="0";}else{$pr=$pP[1];}  }else{
//if($pP[0]==0){$pr=$po[1]; $eP="0";}else{$pr=$pP[0];}}}} $respuesta["precio"]=$pr; $respuesta["estadoPromocion"]=$eP; return $respuesta;}


// --------------------------------------------------------------------------------------------------
// --------------------------------------------------------------------------------------------------
// --------------------------------------------------------------------------------------------------
// --------------------------------------------------------------------------------------------------
// --------------------------------------------------------------------------------------------------
// --------------------------------------------------------------------------------------------------


}
?>
