<?php
namespace model\import;
use \model;
/**
 * 导入样品图片处理类
 * @package model
 */
class uploadImportProPhoto extends model
{

    public $pro;
    public $image;
    public $files;
    public $cacheIds;
	public function __construct()
	{
		ini_set('memory_limit', \mvc::$cfg['upload']['memory_limit']);
		set_time_limit(0);
		ignore_user_abort(true);
		parent::__construct();
	    $this->files = makeOne(model\files::class);
		$this->pro = makeOne(model\pro\pro::class);
		$this->image = makeOne(model\pro\image::class);
	    $this->cacheIds = [];
	}


    /**检测上传
     * @param 
     * @return
     */
	public function uploadCheck($filecount,$reqfilename,$reqfilesize,$uploadID,$extname,$category,$item,$params)
	{
		return true;
	}


    /**接收上传的图片处理
     * @param 
     * @return
     */
	public function uploadGet($fileid,$filename,$dir,$filebase,$extname,$category,$item,$params)
	{
		$res = $this->importZip($filename,true,$params['item']);
		if(!$res[0]){
		    dump($res[1]);
		}
	}


    /**
     * 图片解压
     * @return string //如果有错误，则返回错误文本
     */
	public function unzipPhotoFile($res, &$item, $params)
	{
	    $fileroot = \mvc::$cfg['dir']['files'];
	    $filebase = substr($item['filename'],0,strrpos($item['filename'],'.'));
	    $extname = $item['extname'];
	    $category = 'sample';
		$dir = 'sample/'.date('Ym');
		$absdir = $fileroot.'/'.$dir;
		mkdirs($absdir);
		
		$savefilename = $absdir.'/'.$filebase.".".$extname;
		$item['file']['category'] = $category;
		$item['file']['item'] = $params['item'];
		$item['file']['dir'] = $dir;
		$item['file']['filebase'] = $filebase;
		$item['file']['extname'] = $extname;
		$item['file']['savefilename'] = $savefilename;
	    
	    //存放图片
	    $contents = zip_entry_read($res,$item['filesize']);
	    file_put_contents($savefilename,$contents);
	}
	
	public function filenameEncode($filename){
        $basename = substr(basename($filename),0,strrpos($filename,'.'));
        $extname = substr(basename($filename),strrpos($filename,'.')+1);
	    $result = base64_encode($basename);
	    $result = str_replace("/",'_',$result);
	    return $result.'.'.$extname;
	}
	public function filenameDecode($filename){
        $basename = substr(basename($filename),0,strrpos($filename,'.'));
        $extname = substr(basename($filename),strrpos($filename,'.')+1);
	    $result = str_replace("/",'_',$basename);
	    $result = base64_decode($result);
	    return $result.'.'.$extname;
	}
	
	public function unZip($zipfile,$base64=false,$dir=''){
	    if($zipfile=='' || !file_exists($zipfile)){
	        $this->error = '压缩文件未找到';
	        return false;
	    }
		if($dir==''){
    		$info = pathinfo($zipfile);
    		$dir = $info['dirname'].'/'.str_replace('.'.$info['extension'],'',$info['basename']);
		}
		mkdirs($dir);
		$zip = zip_open($zipfile);
        while ($res = zip_read($zip)){
            if (zip_entry_open($zip,$res)) {
                $filename = trim(zip_entry_name($res));
                $filesize = zip_entry_filesize($res);
                if($base64){
                    $savefilename = $dir.'/'.$this->filenameEncode($filename);
                }else{
                    $savefilename = $dir.'/'.$filename;
                }
                $contents = zip_entry_read($res,$filesize);
                file_put_contents($savefilename,$contents);
                zip_entry_close($res);
            }
        }
		zip_close($zip);
		return $dir;
	}
	
	
	public function checkFile($filename,$base64=true,$type=''){
	    $src = $filename;
	    if($base64){
	        $filename = $this->filenameDecode(basename($filename));
	    }
        $info = explode('.',strtolower(basename($filename)));
        $extname = end($info);
        $picname = substr(strtolower(basename($filename)),0,strlen($extname)*-1-1);
        $item['extname'] = $extname;
        if( !in_array($extname,['jpg','jpeg','png','gif']) ){
            return [false, '图片格式不正确'];
        }
        if(filesize($src) > 1024 * 1024 * 50){
            return [false, '单张图片不允许超过50M'];
        }
        $number = preg_split('/[_]/',$picname)[0];
        $id='';
        if($number){
            if(!isset($this->cacheIds[$number])){
                if($row = $this->pro->getRowByFieldValue('p_innum',$number,['p_id'])){
                    $this->cacheIds[$number] = $row['p_id'];
                }
            }
            $id = $this->cacheIds[$number];
        }
        if(empty($id)){
            return [false, '没有找到此内部编码['.$number.']'];
        }else{
            if($this->db->has('pro_pic',['ppic_type'=>$type,'ppic_filebase'=>$picname])){
                return [false, '照片库有相同命名的照片['.$picname.']'];
            }
        }
        return [true,$id];
	}
	
	
	public function importZip($zipfile,$isdel=true,$type=''){
	    if(!file_exists($zipfile)){
	        return [false,'导入压缩包不存在'];
	    }
		$dir = $this->unZip($zipfile,true);
		if($dir){
		    $res = $this->importDir($dir,$isdel,true,$type);
		    rmdirs($dir);
		    if($isdel){
		        unlink($zipfile);
		    }
		    return $res;
		}
	}
	
	public function importDir($dir,$isdel=true,$base64=false,$type=''){
	    if(!is_dir($dir)){
	        return [false,'导入目录不存在'];
	    }
	    $bigDirs = scandir($dir);
	    $origDirs =[];
	    $beauDirs =[];
	    foreach($bigDirs as $v){
	        if($v=='original') $origDirs = scandir($dir.'/original');
	        else if($v=='beautiful') $beauDirs = scandir($dir.'/beautiful');
	    }
	    if($type=='' && empty($origDirs) && empty($beauDirs)){
	        return [false,'未找到 original 或者 beautiful 目录'];
	    }
	    
        $logpath = 'import/'.date('Ym');
        $logfilename = 'log'.getOpuser().'ProPhoto'.time().'.csv';
        $logfile = \mvc::$cfg['dir']['files'].'/'.$logpath.'/'.$logfilename;
        mkdirs(\mvc::$cfg['dir']['files'].'/'.$logpath);
        $fp = fopen($logfile, 'w'); //记录日志
        
	    $this->cacheIds = [];
	    if($type!=''){
	        $this->scanSmallDir($dir,$type,basename($dir),$fp,$isdel,$base64,false);
	    }else{
    	    if(!empty($origDirs)){
    	        foreach($origDirs as $smallDir){
    	            if($smallDir=='.' || $smallDir=='..') continue;
    	            $this->scanSmallDir($dir.'/original/'.$smallDir,'original',$smallDir,$fp,$isdel,$base64,true);
    	        }
    	    }
    	    if(!empty($beauDirs)){
    	        foreach($beauDirs as $smallDir){
    	            if($smallDir=='.' || $smallDir=='..') continue;
    	            $this->scanSmallDir($dir.'/beautiful/'.$smallDir,'beautiful',$smallDir,$fp,$isdel,$base64,true);
    	        }
    	    }
	    }
        fclose($fp);
        //消息记录与在线提醒
        (new \model\user)->toLog('导入','导入产品图片 '.$logfile);
        $url = \mvc::$cfg['path']['files'].'/'.$logpath.'/'.$logfilename;
        $msg = [
        	'amsg_title'=> '产品图片导入完成',
        	'amsg_body'=> '产品图片导入完成',
        	'amsg_url'=> $url,
        	'amsg_urltitle'=> basename($url),
        ];
        makeOne(\model\message::class)->send([getOpuser()],$msg);
        socketSendMsg([getOpuser()],$msg);
        return [true,''];
	}
	
	public function scanSmallDir($dir,$type,$smallDir,$fp,$isdel,$base64,$isSend){
        $files = scandir($dir);
	    foreach($files as $i=>$filename){
	        if($filename=='.' || $filename=='..'){
	            unset($files[$i]);
	        }else if(is_file($dir.'/'.$filename)){
	            $files[$i] = $dir.'/'.$filename;
	        }
	    }
        usort($files,function($a, $b){
            if(strlen($a)==strlen($b)){
                return strcmp($a, $b);
            }else{
                return strlen($a) - strlen($b);
            }
        });
        foreach($files as $i=>$filename){
            $res = $this->checkFile($filename,$base64,$type);
            if($isSend){
                socketSendMsg([getOpuser()],[
                    'amsg_title'=>$type.'/'.$smallDir,
                    'amsg_body'=>basename($filename),
                    'amsg_url'=> ($res[0]) ? '': $res[1]
                ],'importProPhoto');
            }
            if($res[0]){
                $id = $res[1];
                $this->toDatabase($type,$smallDir,$id,$filename,$fp,$isdel,$base64);
                fputcsv($fp, [$filename,'']);
            }else{
                fputcsv($fp, [$filename,$res[1]]);
            }
        }
	}
	
	public function toDatabase($type,$smallDir,$id,$filename,$fp,$isdel=true,$base64=true){
	    $reqfilename = basename($filename);
        $info = explode('.',strtolower(basename($filename)));
        $extname = end($info);
	    $dir = 'pro/'.$type.'/'.$smallDir;
	    $filebase = md5($type.$smallDir.$id.$filename);
	    $category = 'proimage';
	    if($type=='original') $type='init';
	    if($type=='beautiful') $type='beautify';
	    $item = $type;
	    if($base64){
	        $reqfilename = $this->filenameDecode($reqfilename);
	    }
	    if(empty($id) || $filename=='') 
	        return [false,''];
	    $params=[
	        'pid'=>$id,
	        'reqfilename'=>$reqfilename,
	    ];
	    mkdirs(\mvc::$cfg['dir']['files'].'/'.$dir);
	    $newfilename = \mvc::$cfg['dir']['files'].'/'.$dir.'/'.$filebase.'.'.$extname;
	    copy($filename,$newfilename);
	    $fileid = $this->files->add($reqfilename,$newfilename,$dir,$filebase,$extname,$category,$item,$params,false);
	    if($fileid){
	        $this->image->uploadGet($fileid,$filename,$dir,$filebase,$extname,$category,$item,$params);
	    }else{
	        fputcsv($fp, [$filename,'导入失败,请检测是否是一个有效的图片']);
	        @unlink($newfilename);
	    }
	}
	
}