<?php
namespace admin\action\pro;
/**
 * Class imageAction
 * @package admin\action\pro
 */
class imageAction extends \action
{
    private $image;
	public function __construct()
    {
		$this->image = makeOne(\model\pro\image::class);
	}
	
    function list()
    {
        \view::set('cfg',json_encode($this->image->options));
        \view::put();
    }
	
    function reportList()
    {
        $req = \mvc::$req;
		//前置条件
		$rules = $this->urlRulesToWhere($req);
		if(isset($req['numbers'])){
			$rules['numbers'] = formatNums($req['numbers']);
			$rules['numlike'] = empty($req['numlike']) ? 0 : $req['numlike'];
		}
		
        $data = $this->image->reportList($rules,$req['filters'], $req['page'], $req['rows'], $req['sidx'], $req['sord'],'p_outnum');
        $this->successJson($data);
    }
    
    
    
    public function search()
    {
        //(new photo())->clear();
        $req = \mvc::$req;
		//前置条件
		$rules = $this->urlRulesToWhere($req);
		if(isset($req['numbers'])){
			$rules['numbers'] = formatNums($req['numbers']);
			$rules['numlike'] = empty($req['numlike']) ? 0 : $req['numlike'];
		}
		if(!empty($req['main_update_time_begin']) && !empty($req['main_update_time_end'])){
			$rules['main_update_time_begin'] =  shortDate($req['main_update_time_begin']);
			$rules['main_update_time_end'] = shortDate($req['main_update_time_end']);
		}
		if(!empty($req['pwcode']) && !\p::isAdmin()){
		    $ids = \p::cates($req['pwcode']);
		    if($ids!=''){ 
		       $ids = explode(',',$ids); 
    		   $rules['p_cate'] = $ids;
		    }
		}
        $pro = makeOne(\model\pro\pro::class);
        $data = $pro->list($rules,$req['filters'], $req['page'], $req['rows'], $req['sidx'], $req['sord'],'p_outnum');
		foreach($data['rows'] as &$row){
            if(in_array($rules['propictype'],['tecdoc','catalog_g','catalog_gsp'])){
                if($row['p_pic']){
                    $file = $this->image->getProImages($row['p_id'],$rules['propictype']);
                    //$row['pic_0'] = $file['smallfile'];
                    //$row['main_update_time'] = $row['update_time'];
                    $row['main_update_time'] = $row['main_update_time'];
                    $row['pic_0'] = $row['p_innum'];
                    $row['picinfo']['pic_0'] = [
        			    'pid' => $row['p_id'],
        			    'fileid' => $row['p_pic'],
        			    'smallfile' => $file['smallfile'],
        			    'bigfile' => $file['bigfile'],
        			    'filename' => $file['filename'],
        			    'initfile' => '',
        				'filebase' => $row['p_innum'],
        				'remark' => '',
        				'fileremark' => $file['p_outnum'],
        				'ischecked' => true,
        				'isback' => false,
        				'back' => null,
        				'isreplay' => false,
        				'replay' => null,
        				'isdesexport' => false,
        				'desexport_time' => null,
        				'update_time' => $row['update_time'],
        				'isusa' => false,
                    ];
                }
            }else{
                $files = $this->getFilesByPid($row['p_id'],$rules['propictype'],$rules);
                $main_update_time = '';
                foreach($files as $k=>$v){
                    //$row[$k] = $v['smallfile'];
                    $row[$k] = $v['filebase'];
                    $row['picinfo'][$k] = $v;
                    if($v['innum']==$v['filebase']){
                        $main_update_time = date('Y-m-d',strtotime($v['update_time']));
                    }
                }
                $row['main_update_time'] = $main_update_time;
            }
		}//foreach
        $this->successJson($data);
    }
    
    public function openimage($pid,$fileid,$propicType,$cate)
    {
        $files = $this->getFilesByPid($pid,$propicType,$rules);
        $defaultImage = "";
        $defaultInitImage = "";
        foreach($files as $k=>$v){
            if(empty($fileid)){
                $fileid = $v['fileid']; 
                \mvc::$req['fileid'] = $fileid; 
            }
            if($v['fileid']==$fileid || $defaultImage==""){
                $defaultImage=$v['bigfile'];
                $defaultInitImage=$v['initfile'];
            }
        }
        if($catename==''){
            $cateRow = makeOne(\model\pro\pro::class)->getCate($pid);
            $cate = $cateRow['id'];
            $catename = $cateRow['cn_name'];
            \mvc::$req['cate'] = $cate; 
            \view::set('catename',$catename);
        }
        if($innum==''){
            $pro = makeOne(\model\pro\pro::class);
            $proRow = $pro->getRowByKey($pid);
            $outnum = $proRow['p_outnum'];
            $innum = $proRow['p_innum'];
            $isUsa = $pro->hasUsa($pid) ? 1 : 0;
            \mvc::$req['innum'] = $innum; 
            \mvc::$req['outnum'] = $outnum; 
            \mvc::$req['isUsa'] = $isUsa; 
        }
        \view::set('cfg',json_encode($this->image->options));
        \view::set('files',$files);
        \view::set('defaultImage',$defaultImage);
        \view::set('defaultInitImage',$defaultInitImage);
        \view::put();
    }
    
    public function getFilesByPid($pid,$propictype,$rules=null)
    {
        $files = $this->image->getFiles($pid,$propictype,$rules);
        $data = [];
        foreach($files as $k=>$file){
			$field = 'pic_'.$k;
			$data[$field] = [
			    'pid' => $file['ppic_p_id'],
			    'fileid' => $file['ppic_fileid'],
			    'outnum' => $file['ppic_outnum'],
			    'innum' => $file['ppic_innum'],
			    'smallfile' => $file['smallfile'],
			    'bigfile' => $file['bigfile'],
			    'filename' => $file['filename'],
			    'initfile' => $file['initfile'],
				'filebase' => strtoupper($file['ppic_filebase']),
				'remark' => $file['ppic_remark'],
				'fileremark' => $file['fileremark'],
				'ischecked' => ($file['ppic_state']=='1'),
				'isback' => $file['isback'],
				'back' => $file['back'],
				'isreplay' => $file['isreplay'],
				'replay' => $file['replay'],
				'isdesexport' => !empty($file['desexport_time']),
				'desexport_time' => $file['desexport_time'],
				'update_time' => $file['update_time'],
				'isusa' => ($file['ppic_isusa']==1),
			];
        }
        foreach($data as $k=>$v){
            if($v['ischecked']==false){
                foreach($data as $k2=>$v2){
                    if($v['fileid']!=$v2['fileid'] && $v['filebase']==$v2['filebase'] && $v2['ischecked']==true){
                        $data[$k]['isreplay'] = true;
                        $data[$k]['replay'] = [
                            'bigfile'=>$v2['bigfile'],
                            'initfile'=>$v2['initfile'],
                        ];
                        unset($data[$k2]);
                    }
                }
            }
        }
        $kData = [];
        $i=0;
        foreach($data as $k=>$v){
            $field = 'pic_'.$i;
            $kData[$field] = $v;
            $i++;
        }
        return $kData;
    }
    
    //导出
    public function export($propicType,$fileids,$watertype='',$numtype='',$width=640,$height=480)
    {
        $req = \mvc::$req;
        //dd($propicType,$fileids,$watertype,$numtype,$width,$height);
		ini_set('memory_limit', \mvc::$cfg['export_memory_limit']);
		set_time_limit(\mvc::$cfg['export_time_limit']);
		
        if(is_string($fileids)) $fileids=explode(',',$fileids);
        if(empty($fileids)) 
            return false;
        $zipfile = \mvc::$cfg['dir']['cache'].'/gsp_'.$propicType.'_'.date('Y-m-d.H').'.zip';   
        $zip = new \ZipArchive(); //linux需开启zlib,windows需php_zip.dll
        if ($zip->open ($zipfile, \ZIPARCHIVE::CREATE ) !== true) {
           throw new \Exception ('生成压缩文件失败,请检查相关目录权限');
        }
        
		$dir = \mvc::$cfg['dir']['cache'].'/'.date('Y-m');
		mkdirs($dir);
        $image = make(\lib\image::class,100);
        $tmpFileList = [];
        $names=[];
        foreach($fileids as $v){
            list($pid,$fileid) = explode('_',$v);
            if($row = $this->image->getFileByFileId($pid,$fileid)){
                if($req['onlyMain']=='1' && $row['ppic_innum']!=$row['ppic_filebase']){
                    continue; //只导出主图
                }
                $filebasename = ($numtype=='innum') ? $row['ppic_innum'] : $row['ppic_outnum'];
                if(!isset($names[$filebasename])) 
                    $names[$filebasename] = 0;
                else
                    $names[$filebasename]++;
                $extname = 'jpg';
                $t = explode('_',$row['ppic_filebase']);
                if(isset($t[1])){
                    $filebasename .= '_'.end($t);
                }else{
                    $bu = ($names[$filebasename]>0) ? '_'.$names[$filebasename] : '';
                    $filebasename .= $bu;
                }
                if(in_array($propicType,['tecdoc','gsp','g'])){
                    $src = \mvc::$cfg['dir']['files'].'/pro/'.$propicType.'/'.($pid % 100).'/'.$pid.'big.jpg';
                    $filename = $filebasename.'.jpg';
                }else{
                    $src = \mvc::$cfg['dir']['files'].'/'.substr($row['filename'],0,strrpos($row['filename'],'.')).'.'.$row['fileextname'];
                    $filename = $filebasename.'.'.$row['fileextname'];
                    $extname = $row['fileextname'];
                }
                if(file_exists($src)){
                    if($watertype!=''){
                        $watermark = \mvc::$cfg['dir']['static'].'/images/watermark/image_list_export/'.$watertype.'.png';
                        $pos = \mvc::$cfg['watermarkImageListExportModel'];
                        if(!file_exists($watermark)){
                            dd('水印图片不存在:'.$watermark);
                        }
                        $putfile = $dir .'/'.getOpuser() . md5($src) . '.jpg' ;//. $extname;
                        if($extname!='jpg'){
                            $image->ToJPG($src,$putfile);
                            if(!empty($width) && !empty($height)){
                                $image->ResizeWatermark($putfile,$putfile,$width,$height,$watermark,$pos);
                            }else{
                                $image->Watermark($putfile,$putfile,$watermark,$pos);
                            }
                        }else{
                            if(!empty($width) && !empty($height)){
                                $image->ResizeWatermark($src,$putfile,$width,$height,$watermark,$pos);
                            }else{
                                $image->Watermark($src,$putfile,$watermark,$pos);
                            }
                        }
                    }else{
                        $putfile = $dir .'/'.getOpuser() . md5($src) . '.' . $extname;
                        if(!empty($width) && !empty($height)){
                            $image->Resize($src,$putfile,$width,$height);
                        }else{
                            $putfile = $src;
                        }
                    }
                    $zip->addfile($putfile,$filename);
                    if($putfile!=$src){
                        array_push($tmpFileList,$putfile);
                    }
                    //设计师导出标记
                    if($propicType == 'designer'){
                        $this->image->updateDesexportTime($pid,$fileid);
                    }
                    //精修图导出标记
                    if($propicType == 'beautify'){
                        $this->image->setProState($pid,0,['beautify']);
                    }
                    //tecdoc导出标记
                    if($propicType == 'tecdoc'){
                        $this->image->setProState($pid,0,['tecdoc']);
                    }
                    //usa导出标记
                    if($propicType == 'usa'){
                        $this->image->setProState($pid,0,['usa']);
                    }
                    
                }
            }
        }
        $zip->close();
        foreach($tmpFileList as $file){
            unlink($file);
        }
        ob_end_clean();
        header('Content-Description: File Transfer');
        header('Content-Type: application/zip');
        header('Content-Disposition: attachment; filename='.basename($zipfile));
        header('Content-Length: '.filesize($zipfile));
        error_reporting(0);
        readfile($zipfile);
        flush();
        ob_flush();
        unlink($zipfile);
        exit();       
    }
    
    //删除
    public function saveDeletes($pid,$items,$propicType)
    {
        if($this->image->saveDeletes($pid,$items,$propicType)){
            $this->successJson();
        }else{
            $this->msgJson(lg('未知错误'));
        }
    }
    
    
    //重拍 + 批量 + 原因
    public function saveReplaysMore($list,$propicType,$remark)
    {
        $data = [];
        foreach($list as $k=>$v){
            $data[substr($k,1)] = $v;
        }
        if($this->image->saveReplaysMore($data,$propicType,$remark)){
            $this->successJson();
        }else{
            $this->msgJson(lg('未知错误'));
        }
    }
    
    //重拍
    public function saveReplays($pid,$items,$propicType)
    {
        if($this->image->saveReplays($pid,$items,$propicType)){
            $this->successJson();
        }else{
            $this->msgJson(lg('未知错误'));
        }
    }
    
    //Usa
    public function saveUsas($pid,$items,$propicType)
    {
        if($this->image->saveUsas($pid,$items,$propicType)){
            $this->successJson();
        }else{
            $this->msgJson(lg('未知错误'));
        }
    }
    
    //退回 + 批量 + 原因
    public function saveBacksMore($list,$propicType,$remark)
    {
        $data = [];
        foreach($list as $k=>$v){
            $data[substr($k,1)] = $v;
        }
        if($this->image->saveBacksMore($data,$propicType,$remark)){
            $this->successJson();
        }else{
            $this->msgJson(lg('未知错误'));
        }
    }
    
    //退回
    public function saveBacks($pid,$items,$propicType)
    {
        if($this->image->saveBacks($pid,$items,$propicType)){
            $this->successJson();
        }else{
            $this->msgJson(lg('未知错误'));
        }
    }
    
    //牛油包图待更新状态
    public function saveNotcattleState($pid,$items,$propicType){
        $state = \mvc::$req['state'];
        if($this->image->saveNotcattleState($state,$pid,$items,$propicType)){
            $this->successJson();
        }else{
            $this->msgJson(lg('未知错误'));
        }
    }
    
    //审核
    public function saveChecks($pid,$items,$propicType)
    {
        if($this->image->saveChecks($pid,$items,$propicType)){
            $this->successJson();
        }else{
            $this->msgJson(lg('未知错误'));
        }
    }
    
    //加载任意备注
    public function loadAnyRemark($type,$filebase)
    {
        $remark = $this->image->loadAnyRemark($type,$filebase);
        $this->successJson(['remark'=>$remark]);
    }
    
    //保存名称与备注
    public function saveNameAndRemark($pid,$items,$propicType)
    {
        if($this->image->saveNameAndRemark($pid,$items,$propicType)){
            $this->successJson();
        }else{
            $this->msgJson(lg('未知错误'));
        }
    }
}