<?php
class fileAccess{
	private static function getFiles( $strDir ){
		$file_list = [];
		// ディレクトリハンドルの取得
		if( ! is_dir( $strDir ) ){
			return CC\RES::RES_SYSERRORS['SYS_F_CONSISTENT'];
			errLog(
				'DIRECTORY NOT FOUND' ."\t".
				'DIR PATH:'.$strDir."\r\n"
			);
		}
		$time = CC\EXPORTS::getDelDate();
		$dir_h = opendir( $strDir ) ;

		while( ($file = readdir($dir_h)) !== false ) {
			// ファイルのみ取得
			if( filetype( $path = $strDir .'/'.$file ) == "file" ) {
				// 各ファイルへの処理
				if( $time > filemtime($path) ) {
					// 古いファイルにだけ適用する処理
					if( ! unlink( $path ) ){
						errLog(
							'FILE CANNOT DELETE' ."\t".
							'FILE PATH:'.$path."\r\n"
						);
					}
				}else{
					$file_list[] = $file;
				}
			}
		}
		// ディレクトリハンドルを閉じる
		closedir( $dir_h ) ;

		// ファイル名(降順)にする
		sort($file_list) ;
		//ディレクトリ内のファイル名を１つずつを取得
		$ret = CC\RES::RES_I;
		$ret[ 'files' ] = [];
		foreach ( $file_list as $file_name ){
			$ret[ 'files' ][] = $file_name;
		};
		return $ret;
	}
	public static function getExpDb(){
		self::getFiles( CC\FILE::D_EXPCSV );
		return self::getFiles( CC\FILE::D_EXPDB );
	}
	public static function getExpCsv(){
		self::getFiles( CC\FILE::D_EXPDB );
		return self::getFiles( CC\FILE::D_EXPCSV );
	}
	public static function expDb( $id ){
		$db = new sysDb();
		if( ! $db->isEnable() ){
			errLog( __FILE__."\t".__LINE__ , true );
			return $db->error;
		}else{
			$dbInfo = $db->getDbInfo( $id );
		};
		if( $dbInfo == null ){
			return CC\RES::RES_SYSERRORS['USR_DB_ID_NOT_FOUND'];
		};

		$src = C\getDBPath( $id );
		$dist = C\getExpDBPath( $id );
		$ret = CC\RES::RES_I;
		if ( ! file_exists( $src ) ) {
			return CC\RES::RES_SYSERRORS['USR_DB_F_NOT_FOUND'];
		};
		$hasError = ! copy( $src , $dist );
		if( $hasError ){
			$strOpt = '';
			if ( ! is_dir( CC\FILE::D_EXPDB ) ) {
				$strOpt = "\r\n".'export directory not exist.';
			}

			$ret = CC\RES::RES_W;
			$ret['error'] = 'Database export error';
			$ret['discription'] = 'database name: '.$dbInfo['name'].strOpt;

			errLog(
				'DB FILE CANNOT COPY' ."\t".
				'src:'.CC\FILE::DBTPL."\t".
				'dist:'.C\getDBPath($id)."\r\n"
			);
		}
		return $ret;
	}
	public static function impDb( $dbPath ){
		$usrDb = new usrDb( $dbPath , true );
		if( $usrDb->error != null ){
			errLog(
				'DB CHECK ERROR'."\r\n"
			);
			return $usrDb->error;
		};
		//明示的に破棄し、接続を切る。
		$usrDb = null;
		//整合性チェックが済んでいる状態である。
		//トランザクションの都合、ファイル操作の実処理はsysDb側で行う。
		$db = new sysDb();
		return $db->impDb( $dbPath );

	}
	public static function expTbl( $id,$tid ){
		$db = new usrDb($id);
		if( ! $db->isEnable() ){
			return $db->error;
		}else{
			$res = $db->getSingleTable4CSV($tid);
		};
		if( $res['mode'] != 'I' && $res['mode'] != 'W'){
			return $res;
		}

		$dist = C\getExpCSVPath( $id,$tid );


		try{
			$file = new SplFileObject($dist, 'w');
		}catch( RuntimeException $e ){
			$ret = CC\RES::RES_SYSERRORS[ 'USER_TBL_CANOT_EXPORT' ];
			$ret['discription'] = 'Table name:'.$db->getTableName($tid )."\r\n";
			$ret['discription'] .= $e->getMessage();
			return $ret;

		}

		$aryErrorRecs = [];
		foreach ($res['table'] as $fields) {
			$len = $file->fputcsv($fields);
			if( $len == FALSE ){
				errLog(
					'RECORDE CANNNOT PUTCSV' ."\t".
					'rec:'.json_encode($fields)
				);
				$aryErrorRecs[] = $fields;
			}
		}
		if( count($aryErrorRecs) != 0 ){
			$ret = CC\RES::RES_SYSERRORS[ 'USER_TBL_CANOT_EXPORT' ];
			$ret['discription'] = 'Table name:'.$db->getTableName($tid )."\r\n";
			$ret['discription'] .= 'RECODER CANNNOT PUT'."\r\n";
			$ret['discription'] .= 'REC:'.implode( $fields )."\r\n";
			return $ret;
		}

		return CC\RES::RES_I;
	}
	public static function impCSV(  $id,$tid , $dbPath ){
		//ファイルを読み込んだら、そのままdbクラスに投げる。
		//内容の精査等は全て、dbクラスで行うので、
		//ここは読み込むだけで良い。
		$aryImport = [];
		try{
			$file = new SplFileObject($dbPath);
			$file->setFlags(SplFileObject::READ_CSV);
			foreach ($file as $row) {
				$aryImport[] = $row;
			}
		}catch( RuntimeException $e ){
			$ret = CC\RES::RES_SYSERRORS[ 'USER_TBL_CANOT_IMPORT' ];
			$ret['discription'] .= $e->getMessage();
			return $ret;
		}


		$db = new usrDb($id);
		if( ! $db->isEnable() ){
			return $db->error;
		}else{
			$res = $db->insertFromCsv($tid , $aryImport );
		};
		return $res;

	}
}
