<?php

namespace model\import;

use \model;
use \model\alioss;
use model\pro\pro;
use ZipArchive;

class uploadProPicZip extends model
{
    public function uploadCheck($filecount, $reqfilename, $reqfilesize, $uploadID, $extname, $category, $item, $params)
    {
        if (strtolower($extname) !== 'zip') return lg('仅支持') . ' zip';
        return true;
    }

    public function uploadGet($fileid, $zipFilename, $dir, $filebase, $extname, $category, $item, $params)
    {
        ini_set('memory_limit', \mvc::$cfg['upload']['memory_limit']);
        set_time_limit(0);
        ignore_user_abort(true);
       
        $resultFiles = [];
        $zip = new ZipArchive();
        $pro = new pro();
        if ($zip->open($zipFilename) === true) {
            $pic_style = isset($params['pic_style']) ? strtolower($params['pic_style']) : '';
            $globalInnum = isset($params['p_innum']) ? trim($params['p_innum']) : '';
            $tmpBase =  \mvc::$cfg['dir']['cache'];
            $tmpDir = $tmpBase . '/propic_zip_' . uniqid();
            @mkdir($tmpDir, 0777, true);

            $cfg = \mvc::$cfg['upload']['category'][$category]['items'][$item];

            for ($i = 0; $i < $zip->numFiles; $i++) {
                $entry = $zip->getNameIndex($i);
                if (!$entry) continue;

                $entryPath = str_replace('\\', '/', $entry);
                $lower = strtolower($entryPath);
                $pathParts = explode('/', $entryPath);
                //提取产品的物料编码
                $incode = $globalInnum;
                if($incode === ''){
                    if(count($pathParts) < 2) continue;
                    $cand = '';
                    if(count($pathParts) >= 3){
                        $cand = strtoupper(trim($pathParts[count($pathParts)-2]));
                    }else{
                        $cand= strtoupper(trim($pathParts[0]));
                    }
                    if($cand==='') continue;
                    $pid = $pro->getPidByNumber($cand);
                    if(!$pid){
                        $invalidCodes[$cand] = true;
                        continue;
                    }           
                    $incode = $cand;
                }else{
                    $incode = strtoupper($incode);
                    $pid = $pro->getPidByNumber($incode);
                    if(!$pid){
                        $invalidCodes[$incode] = true;
                        continue;
                    }
                }

                // 检查是否为图片文件
                if (preg_match('/\.(jpg|jpeg|png|gif|bmp|webp|mp4|avi|mov|wmv|flv|mkv)$/i', $lower) === 1) {
                    $entryPath = ltrim($entryPath, '/');
                    $baseName = basename($entryPath);

                    // 创建临时文件路径
                    $tempFilePath = $tmpDir . '/' . $entryPath;
                    $tempDirPath = dirname($tempFilePath);

                    // 确保临时目录存在
                    @mkdir($tempDirPath, 0777, true);

                    // 提取文件到临时目录
                    if ($zip->extractTo($tmpDir, $entryPath)) {
                        // 添加到结果数组（包含临时文件路径）
                        if(file_exists($tempFilePath) && filesize($tempFilePath) > 0){
                            $resultFiles[] = [
                                'temp_path' => $tempFilePath,
                                'original_name' => $baseName,
                                'pic_style' => $pic_style,
                                'p_id'=>$pid
                            ];
                        }else{
                            // 如果文件不存在或大小为0，删除临时文件（如果存在）并记录错误
                            if(file_exists($tempFilePath)){
                                @unlink($tempFilePath);
                            }
                            error_log("提取文件失败或文件大小为0: " . $entryPath);
                        }
                    }
                }
            }
            $zip->close();

            return [
                'files' => $resultFiles,
                'total_count' => count($resultFiles),
                'temp_dir' => $tmpDir  // 返回临时目录路径
            ];
        }
    }

    public function removeDir($dir)
    {
        if (!is_dir($dir)) return;
        $items = scandir($dir);
        foreach ($items as $it) {
            if ($it === '.' || $it === '..') continue;
            $path = $dir . '/' . $it;
            if (is_dir($path)) {
                $this->removeDir($path);
            } else {
                @unlink($path);
            }
        }
        @rmdir($dir);
    }


    /**检测图片上传
     * @param 
     * @return
     */
	public function uploadImageCheck($filecount,$reqfilename,$reqfilesize,$uploadID,$extname,$category,$item,$params)
	{
		$pid = $params['pid'];
		if(empty($pid)) {
			throw new \Exception ( '上传产品'.($item!='video' ? '图片' : '视频').'时，产品ID丢失' );
		}
		$cfg = \mvc::$cfg['upload']['category'][$category]['items'][$item];
		$count = $this->db->count('pro_pic',['pic_p_id'=>$pid,'pic_style'=>$item]);
		if( ($count+1) > $cfg['maxfile']){
			return lg('超出此项的最大允许的文件数量') .','. lg('最大允许').' '.$cfg['maxfile'].' '.lg('个文件');
		}else{
			return true;
		}
	}

    /**接收上传的图片处理
     * @param 
     * @return
     */
	public function uploadImageGet($fileid,$filename,$dir,$filebase,$extname,$category,$item,$params)
	{
		$pid = $params['pid'];
		if(empty($pid)) {
			throw new \Exception ( '上传产品图片时，产品ID丢失' );
		}
        $pic_style = $params['pic_style'] ?? '';
		
		$oldfilename = basename($params['reqfilename']);
		$oldfilename = substr($oldfilename,0,strrpos($oldfilename,'.'));

        // 初始化OSS客户端
        $oss = new alioss();
        // 上传到OSS
        $fullObjectName = $dir.'/'.$filebase.'.'.$extname;
        $localPath  = \mvc::$cfg['dir']['files'].'/'.$dir.'/'.$filebase.'.'.$extname;
        $uploadSuccess = $oss->putObjectWithVersioning($fullObjectName, $localPath);

        if (!$uploadSuccess) {
            return exitJson(-1, '上传到OSS失败');
        }
        if(!$uploadSuccess['success']) {
            return exitJson(-1, 'OSS返回错误' . json_encode($uploadSuccess));
        }
        // 更新表files记录，设置isOss=1和ossPath
        $this->db->update('files',['file_isoss'=>1,'file_oss_path'=>$fullObjectName,'file_oss_verid'=>$uploadSuccess['versionId']],['fileid'=>$fileid]);
        //把本地原始图片删掉
        @unlink($localPath);
        // 保存到pro_pic表
        if($item=='init_add' || $item=='beautify_add'||$item=='beautify' || $item=='init'){
			$status = 0;
		}else{
			$status = 1;
		}
        $cfg = \mvc::$cfg['upload']['category'][$category]['items'][$item];
        $type = $cfg['filetype']=='video' ? 'video' : 'img';
        $this->saveProPicRecord($pid, $fileid, $item, $type, $oldfilename, $filebase,$status);
        if(!in_array($item,['oem','other','video','competitor'])){
            $this->submitPicTask($pid); //完成上传原始图任务
        }
	}

    /**
     * 任务 - 完成上传原始图
     * @param string $p_id
     * @return mixed
     */
    public function submitPicTask($p_id)
    {
        $date = getNowDate();
        $now = getNowTime();
        $data = [
            'ppt_submit_user'=>getOpuser(),
            'ppt_submit_time'=>$date,
            'ppt_update_time'=>$now,
        ];
        $this->db->update('pro_pic_task',$data,['ppt_p_id'=>$p_id]);
    }

    /**
     * 上传单个文件到OSS并保存记录
     */
    public function uploadSingleFileToOSS($tempPath, $originalName, $picStyle, $pid)
    {
        try {

            if (!file_exists($tempPath)) {
                return exitJson(-1,'临时文件不存在: ' . $tempPath);
            }
            if(filesize($tempPath) == 0){
                return exitJson(-1,'临时文件大小为0: ' . $tempPath);
            }
            // 获取文件扩展名
            $extension = strtolower(pathinfo($tempPath, PATHINFO_EXTENSION));

            // 初始化OSS客户端
            $oss = new alioss();

            // 生成唯一的文件名（按规范命名）
            $uploadID = guid();
            $fileNameWithoutExt = pathinfo($originalName, PATHINFO_FILENAME);

            // 根据产品ID和类型生成OSS存储路径
            $objectName = call_user_func(\mvc::$cfg['upload']['category']['pro']['path'], $uploadID,$picStyle, $extension, ['pid' => $pid], $fileNameWithoutExt);
            $filebase = call_user_func(\mvc::$cfg['upload']['category']['pro']['filebase'], $uploadID,$picStyle, $extension, ['pid'=>$pid], $fileNameWithoutExt);
            $fullObjectName = $objectName . '/' . $filebase . '.' . $extension;
            mkdirs(\mvc::$cfg['dir']['files'].'/'.$objectName);
            // 上传到OSS
            $uploadSuccess = $oss->putObjectWithVersioning($fullObjectName, $tempPath);

            if (!$uploadSuccess) {
                return exitJson(-1, '上传到OSS失败');
            }
            if(!$uploadSuccess['success']) {
                return exitJson(-1, 'OSS返回错误' . json_encode($uploadSuccess));
            }

            // 保存到files表
            $filesModel = make(\model\files::class);
            $fileParams = ['pic_style' => $picStyle];

            $fid = $filesModel->add(
                $originalName,      // $reqfilename
                $tempPath,          //原始图片路径
                $objectName,        // $dir
                $filebase,          // $filebase - 使用规范的文件名
                $extension,         // $extname
                'proimage',              // $category
                $picStyle,              // $item
                $fileParams,        // $params
                false,              // $keep
                1,                  // $isOss = 1 表示存储在OSS
                $fullObjectName,     // $ossPath,
                $uploadSuccess['versionId']
            );

            if (!$fid) {
                // 如果数据库保存失败，尝试删除OSS上的文件
                $oss->deleteObject($fullObjectName);
                return exitJson(-1, '保存文件记录失败');
            }
            $picStyle=='video' ? $type='video' : $type='img';
            if($picStyle=='init_add' || $picStyle=='beautify_add'||$picStyle=='beautify' || $picStyle=='init'){
                $status = 0;
            }else{
                $status = 1;
            }
            // 保存到pro_pic表
            $this->saveProPicRecord($pid, $fid, $picStyle, $type, $originalName, $filebase,$status);

            return [
                'success' => true,
                'data' => [
                    'fileid' => $fid,
                    'oss_path' => $fullObjectName
                ]
            ];
        } catch (Exception $e) {
            return ['success' => false, 'error' => $e->getMessage()];
        }
    }

    /**
     * 保存图片记录到pro_pic表
     */
    public function saveProPicRecord($pid, $fileid, $picStyle, $type, $originalName, $filebase,$status=0)
    {
        $pro = make(\model\pro\pro::class);
        $db = $pro->getDb();

        // 检查记录是否已存在
        $existing = $db->select('pro_pic', '*', [
            'pic_p_id' => $pid,
            'pic_fileid' => $fileid
        ]);

        if (empty($existing)) {
            // 插入新记录
            $db->insert('pro_pic', [
                'pic_p_id' => $pid,
                'pic_fileid' => $fileid,
                'pic_sup_id' => 0, // 默认供应商ID
                'pic_status' => $status, // 0表示初始状态，1表示已审核
                'pic_type' => $type,
                'pic_style' => $picStyle,
                'pic_filebase' => $originalName, // 保存规范的文件名
                'pic_sort' => 0,
                'pic_opuser' => getOpuser(),
                'pic_create_time' => date('Y-m-d H:i:s'),
                'pic_update_time' => date('Y-m-d H:i:s')
            ]);
        }
    }
}