<?php
include(dirname(__FILE__) . "/lib/common_include.php");
//パラメータの整形
//パラメータは
//db_id
//table_id
//column_id[]
//column_name[]
//type[]
//css_string[]
//pk[]
//auto_num[]
//prefix[]
//suffix[]
//length[]
//pad[]
//options[]
//unique_id[]
//unique_col_id[][]
//unique_col[][]
//として入ってくるので、これを変形する。
//column毎のデータに変換するので、列定義は
//[
//	"id"=>column_id[i],
//	"tableId"=>table_id,
//	"name"=>column_name[i],
//	"type"=>type[i],
//	"pk"=>pk[i],
//	"order"=>i,
//	"css"=>css_string[i],
//	"options" => options[i],
//]
//の形にする。
//尚、1件も列が無い場合は、入力不正として良い。
//またauto_numについては、1件しか有効な情報は存在しないハズである。
//auto_num = true/flase
//[
//	"prefix":prefix[i],
//	"suffix":suffix[i],
//	"length":length[i],
//	"zeroPad":pad[i],
//]
//の形に変換する。
//ユニークについては、
//[
//	"id"=>unique_id[i],
//	"Table"=>table_id,
//	"cols"=>[
//		"id"=>unique_col_id[i][j],
//		"uId"=>unique_id[i],
//		"col"=>unique_col[i][j],
//	],
//]
//のように変換する。
//これらをサーバ内のデータと比較し、更新/削除/追加の処理を行う。


function main(){
	//基本パラメータのチェック
	$id = null;
	$tid = null;

	if( array_key_exists('db_id' , $_POST ) ){
		$id = $_POST['db_id'];
		if( !is_string($id) ){
			errLog('Post["db_id"] is not string');
			return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
		}
	}else{
		errLog('Post["db_id"] is not Found');
		return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
	}
	if( array_key_exists('table_id' , $_POST ) ){
		$tid = $_POST['table_id'];
		if( !is_string($tid) ){
			errLog('Post["table_id"] is not string');
			return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
		}
	}else{
		errLog('Post["table_id"] is not Found');
		return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
	}

	//列定義パラメータのチェック
	$aryIds =[];
	$aryNames =[];
	$aryTypes =[];
	$aryPks =[];
	$aryCsss =[];
	$aryOtions =[];

	if( array_key_exists('column_id' , $_POST ) ){
		$aryIds = $_POST[ 'column_id' ];
		if( !is_array($aryIds) ){
			errLog('Post["column_id"] is not array');
			return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
		}
	}
	if( array_key_exists('column_name' , $_POST ) ){
		$aryNames = $_POST[ 'column_name' ];
		if( !is_array($aryIds) ){
			errLog('Post["column_name"] is not array');
			return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
		}
	}
	if( array_key_exists('type' , $_POST ) ){
		$aryTypes = $_POST[ 'type' ];
		if( !is_array($aryIds) ){
			errLog('Post["type"] is not array');
			return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
		}
	}
	if( array_key_exists('pk' , $_POST ) ){
		$aryPks = $_POST[ 'pk' ];
		if( !is_array($aryIds) ){
			errLog('Post["pk"] is not array');
			return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
		}
	}
	if( array_key_exists('css_string' , $_POST ) ){
		$aryCsss = $_POST[ 'css_string' ];
		if( !is_array($aryIds) ){
			errLog('Post["css_string"] is not array');
			return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
		}
	}
	if( array_key_exists('options' , $_POST ) ){
		$aryOtions = $_POST[ 'options' ];
		if( !is_array($aryIds) ){
			errLog('Post["options"] is not array');
			return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
		}
	}

	$params = [];
	foreach( $aryIds as $idx => $cid ){
		if( !is_string($cid) && $cid !== null ){
			errLog('Post["column_id"]['.$idx.'] is not string');
			return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
		};
		if( $cid == '' ){
			$cid = null;
		}
		$params[ $idx ] = [
			'id' => $cid ,
			"tableId"=>$tid,
			"name"=>'',
			"type"=>null,
			"pk"=>0,
			'order'=>$idx,
			"css"=>'',
			"options" => '',
		];
	}
	foreach( $aryNames as $idx => $name ){
		if( !is_string($name) && $name !== null ){
			errLog('Post["column_name"]['.$idx.'] is not string');
			return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
		};
		if( mb_ereg("[\[\]\'\"]", $name) || $name == 'rowid'){ 
			errLog('Post["column_name"]['.$idx.'] is ILLEGAL'."\t".'colName:'.$name);
			return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
		};
		if( $name == null ){
			$name = '';
		}
		if( ! array_key_exists( $idx , $params) ){
			$params[ $idx ] = [
				'id' => null ,
				"tableId"=>$tid,
				"name"=>'',
				"type"=>null,
				"pk"=>0,
				'order'=>$idx,
				"css"=>'',
				"options" => '',
			];
		}
		$params[ $idx ]['name'] = $name;
	}
	foreach( $aryTypes as $idx => $type ){
		if( !is_numeric($type) ){
			errLog('Post["type"]['.$idx.'] is not numeric');
			return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
		};
		$type = intval( $type );
		if( ! array_key_exists( $idx , $params) ){
			$params[ $idx ] = [
				'id' => null ,
				"tableId"=>$tid,
				"name"=>'',
				"type"=>null,
				"pk"=>0,
				'order'=>$idx,
				"css"=>'',
				"options" => '',
			];
		}
		$params[ $idx ]['type'] = $type;
	}
	$pkCount = 0;
	foreach( $aryPks as $idx => $pk ){
		if( !is_string($pk) && $pk !== null ){
			errLog('Post["pk"]['.$idx.'] is not string');
			return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
		};
		$pk = ( $pk == 'true' ? 1 : 0 );
		$pkCount += $pk;
		if( ! array_key_exists( $idx , $params) ){
			$params[ $idx ] = [
				'id' => null ,
				"tableId"=>$tid,
				"name"=>'',
				"type"=>null,
				"pk"=>0,
				'order'=>$idx,
				"css"=>'',
				"options" => '',
			];
		}
		$params[ $idx ]['pk'] = $pk;
	}
	foreach( $aryCsss as $idx => $css ){
		if( !is_string($css) && $css !== null ){
			errLog('Post["css_string"]['.$idx.'] is not string');
			return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
		};
		if( $css == null ){
			$css = '';
		}
		if( ! array_key_exists( $idx , $params) ){
			$params[ $idx ] = [
				'id' => null ,
				"tableId"=>$tid,
				"name"=>'',
				"type"=>null,
				"pk"=>0,
				'order'=>$idx,
				"css"=>'',
				"options" => '',
			];
		}
		$params[ $idx ]['css'] = $css;
	}
	foreach( $aryOtions as $idx => $options ){
		if( !is_string($options) && $options !== null ){
			errLog('Post["options"]['.$idx.'] is not string');
			return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
		};
		if( $options == null ){
			$options = '';
		}
		if( ! array_key_exists( $idx , $params) ){
			$params[ $idx ] = [
				'id' => null ,
				"tableId"=>$tid,
				"name"=>'',
				"type"=>null,
				"pk"=>0,
				'order'=>$idx,
				"css"=>'',
				"options" => '',
			];
		}
		$params[ $idx ]['options'] = $options;
	}

	if( count( $params ) == 0 ){
		errLog('column is not exist');
		return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
	}

	//オートナンバーパラメータのチェック
	
	$aryAutoNum =[];
	$aryPrefix =[];
	$arySuffix =[];
	$aryLength =[];
	$aryZeroPad =[];

	$useAN = false;
	$autoNumIdx = -1;

	if( array_key_exists('auto_num' , $_POST ) ){
		$aryAutoNum = $_POST[ 'auto_num' ];
		if( !is_array($aryAutoNum) ){
			errLog('Post["auto_num"] is not array');
			return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
		}

		foreach( $aryAutoNum as $idx => $autoNum ){
			if( !is_string($autoNum) && $autoNum !== null ){
				errLog('Post["auto_num"]['.$idx.'] is not string');
				return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
			};
			if( $autoNum == 'true' ){
				if( $useAN ){
					errLog('Post["auto_num"]['.$idx.'] cannot multi setting');
					return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
				}
				$useAN = true;
				$autoNumIdx = $idx;
			};
		}

	}
	if( $useAN ){
		if($pkCount != 1 ){
			errLog('Post["auto_num"]['.$idx.'] cannot set multi pk');
			return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
		}
		if( ! array_key_exists( $autoNumIdx , $aryPks ) || $aryPks[ $autoNumIdx ] != 'true' ){
			errLog('Post["auto_num"]['.$idx.'] cannot set Not pk column');
			return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
		}
		if( ! array_key_exists( $autoNumIdx , $aryTypes ) || ( $aryTypes[ $autoNumIdx ] != '1' && $aryTypes[ $autoNumIdx ] != '3' ) ){
			errLog('Post["auto_num"]['.$idx.'] cannot set type is not integer or text');
			return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
		}
	}
	$anPrefix = null;
	if( array_key_exists('prefix' , $_POST ) ){
		$aryPrefix = $_POST[ 'prefix' ];
		if( !is_array($aryPrefix) ){
			errLog('Post["prefix"] is not array');
			return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
		}

		foreach( $aryPrefix as $idx => $prefix ){
			if( !is_string($prefix) && $prefix !== null ){
				errLog('Post["prefix"]['.$idx.'] is not string');
				return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
			};
			if( $prefix != '' ){
				if( $idx != $autoNumIdx ){
					errLog('Post["prefix"]['.$idx.'] cannot set un-autoNumber column');
					return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
				}
/*
				if( $aryTypes[ $autoNumIdx ] != '3' ){
					errLog('Post["prefix"]['.$idx.'] cannot set integer column');
					return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
				}
*/
				$anPrefix = $prefix;
			} else if( $idx != $autoNumIdx ){
				$anPrefix = prefix;
			};
		}
	}
	$anSuffix = null;
	if( array_key_exists('suffix' , $_POST ) ){
		$arySuffix = $_POST[ 'suffix' ];
		if( !is_array($arySuffix) ){
			errLog('Post["suffix"] is not array');
			return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
		}

		foreach( $arySuffix as $idx => $suffix ){
			if( !is_string($suffix) && $suffix !== null ){
				errLog('Post["suffix"]['.$idx.'] is not string');
				return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
			};
			if( $suffix != '' ){
				if( $idx != $autoNumIdx ){
					errLog('Post["suffix"]['.$idx.'] cannot set un-autoNumber column');
					return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
				}
/*
				if( $aryTypes[ $autoNumIdx ] != '3' ){
					errLog('Post["suffix"]['.$idx.'] cannot set integer column');
					return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
				}
*/
				$anSuffix = $suffix;
			} else if( $idx != $autoNumIdx ){
				$anSuffix = suffix;
			};
			
		}
	}
	$anLength = null;
	if( array_key_exists('length' , $_POST ) ){
		$aryLength = $_POST[ 'length' ];
		if( !is_array($aryLength) ){
			errLog('Post["length"] is not array');
			return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
		}

		foreach( $aryLength as $idx => $length ){
			if( !is_numeric($length) && $length !== null && $length !== '' ){
				errLog('Post["length"]['.$idx.'] is not numeric');
				return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
			};
			if( is_numeric($length) ){
				$length = floatval( $length );
			}else{
				$length = null;
			};
			if( $length != null ){
				if( $idx != $autoNumIdx ){
					errLog('Post["length"]['.$idx.'] cannot set un-autoNumber column');
					return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
				}
/*
				if( $aryTypes[ $autoNumIdx ] != '3' ){
					errLog('Post["length"]['.$idx.'] cannot set integer column');
					return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
				}
*/
				$anLength = $length;
			} else if( $idx != $autoNumIdx ){
				errLog('Post["length"]['.$idx.'] is not numeric');
				return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
			};
		}
	}
	$anZeroPad = null;
	if( array_key_exists('pad' , $_POST ) ){
		$aryZeroPad = $_POST[ 'pad' ];
		if( !is_array($aryZeroPad) ){
			errLog('Post["pad"] is not array');
			return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
		}

		foreach( $aryZeroPad as $idx => $zeroPad ){
			if( !is_numeric($zeroPad) && $zeroPad !== null && $zeroPad !== '' ){
				errLog('Post["pad"]['.$idx.'] is not numeric');
				return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
			};
			if( is_numeric($zeroPad) ){
				$zeroPad = intval( $zeroPad );
			}else{
				$zeroPad = null;
			};
			if( $zeroPad != null ){
				if( $idx != $autoNumIdx ){
					errLog('Post["pad"]['.$idx.'] cannot set un-autoNumber column');
					return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
				}
/*
				if( $aryTypes[ $autoNumIdx ] != '3' ){
					errLog('Post["pad"]['.$idx.'] cannot set integer column');
					return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
				}
*/
				$anZeroPad = $zeroPad;
			} else if( $idx != $autoNumIdx ){
				errLog('Post["pad"]['.$idx.'] is not numeric');
				return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
			};
		}
	}
	$paramAn = null;
	if( $useAN ){
		if( $anLength !== null &&  $aryTypes[ $autoNumIdx ] == '3' ){
			$paramAn = [
				"prefix"=>$anPrefix,
				"suffix"=>$anSuffix,
				"length"=>$anLength,
				"zeroPad"=>$anZeroPad,
			];
		}else if( $aryTypes[ $autoNumIdx ] == '1' ){
			$paramAn = [
				"prefix"=>null,
				"suffix"=>null,
				"length"=>null,
				"zeroPad"=>null,
			];
		}
	}
	//ユニークパラメータのチェック


	$aryUIds =[];
	$aryUCIds =[];
	$aryCols =[];
	if( array_key_exists('unique_id' , $_POST ) ){
		$aryUIds = $_POST[ 'unique_id' ];
		if( !is_array($aryUIds) ){
			errLog('Post["unique_id"] is not array');
			return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
		}
	}
	if( array_key_exists('unique_col_id' , $_POST ) ){
		$aryUCIds = $_POST[ 'unique_col_id' ];
		if( !is_array($aryUCIds) ){
			errLog('Post["unique_col_id"] is not array');
			return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
		}
	}
	if( array_key_exists('unique_col' , $_POST ) ){
		$aryCols = $_POST[ 'unique_col' ];
		if( !is_array($aryCols) ){
			errLog('Post["unique_col"] is not array');
			return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
		}
	}
	$uniqueParams = [];
	foreach( $aryUIds as $idx => $uid ){
		if( !is_string($uid) && $uid !== null ){
			errLog('Post["unique_id"]['.$idx.'] is not string');
			return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
		};
		if( $uid == '' ){
			$uid = null;
		}
		$uniqueParams[ $idx ] = [
			'id' => $uid ,
			"Table"=>$tid,
			"cols"=>[],
		];
	}
	foreach( $aryUCIds as $idx => $ucids ){
		if( !is_array($ucids) ){
			errLog('Post["unique_col_id"]['.$idx.'] is not array');
			return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
		}
		if( ! array_key_exists( $idx , $uniqueParams) ){
			$uniqueParams[ $idx ] = [
				'id' => null ,
				"Table"=>$tid,
				"cols"=>[],
			];
		}
		foreach( $ucids as $ucidx => $ucid ){
			if( !is_string($ucid) && $ucid !== null ){
				errLog('Post["unique_col_id"]['.$idx.']['.$ucidx.'] is not string');
				return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
			};
			if( $ucid == '' ){
				$ucid = null;
			}
			$uniqueParams[ $idx ]['cols'][ $ucidx ] = [
				"id"=>$ucid,
				"uId"=>$uniqueParams[ $idx ]['id'],
				"col"=>null,
			];
		}
	}
	foreach( $aryCols as $idx => $ucols ){
		if( !is_array($ucols) ){
			errLog('Post["unique_col"]['.$idx.'] is not array');
			return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
		}
		if( ! array_key_exists( $idx , $uniqueParams) ){
			$uniqueParams[ $idx ] = [
				'id' => null ,
				"Table"=>$tid,
				"cols"=>[],
			];
		}
		foreach( $ucols as $ucidx => $ucol ){
			if( !is_string($ucol) && $ucol !== null ){
				errLog('Post["unique_col"]['.$idx.']['.$ucidx.'] is not string');
				return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
			};
			if( $ucol == '' ){
				$ucol = null;
			}
			if( ! array_key_exists( $ucidx , $uniqueParams[ $idx ]['cols'] ) ){
				$uniqueParams[ $idx ]['cols'][ $ucidx ] = [
					"id"=>null,
					"uId"=>$uniqueParams[ $idx ]['id'],
					"col"=>null,
				];
			}
			$uniqueParams[ $idx ]['cols'][ $ucidx ]['col'] = $ucol;
		}
	}

	//ここから、更にチェックを行う
	$aryColNames =[];
	$aryColIndex =[];
	foreach( $params as $param ){
		//列定義については、typeなしは不正
		//列名の重複は不正
		if( $param['type'] == null){
			errLog(
				'type is null'."\t".
				'param:'.json_encode($param)."\r\n"
			);
			return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
		}
		if( array_key_exists( $param['name'] , $aryColNames) ){
			errLog(
				'column name dup'."\t".
				'param:'.json_encode($param)."\r\n"
			);
			return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
		}
		$aryColNames[ $param['name'] ] = $param['name'];
		if( $param['id'] != null ){
			$aryColIndex[ $param['id'] ] = $param['id'];
		}
	}
	//$paramsを、idx順にソートする。基本的にはソート済みの状態であるはずだが、これを担保する。
	if(count($params) > 0 ){
		$aryParamIdxs = array_keys($params);
		sort( $aryParamIdxs , SORT_NUMERIC );
		$wkP = [];
		foreach( $aryParamIdxs as $idx ){
			$wkP[] = $params[$idx];
		}
		$params = $wkP;
	}
	//ユニークについては、colなしは不正
	//colが列定義と一致しないものは不正
	//colsが空のものは不正
	foreach( $uniqueParams as $uniqueParam ){
		if( count( $uniqueParam['cols'] ) == 0 ){
			errLog(
				'unique column is nothing'."\t".
				'param:'.json_encode($uniqueParam)."\r\n"
			);
			return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
		}
		foreach( $uniqueParam['cols'] as $uniqueColParam ){
			if( $uniqueColParam['col'] == null ){
				errLog(
					'unique column is null'."\t".
					'param:'.json_encode($uniqueColParam)."\r\n"
				);
				return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
			}
			if( ! array_key_exists( $uniqueColParam['col'] , $aryColIndex ) ){
				errLog(
					'unique column is disable value'."\t".
					'param:'.json_encode($uniqueColParam)."\r\n"
				);
				return CC\RES::RES_SYSERRORS['ILLEGAL_PARAM'];
			}
		}
	}
	errLog(
		'CALL chgSysCol'."\t".
		'param col:'.json_encode($params)."\t".
		'param unique:'.json_encode($uniqueParams)."\t".
		'param AN:'.json_encode($paramAn)."\r\n",true
	);

	$db = new usrDb($id);
	if( ! $db->isEnable() ){
		errLog(
			'DB INITIALIZE ERROR'
		);
		return $db->error;
	}else{
		return $db->chgSysCol( $tid , $params , $uniqueParams , $paramAn );
	};
}

C\res( main() );
