<?php
namespace admin\action;
use \model\import;
use \model\excel;
use \model\uploadXls;
/**
 * Class saveUploadAction
 * 接收上传的文件
 * @package admin\action
 */
class saveUploadAction  extends \action
{
	public $options = [];
	public $fileroot = '';
    public function __construct()
    {
		$this->options = \mvc::$cfg['upload'];
		$this->fileroot = \mvc::$cfg['dir']['files'];
    }
	public function bigfiles(){
        set_time_limit(\mvc::$cfg['upload']['time_limit']);
        $req = \mvc::$req;
		$reqfiles = \mvc::$reqfiles;
		$filecount = $req['filecount'];
		$reqfilename = $req['filename'];
		$reqfilesize = $req['filesize'];
		$blockReg = $req['blockReg'];
		$blockCount = $req['blockCount'];
        $uploadID = empty($req['uploadId']) ? guid() : $req['uploadId'];
		$category = $req['category'];
		$item = $req['item'];
		$filetype = $this->options['category'][$category]['items'][$item]['filetype'];
		$check = $this->options['category'][$category]['items'][$item]['check'];
		$call = $this->options['category'][$category]['items'][$item]['call'];
		$params = json_decode($req['params'],true);
		$extname = strtolower(pathinfo($reqfilename, PATHINFO_EXTENSION));
		if(empty($call)){
            echo json_encode([
                'code' => 1002,
                "msg" => lg("未知的配置").": ".$reqfilename
            ]);
            exit();
		}
        if(!in_array($extname,$this->options['type'])){
            echo json_encode([
                'code' => 1001,
                "msg" => lg("非法的文件类型").": ".$reqfilename
            ]);
            exit();
        }
		if(isset($check['class']) && isset($check['method'])){
			$s = call_user_func_array([new $check['class'],$check['method']], [$filecount,$reqfilename,$reqfilesize,$uploadID,$extname,$category,$item,$params]);
			if($s!==true){
				echo json_encode([
					'code' => 1001,
					"msg" => $s
				]);
				exit();
			}
		}
		if(isset($this->options['category'][$category]['items'][$item]['path'])){
    		$dir = call_user_func_array($this->options['category'][$category]['items'][$item]['path'], [$uploadID,$item,$extname,$params,$reqfilename]);
		}else{
    		$dir = call_user_func_array($this->options['category'][$category]['path'], [$uploadID,$item,$extname,$params,$reqfilename]);
		}
		if(isset($this->options['category'][$category]['items'][$item]['filebase'])){
    		$filebase = call_user_func_array($this->options['category'][$category]['items'][$item]['filebase'], 
    		                                    [$uploadID,$item,$extname,$params,$reqfilename]);
		}else{
    		$filebase = call_user_func_array($this->options['category'][$category]['filebase'], [$uploadID,$item,$extname,$params,$reqfilename]);
		}
		$absdir = $this->fileroot.'/'.$dir;
        $filename_tmp = $absdir.'/'.$filebase.".".$extname.".tmp";
        $filename = substr($filename_tmp,0,-4);
		mkdirs($absdir);
		$fdata = $reqfiles['data'];
		$fp = fopen($fdata["tmp_name"],"r");
		$filedata = fread($fp,filesize($fdata["tmp_name"]));
		fclose($fp);
		$f = null;
		$result = null;

		if($blockReg == 0)
		{
			if(file_exists($filename_tmp)) @unlink($filename_tmp);
			$f = fopen($filename_tmp,"a");
		}
		if(file_exists($filename_tmp))
		{
			if(is_null($f)) $f = fopen($filename_tmp,"a");
			fwrite($f,$filedata);
			fclose($f);
		}
		$doneCallResult = [];
		if($blockReg == $blockCount)
		{
			if(isset($call['class']) && isset($call['method'])){
				rename($filename_tmp, $filename);
				$fileid = (new \model\files())->add($reqfilename,$filename,$dir,$filebase,$extname,$category,$item,$params);
				if($fileid){
				    if(empty($params)) $params = [];
				    $params['reqfilename'] = $reqfilename;
        			if($this->options['category'][$category]['items'][$item]['tojpeg']) $extname = 'jpg';
					$doneCallResult = call_user_func_array([new $call['class'],$call['method']], [$fileid,$filename,$dir,$filebase,$extname,$category,$item,$params]);
				}else{
					unlink($filename);
					throw new \Exception ( lg('上传文件出错,无效的文件ID') );
				}
			}else{
				unlink($filename_tmp);
			}
			if($this->options['category'][$category]['items'][$item]['tojpeg']) $extname = 'jpg';
			$result = [
				'code'=> 0,
				'rows'=>[
					'uploadID' => $uploadID,
					'blockReg' => $blockReg * 1,
					'filename' => basename($filename),
					'info'=> $doneCallResult,
					'filedata' => [
						'fileid'=>$fileid,
						'filename'=>$dir.'/'.$filebase.'.'.$extname,
						'orgname'=>$doneCallResult['orgname'],
					]
				]
			];
		}
		if(is_null($result)){
			$result = [
				'code' => 0,
				'rows' => [
					'blockReg' => $blockReg * 1,
					'uploadID' => $uploadID,
					'filename' => basename($filename)
				]
			];
		}
		echo json_encode($result);
		exit();
	}


    /**
     * 弹窗上传
     * @return void
     */
	public function openDiv(){
		\view::put('upload/openDiv');
	}


	//获取导入配置信息  ?impcode=numidxTemp
	public function getImportCfg()
	{
		$req = \mvc::$req;
		$import = makeOne('\model\import\\'.$req['impcode']);
		$data = [
			'rules'=> $import->rules,
			'rulesUpdate'=> isset($import->rulesUpdate) ? $import->rulesUpdate : [],
			'rulesDelete'=> isset($import->rulesDelete) ? $import->rulesDelete : [],
		];
		$this->successJson($data);
	}
	
	//导入信息  ?impcode=numidxTemp
	public function import()
	{
		$req = \mvc::$req;
		//dd(ini_get('max_input_vars'),$req);
		$op = isset($req['op']) ? $req['op'] : 'add';
		$import = makeOne('\model\import\\'.$req['impcode']);
		if($op=='add'){
		    $data = $import->import($req['data']);
		}else if($op=='update'){
		    $data = $import->importUpdate($req['data']);
		}else if($op=='delete'){
		    $data = $import->importDelete($req['data']);
		}
		(new \model\user)->toLog('导入','导入'.$import->title.' '.(is_string($data) ? $data : count($data).'条,第一条内容:'.implode(',',$data[0])));
		$this->successJson($data);
	}

	//下载模板  ?impcode=numidxTemp
	public function importDemo()
	{
		$req = \mvc::$req;
		$import = makeOne('\model\import\\'.$req['impcode']);
		$excel = new excel();
		$head = [];
		$columns = $import->rules;
		if($req['op'] == 'update')
			$columns = $import->rulesUpdate;
		else if($req['op'] == 'delete')
			$columns = $import->rulesDelete;

		foreach($columns as $v)
		{//['aa', ['val'=>'xxx必填', 'color'=>'FF0000 颜色选填', 'width'=>20 宽度选填] ]
			if(!empty($v['must'])){
				$head[] = ['val'=>$v['caption'], 'color'=>'FF0000'];
			}else{
				$head[] = $v['caption'];
			}
		}
		$dataArr = [$head];
		//样例数据？
		$excel->writer($dataArr, $req['impcode'].'.xlsx');
	}

	//初始化 ?impcode=numidxTemp
	public function importInit()
	{
		$req = \mvc::$req;
		$uploadXls = new uploadXls();
		$data = $uploadXls->uploadByFile($req['impcode']);
		$this->successJson($data);
	}

	/** 导入初始化样品图片
	 * @params string $type zip|dir
	 */
	public function importInitSamplePhoto($type)
	{
	    if($type=='dir'){
		    $data = makeOne(\model\import\uploadImportSamplePhoto::class)->importDir(\mvc::$cfg['dir']['files'].'/importServer/samplePhoto',false);
	    }else if($type=='zip'){
		    $data = makeOne(\model\import\uploadImportSamplePhoto::class)->importZip(\mvc::$cfg['dir']['files'].'/importServer/samplePhoto.zip',false,false);
	    }
	    if($data[0]){
	    	$this->successJson();
	    }else{
	    	$this->msgJson($data[1]);
	    }
	}

	/** 导入初始化产品图片
	 * @params string $type zip|dir
	 */
	public function importInitProPhoto($type,$dir)
	{
	    if($type=='dir'){
		    $data = makeOne(\model\import\uploadImportProPhoto::class)->importDir($dir,false,false);
	    }else if($type=='zip'){
		    $data = makeOne(\model\import\uploadImportProPhoto::class)->importZip(\mvc::$cfg['dir']['files'].'/importServer/samplePhoto.zip',false,false);
	    }
	    if($data[0]){
	    	$this->successJson();
	    }else{
	    	$this->msgJson($data[1]);
	    }
	}
}