<?php
require 'defs.php';
require 'conn.php';
require 'doQuery.php';
if(PHP_SAPI != 'cli') require 'accesscheck.php';


function firstWord($str){
	return preg_split('/[^\w]/',$str, 2)[0];
}
function lastword($str){
	return preg_split('/\s+(?=\S+$)/', $str)[1];
}

function in_str($needle,$haystack,$case=false){
	if($case) return !(strpos($haystack,$needle)===false);
	else return !(stripos($haystack,$needle)===false);
}


function sanitizeData($data, $preserve_tags=false){
	global $LINK;
	if(is_array($data)){
		foreach($data as $key=>$item){
			if(is_array($item)){
				$new_array[$key]=sanitizeData($item);
			} else {
				//$item = $preserve_tags ? trim($item) : strip_tags(trim($item));
				$item = trim($item);
				//$new_array[$key]=mysqli_real_escape_string($LINK, $item);
				$new_array[$key]=mysqli_real_escape_string($LINK, $item);
			}
		}
		return isset($new_array) ? $new_array : array();
	} else {
		//$data = $preserve_tags ? trim($data) : strip_tags(trim($data));
		$data = trim($data);
		return mysqli_real_escape_string($LINK, $data);
	}

}//////////////////////////////////////////////////////end of sanitizeData////////////////////////////////////////

function isEmptyArray($val){
	if(empty($val)){
		return true;
	}else{//there's such an array defined
	if(!is_array($val)) return null;	
	
	foreach($val as $v){
		if(is_array($v)){
			return isEmptyArray($v);
		}else{
			if(strlen($v)) return false;
		}
	}
	return true;
	}
}

function getPrimaryKeyFlds($tbl){
	$q = doPDOQ("SHOW KEYS FROM {$tbl} WHERE key_name = 'PRIMARY'");
	return array_column($q, 'Column_name');
}


function doPDOEntryQuery($table, $arr, $entry_action='insert', $suffix="", $return_error=false, $ignore=''){//what is this suffix?

	
	if(isEmptyArray($arr)) return null;
	$col_arr = array_keys($arr);
	$field_arr = array_values($arr);
	// preprint($arr);
	$sql = $entry_action == "update" ? "UPDATE ".$table." SET ": "INSERT INTO ".$table." SET ";
	
	$xcludes = [];
	for($i=0;$i<count($arr);$i++){
		
		if($entry_action == 'insert'){
			if($i==0){//PK
				if(strtoupper($field_arr[$i]) == 'NULL' || !strlen($field_arr[$i])){
					$fld_val = 'NULL';
					array_push( $xcludes, $col_arr[$i] );
				}else{
					$fld_val = ':'.$col_arr[$i];
					
				} 
				// $fld_val = (strtoupper($field_arr[$i]) == 'NULL' || !strval($field_arr[$i])) ? 'NULL' : ':'.$col_arr[$i];
			}else{
				// echo '<BR>'.$col_arr[$i].': '.$field_arr[$i];
				if(strtoupper($field_arr[$i]) == 'NULL' || !strlen($field_arr[$i])){
					// var_dump($field_arr[$i]);

					$fld_val = 'DEFAULT('.$col_arr[$i].')';
					array_push( $xcludes, $col_arr[$i] );
				}else{
					$fld_val = ':'.$col_arr[$i];

				}						
				// $fld_val = (strtoupper($field_arr[$i]) == 'NULL') ? 'DEFAULT('.$col_arr[$i].')' : ':'.$col_arr[$i];
			}	
			
		}else{//UPDATE
			if(strtoupper($field_arr[$i]) == 'NULL' || !strlen($field_arr[$i])){
				$fld_val = 'DEFAULT('.$col_arr[$i].')';			
				array_push( $xcludes, $col_arr[$i] );
				
			}else{
				
				$fld_val = ':'.$col_arr[$i];			
			}
		}
		$sql .=  $col_arr[$i].' = '.$fld_val;

		
		$sql.=$i < (count($arr)-1) ? ', ' : '';	
	}
	$sql.=" ".$suffix;

	
	// echo PHP_EOL.$sql;
	// preprint($xcludes);
	// var_dump($arr);
	$arr = array_diff_key($arr, array_flip($xcludes));
	// EXIT;
	// unset($arr['bundled_service_id']);
	$q = doPDOQ($sql, $arr);
	
	return $q;
}


function doEntryQuery($table, $col_arr, $field_arr, $entry_action='insert', $suffix="", $return_error=false, $ignore=''){//what is this suffix?
	
	if(empty($field_arr)) return null;
	
	if(strtolower($entry_action)=='insert'){
		$col_str=implode(',',$col_arr);
		$sql="INSERT ".$ignore." INTO ".$table." (".$col_str.") VALUES (";
		
		for($i=0;$i<count($field_arr);$i++){
			
			//$sql .= strtoupper($field_arr[$i]) == 'NULL' ? 'DEFAULT('.$col_arr[$i].')' : $field_arr[$i];
			if($i==0){
				$sql .= (strtoupper($field_arr[$i]) == 'NULL' || !strval($field_arr[$i])) ? 'NULL' : $field_arr[$i];
			}else{
				$sql .= (strtoupper($field_arr[$i]) == 'NULL') ? 'DEFAULT('.$col_arr[$i].')' : $field_arr[$i];
			}
			$sql .= $i < (count($field_arr)-1) ? ", " : '';	
		}

		$sql.=")";
	} elseif(strtolower($entry_action)=='update') {//update query
		$arr=array_combine($col_arr,$field_arr);
		// preprint($arr);
		
		
		$sql="UPDATE ".$table." SET ";
		
		for($i=0;$i<count($arr);$i++){
			//$sql.=$col_arr[$i]." = ".$field_arr[$i];
			$sql .= strtoupper($field_arr[$i]) == 'NULL' ? $col_arr[$i].' = DEFAULT('.$col_arr[$i].')' : $col_arr[$i].' = '.$field_arr[$i];			
			$sql.=$i < (count($arr)-1) ? ',' : '';	
		}
		$sql.=" ".$suffix;
	}
	

	$q = doQuery($sql, $return_error);
	return $q;
	
}

function doSqlInDate($inputdate){
	if(is_array($inputdate)){
		$d = sprintf('%04d-%02d-%02d',$inputdate['Y'],$inputdate['m'],$inputdate['d']);
		return date('Y-m-d',strtotime($d));
	} else {
		return date('Y-m-d',strtotime($inputdate));
	}
}

function doSqlInTime($arrTime){
	if(!empty($arrTime[0]) && !empty($arrTime[1])){
		return implode(':',$arrTime);
	} elseif (!empty($arrTime[0]) && empty($arrTime[1])){
		return $arrTime[0].':00';
	} else {
		return NULL;	
	}
}

function doSqlInString($data_arr, $defaults=false){
	//preprint($data_arr);
	$field_arr = [];
	foreach ($data_arr as $type=>$pair){
		if(is_array($pair)){
			foreach($pair as $col=>$field){
				if(strlen(strval($field)) < 1){
					$field_arr[$col]=$defaults ? 'DEFAULT('.$col.')' : 'NULL';
					
				} else {
					switch ($type){
						case 'date': $field_arr[$col]="'".doSqlInDate($field)."'"; break;	
						case 'time': $field_arr[$col]="'".doSqlInTime($field)."'"; break;	
						case 'str':  $field_arr[$col]="'".$field."'"; break;
						case 'int': $field_arr[$col]=intval($field); break;	
					}
				}
			}
		} else {//not an array
			if(strlen(strval($field)) < 1){
				$field_arr[]='DEFAULT('.$col.')';
			} else {	
				if($type=='str'){
					$field_arr[]="'".$field."'";
				} elseif($type=='int'){
					$field_arr[]=$field;
				}//expansion point with further elseifs
			}
		}
	}
	return $field_arr;
}

function arr2qstr($arr) {
	$toImplode = array();
	
	foreach ($arr as $key => $value) {
		if(is_array($value)){
			//do something recursive
		}else{
			$toImplode[] = $key.'='.rawurlencode($value);
		}
	}
	return implode('&', $toImplode);
}

function doDirectFormSelect($field_name, $opt_list=array(), $selected, $xattr='', $disabled_options=[]){ 
	$xa='';
	if(is_array($xattr)){
		if(isset($xattr['xattr'])){
			$xa = $xattr['xattr'];
			unset($xattr['xattr']);
		}
	}else{
		$xa = $xattr;
	}
	
	if( is_array($xattr) && array_key_exists('xclass',$xattr) ){		
		$xclass = ' '.$xattr['xclass']; unset($xattr['xclass']);
	}else{
		$xclass = '';
	}

		//preprint($opt_list);
?><select
	name="<?php echo $field_name.((stripos($xa, 'multiple')!==false) ? '[]' : '')?>" 
	id="<?php echo preg_replace('/(.*)\[(.*)\]/','$1_$2',$field_name)?>"
	class="<?php echo preg_replace('/(.*)\[(.*)\]/','$1_class',$field_name)?><?=$xclass?>" <?php echo $xa?> >
	
		<?php 
		if(is_array($xattr)){
			foreach($xattr as $attrk=>$attrv){
				?>
				<option value="<?php echo $attrk?>"><?php echo $attrv?></option>
				<?php
			}
		}
		if(is_array($opt_list)){
			//preprint($opt_list);
			foreach($opt_list as $key=>$val) {
				if(isset($val[1])) $role = $val[1];
				if(is_array($val)) $val = $val[0];
				
				if(in_str(',', $selected)){//for multiple
					$sel = in_array($key, explode(',', $selected));
				}else{
					$sel = strcasecmp($key,$selected)==0;
				}
				?>
				<option value="<?php echo $key?>" <?=(empty($role) ? '' : 'role="'.$role.'"')?> 
					<?php if($sel){ echo "selected='selected'"; }?>
						<?php
						foreach($disabled_options as $do){
							if(strlen($val)>0 && strcasecmp($val, $do)==0) echo " disabled "; 
						}
						?>

				><?php echo $val?></option>
		<?php } 
		}?>
	</select><?php }////////////////end of doDirectFormSelect////////////////////////////////////////

