<?php
namespace admin\action\pro;

use model\aiImage;
use model\alioss;
use model\pro\picTpl;

/**
 * Class imageAction
 * @package admin\action\pro
 */
class imageAction extends \action
{
    private $image;
	public function __construct()
    {
		$this->image = makeOne(\model\pro\image::class);
	}
	
    function list()
    {   
        $req = \mvc::$req;
        \view::set('cfg',json_encode($this->image->options));
        \view::set('req',$req);
        \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->getCodeList($req,$rules);
        $needPicFilter = !empty($rules['objectVer']) || !empty($rules['langs']);
        $rows = [];
        if($data['rows'])
        {   
            $pidArr = array_unique(array_column($data['rows'],'p_id'));
            $filesArr =  $this->image->getFilesByPidArr($pidArr,$rules['propictype'],$rules);
            foreach($data['rows'] as $row){
                $files = $filesArr[$row['p_id']]??[];
                if($needPicFilter && empty($files)){
                    continue;
                }
                foreach($files as $k=>$v){
                    $row[$k] = $v['filebase'];
                    $row['picinfo'][$k] = $v;
                }
                $rows[] = $row;
            }
        }
		
        $data['rows'] = $rows;
        $this->successJson($data);
    }
    
    public function openimage($pid,$fileid,$propicType,$cate)
    {     
        $req = \mvc::$req; 
        //前置条件
		$rules = $this->urlRulesToWhere($req);
        $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);
        if($propicType == 'video'){
            \view::put('pro/image/openvideo');
        }else{
            \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['pic_p_id'],
			    'fileid' => $file['pic_fileid'],
			    'outnum' => $file['pic_outnum'],
			    'innum' => $file['pic_innum'],
			    'smallfile' => $file['smallfile'],
			    'bigfile' => $file['bigfile'],
			    'filename' => $file['filename'],
			    'initfile' => $file['initfile'],
				'filebase' => strtoupper($file['pic_filebase']),
				'remark' => $file['pic_remark'],
                'lang' => $file['pic_lang'],
				'fileremark' => $file['fileremark'],
				'ischecked' => ($file['pic_status']=='1'),
				'isback' => $file['isback'],
				'back' => $file['back'],
				'isreplay' => $file['isreplay'],
				'replay' => $file['replay'],
				'isdesexport' => !empty($file['pic_desexport_time']),
				'desexport_time' => $file['pic_desexport_time'],
				'update_time' => $file['pic_update_time'],
                'pic_check_time' => $file['pic_check_time'],
                'tags' => $file['pic_tags'],
                'filetype' => $file['filetype'],
                'lang' => $file['pic_lang'],
				// 'isusa' => ($file['pic_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'].'/frey_'.$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=[];
        $alioss = new alioss();
        foreach($fileids as $v){
            list($pid,$fileid) = explode('_',$v);
            if($row = $this->image->getFileByFileId($pid,$fileid)){
                // if($req['onlyMain']=='1' && $row['pic_innum']!=$row['pic_filebase']){
                //     continue; //只导出主图
                // }
                $filebasename = $row['p_innum'];
                if(!isset($names[$filebasename])) 
                    $names[$filebasename] = 0;
                else
                    $names[$filebasename]++;
                $extname = 'jpg';
                $t = explode('_',$row['pic_filebase']);
                if(isset($t[1])){
                    $filebasename .= '_'.end($t);
                }else{
                    $bu = ($names[$filebasename]>0) ? '_'.$names[$filebasename] : '';
                    $filebasename .= $bu;
                }
              
                $src = \mvc::$cfg['dir']['files'].'/'.substr($row['filename'],0,strrpos($row['filename'],'.')).'.'.$row['fileextname'];
                $filename = $filebasename.'.'.$row['fileextname'];
                $extname = $row['fileextname'];
                //如果是oss上的文件，先下载到本地临时目录
                if($row['file_isoss']){
                    $contents = $alioss->getObjectContent($row['file_oss_path'],$row['file_oss_verid']);
                    if($contents!==false){
                        file_put_contents($src,$contents);
                    }else{
                        continue; //下载失败则跳过
                    }
                } 
                $ossFileList = [];
                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);
                    }
                    array_push($ossFileList,$src);
                    //设计师导出标记
                    if($propicType == 'designer'){
                        $this->image->updateDesexportTime($pid,$fileid);
                    }
                    // //精修图导出标记
                    // if($propicType == 'beautify'){
                    //     $this->image->setProState($pid,0,['beautify']);
                    // }      
                }
            }
        }
        $zip->close();
        foreach($tmpFileList as $file){
            unlink($file);
        }
        foreach($ossFileList 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,$isbeautify)
    {
        if($this->image->saveChecks($pid,$items,$propicType,$isbeautify)){
            $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('未知错误'));
        }
    }

    /**
     * @method 任务清单
     * @author zhengweihua 
     * @copyright 2026-03-10
     */
    public function taskList()
    {
        $req = \mvc::$req;
        \view::set('req', $req);
		\view::put('');
    }

    /**
     * @method 获取任务清单数据
     * @author zhengweihua 
     * @copyright 2026-03-10
     */
    public function getTaskList()
    {
        $req = \mvc::$req;
        $rules = $this->urlRulesToWhere($req);
		$data = $this->image->getTaskList($req,$rules);
        $this->successJson($data);
    }

    public function addTask()
    {
        $req = \mvc::$req;
        if($this->image->addPicTask($req['p_id'])){
            $this->successJson();
        }else{
            $this->msgJson(lg('未知错误'));
        }
    }

    /**
     * @method 删除任务
     * @author zhengweihua 
     * @copyright 2026-03-16
     */
    public function delTaskData()
    {
        $req = \mvc::$req;
        if(!isset($req['ids'])){
            $this->errorJson(-1,'请选择要删除的数据');
        }
        $ids = !is_array($req['ids'])?explode(',',$req['ids']):$req['ids'];
        $data = $this->image->delTaskData($ids);
        $this->successJson($data);
    }

    public function openAiImage()
    {
        $req = \mvc::$req;
        $fileid = $req['fileid'];
        if(!$fileid){
            $this->errorJson(-1,'请选择图片');
        }
        $picTpl = new picTpl();
        $posterTemplates = $picTpl->getAllTplList();

        $pro = $this->image->getProByFieId($fileid);
        $file = $this->image->getFileMoreById($fileid);
        $file['base64src'] = $picTpl->imageToBase64($file['bigfile']);
        if(\mvc::$cfg['aiimg']['automatting']){
            $aiImage = new aiImage(); //自动抠图
            $file['base64src_ai'] = $aiImage->matting([
                'source' => $file['base64src']
            ]);
        }
        \view::set('automatting', \mvc::$cfg['aiimg']['automatting']);
        \view::set('pro', $pro);
        \view::set('posterTemplates', $posterTemplates);
        \view::set('propicType',$pro['pic_style']);
        \view::set('file', $file);
        \view::set('req', $req);
        \view::put();
    }


    /**
     * 处理图片确认操作
     */
    public function dealImage()
    {
        $req = \mvc::$req;
        $fileid = $req['fileid'];
        $pid = $req['pid'];
        $processedImage = $req['processedImage'] ?? '';
        $aimatting = $req['aimatting'] ?? 0;
        $templateId = $req['templateId'] ?? null;
        
        if (!$processedImage) {
            $this->errorJson(-1,'图片数据不能为空');
        }
        
        try {
            // 验证并处理图片数据
            $imageData = $this->image->validateImageData($processedImage);
            
            if (!$imageData) {
                $this->errorJson(-1,'图片数据验证失败');
            }
            //AI抠图处理
            if($aimatting){
                $aiImage =  new aiImage();
                $imageData = $aiImage->matting([
                    'source'=>$imageData,
                ]);
                if(!$imageData){
                    $this->errorJson(-1,'AI抠图处理失败');
                }
            }
            //模板处理
            if($templateId){
                $picTpl = new picTpl();
                $imageData = $picTpl->generateImageWithTemplate($templateId, $imageData,$fileid);
            }
            if ($imageData) {
                // $this->successJson($imageData);
                $this->successJson([
                    'imagesrc' => $imageData
                ]);
            } else {
                $this->errorJson(-1,'保存失败');
            }
            
        } catch (\Exception $e) {
            $this->errorJson(-1,'确认失败：' . $e->getMessage());
        }
    }

    /**
     * @method 保存后替换原图
     * @author zhengweihua 
     * @copyright 2026-03-20
     */
    public function saveReplace()
    {
        $req = \mvc::$req;
        $fileid = $req['fileid'];
        $pid = $req['pid'];
        $processedImage = $req['imagesrc'] ?? '';
        
        if (!$processedImage) {
            $this->errorJson(-1,'图片数据不能为空');
        }
        
        try {
            // 验证并处理图片数据
            $imageData = $this->image->validateImageData($processedImage);
            
            if (!$imageData) {
                $this->errorJson(-1,'图片数据验证失败');
            }
            
            // 保存处理后的图片
            $this->image->saveProcessedImage($fileid, $imageData);
            
            $this->successJson('图片替换成功');
            
        } catch (\Exception $e) {
            $this->errorJson(-1,'替换失败：' . $e->getMessage());
        }
    }

    /**
     * @method 保存后生成精修图
     * @author zhengweihua 
     * @copyright 2026-03-20
     */
    public function saveBeautify()
    {
        $req = \mvc::$req;
        $fileid = $req['fileid'];
        $pid = $req['pid'];
        $processedImage = $req['imagesrc'] ?? '';
        
        if (!$processedImage) {
            $this->errorJson(-1,'图片数据不能为空');
        }
        
        try {
            // 验证并处理图片数据
            $imageData = $this->image->validateImageData($processedImage);
            
            if (!$imageData) {
                $this->errorJson(-1,'图片数据验证失败');
            }
            
            // 保存处理后的图片并生成精修图
            $this->image->saveBeautifyImage($fileid, $imageData);
            
            $this->successJson('精修图生成成功');
            
        } catch (\Exception $e) {
            $this->errorJson(-1,'生成失败：' . $e->getMessage());
        }
    }

    /**
     * @method 图片状态列表页 
     * @author hongzhang
     * @copyright 2026-03-30
     */
    public function imageStatus()
    {
        $req = \mvc::$req;
        \view::put();
    }

    /**
     * @method 获取商品图片状态列表
     * @author hongzhang
     * @copyright 2026-03-30
     */
    public function getProImageStatus()
    {
        $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['pwcode']) && !\p::isAdmin()){
		    $ids = \p::cates($req['pwcode']);
		    if($ids!=''){ 
		       $ids = explode(',',$ids); 
    		   $rules['p_cate'] = $ids;
		    }
		}

        $data = $this->image->getProImageStatus($req,$rules);
        $this->successJson($data);
    }

    /**
     * @method 获取商品图片报表页
     * @author hongzhang
     * @copyright 2026-03-30
     */
    public function imageReport()
    {
        $req = \mvc::$req;
        \view::put();
    }

    
    /**
     * @method 获取商品图片报表列表
     * @author hongzhang 
     * @copyright 2026-03-30
     */
    public function getProImageReport()
    {
        $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['pwcode']) && !\p::isAdmin()){
		    $ids = \p::cates($req['pwcode']);
		    if($ids!=''){ 
		       $ids = explode(',',$ids); 
    		   $rules['p_cate'] = $ids;
		    }
		}

        $data = $this->image->getProImageReport($req,$rules);
        $this->successJson($data);
    }

    /**
     * @method 批量设置图片语言
     * @author hongzhang 
     * @copyright 2026-04-02
     */
    public function setLangs()
    {
        $req = \mvc::$req;
        if(empty($req['fileids'])){
            $this->errorJson(-1,lg('请先选择图片！'));
        }
        $fileids = $req['fileids'];
        $lang = isset($req['pic_lang']) ? $req['pic_lang'] : (isset($req['lang']) ? $req['lang'] : '');
        $action = isset($req['action']) ? $req['action'] : 'set';
        if($this->image->setLangs($fileids,$lang,$action)){
            $this->successJson();
        }else{
            $this->msgJson(lg('未知错误'));
        }
    }

}
