<?php
namespace model;
/**
 * Class element
 * @package model
 */
class files extends \model
{
    public $table = 'files';
    public $key = 'fileid';
    public $fileroot = '';

	public function __construct()
    {
		parent::__construct();
		$this->fileroot = \mvc::$cfg['dir']['files'];
	}
	
    /**
     * 添加文件记录
     * @param string $reqfilename 原始文件名
     * @param string $filename 本地文件路径
     * @param string $dir 存储目录
     * @param string $filebase 文件基础名
     * @param string $extname 扩展名
     * @param string $category 分类
     * @param string $item 项目
     * @param array|null $params 额外参数
     * @param bool $keep 是否保持相同文件名
     * @param int $isOss 是否存储在OSS (新增参数)
     * @param string $ossPath OSS路径 (新增参数)
     * @return int|bool
     */
    public function add($reqfilename, $filename, $dir, $filebase, $extname, $category, $item, $params = null, $keep = false, $isOss = 0, $ossPath = '',$ossVerId='')
    {
        if ($extname == 'jpeg') $extname = 'jpg';
        $cfg = \mvc::$cfg['upload']['category'][$category]['items'][$item];
        $fileType = $cfg['filetype'];
        $remark = str_replace('.' . strtolower($extname), '', strtolower(basename($reqfilename)));
        
        // 如果是OSS存储，则不需要计算本地文件的CRC32
        $crc32 = strtoupper(dechex(crc32(file_get_contents($filename))));
        
        $data = [
            'filename' => $dir . '/' . $filebase . '.' . $extname,
            'fileextname' => $extname,
            'fileremark' => $remark,
            'filetype' => $fileType,
            'file_category' => $category,
            'file_item' => $item,
            'file_time' => getNowTime(),
            'file_crc32' => $crc32,
            'filepath' => $dir,
            'filebasename' => $filebase,
            'file_isoss' => $isOss,
            'file_oss_path' => $ossPath,
            'file_oss_verid'=> $ossVerId
        ];
        
        $newid = 0;
        if ($keep) {
            if($isOss)
            {
                $where = [
                    'fileremark' => $remark,
                    'file_category' => $category,
                    'file_item' => $item,
                    'file_oss_path' => $ossPath
                ];
            }else{
                $where = [
                    'fileremark' => $remark,
                    'file_category' => $category,
                    'file_item' => $item,
                    'file_crc32' => $crc32
                ];
            }
            
            if ($row = $this->db->get($this->table, [$this->key], $where)) {
                $newid = $row['fileid'];
                $this->delete($newid, false);
            }
            if ($newid) {
                $this->db->update($this->table, $data, [$this->key => $newid]);
            }
        }
        
        if ($newid == 0) {
            $this->db->insert($this->table, $data);
            $newid = $this->db->id();
        }
        
        // 如果是图片类型，处理缩略图
        if ($fileType == 'image') {
            $uploadfilename = $filename;
            $image = make(\lib\image::class, 100);
            if (isset($cfg['tojpeg']) && $cfg['tojpeg'] && $extname != 'jpg' && !$isOss) {
                $dist = $dir . '/' . $filebase . '.jpg';
                $image->ToJPG($filename,$this->fileroot.'/'.$dist,false);
                $this->updateFileextname('jpg', $newid);
                $this->updateFilename($dist, $newid);
                $filename = $this->fileroot . '/' . $dist;
                $extname = 'jpg';
            }
            if (isset($cfg['size'])) {
                // 由大到小生成缩略图
                $arrSize = $cfg['size'];
                uksort($arrSize, function($a, $b) use($arrSize) {
                    return $arrSize[$b][0] - $arrSize[$a][0];
                });
                $sizefilename = $filename;
                $orisizefilename = $filename;
                foreach ($arrSize as $key => $size) {
                    if ($key == 'small') {
                        $sizefilename = $orisizefilename;
                    }
                    $dist = $dir . '/' . $filebase . $key . '.'.$extname;
                    $watermark = \mvc::$cfg['dir']['static'] . '/images/watermark/' . $category . '/' . $item . '.png';
                    if (file_exists($watermark)) {
                        try {
                            $image->ResizeWatermark($sizefilename, $this->fileroot . '/' . $dist, $size[0], $size[1], $watermark);
                        } catch (\Exception $e) {
                            $newid = 0;
                        }
                    } else {
                        try {
                            $image->Resize($sizefilename, $this->fileroot . '/' . $dist, $size[0], $size[1]);
                        } catch (\Exception $e) {
                            $newid = 0;
                        }
                        $sizefilename = $this->fileroot . '/' . $dist;
                    }
                }
            }
            if ($newid == 0) {
                @unlink($filename);
            }
        }
        
        return $newid;
    }
    
    /** 生成各size图片及水印图片
     * @return bool
     */
    public function buildAllImage($category, $item, $filename)
    {
        $image = makeOne(\lib\image::class, 100);
        $cfg = \mvc::$cfg['upload']['category'][$category]['items'][$item];
        $info = explode('.', basename($filename));
        $extname = strtolower(end($info));
        $filebase = $info[0];
        $dir = dirname($filename);
        if (isset($cfg['tojpeg']) && $cfg['tojpeg'] && $extname != 'jpg') {
            $dist = $dir . '/' . $filebase . '.jpg';
            $image->ToJPG($filename, $dist, false);
            $filename = $dist;
        }
        if (isset($cfg['size'])) {
            // 由大到小生成缩略图
            $arrSize = $cfg['size'];
            uksort($arrSize, function($a, $b) use($arrSize) {
                return $arrSize[$b][0] - $arrSize[$a][0];
            });
            $sizefilename = $filename;
            foreach ($arrSize as $key => $size) {
                $dist = $dir . '/' . $filebase . $key . '.jpg';
                $watermark = \mvc::$cfg['dir']['static'] . '/images/watermark/' . $category . '/' . $item . '.png';
                if (file_exists($watermark)) {
                    try {
                        $image->ResizeWatermark($sizefilename, $dist, $size[0], $size[1], $watermark);
                    } catch (\Exception $e) {
                        $newid = 0;
                    }
                } else {
                    try {
                        $image->Resize($sizefilename, $dist, $size[0], $size[1]);
                    } catch (\Exception $e) {
                        $newid = 0;
                    }
                    $sizefilename = $dist;
                }
            }
        }
    }

    /**
     * @param $fileids
     * @param $isDeleteFileID 是否删除文件记录，false = 只删除文件
     * @return bool
     */
    public function delete($fileids, $isDeleteFileID = true)
    {
        $rows = $this->db->select($this->table, '*', ['fileid' => $fileids]);
        $result = true;
        if ($isDeleteFileID) {
            $result = $this->db->delete($this->table, ['fileid' => $fileids]);
        }
        $dir = \mvc::$cfg['dir']['files'];
        if ($result !== false) {
            if (!empty($rows)) {
                foreach ($rows as $row) {
                    
                    $cfg = \mvc::$cfg['upload']['category'][$row['file_category']]['items'][$row['file_item']];
                    $filename = ltrim($row['filename'], '/');
                    if (file_exists($dir . '/' . $filename)) {
                        unlink($dir . '/' . $filename);
                    }
                    $initfile = substr($filename, 0, strrpos($filename, '.')) . '.' . $row['fileextname'];
                    if (file_exists($dir . '/' . $initfile)) {
                        unlink($dir . '/' . $initfile);
                    }
                    if ($cfg['size']) {
                        foreach ($cfg['size'] as $key => $size) {
                            $filename = substr(ltrim($row['filename'], '/'), 0, strlen($row['fileextname']) * -1 - 1) . $key . '.' . $row['fileextname'];
                            if (file_exists($dir . '/' . $filename)) {
                                unlink($dir . '/' . $filename);
                            }
                        }
                    }
                    
                }
            }
        } else {
            return false;
        }
        return true;
    }

    /**
     * 更新指定文件ID的文件名
     */
    public function updateFilename($filename, $fileId)
    {
        return $this->db->update($this->table, ['filename' => $filename], ['fileid' => $fileId]);
    }

    /**
     * 取指定文件ID的文件名
     */
    public function getFilename($fileId)
    {
        return $this->db->get($this->table, 'filename', ['fileid' => $fileId]);
    }

    /**
     * @param 删除JSON格式保存的文件
     * @param $photoList
     * @return false|\PDOStatement
     */
    public function deleteJsonFile($table, $jsonField, $keyField, $keyValue, $fileId)
    {
        $temp = $this->db->get($table, $jsonField, [$keyField => $keyValue]);
        if (!empty($temp)) {
            $temp = json_decode($temp, true);
            foreach ($temp as $k => $v) {
                if ($v['fileid'] == $fileId) {
                    unset($temp[$k]);
                }
            }
        }
        make(\model\files::class)->delete($fileId);
        return $this->db->update($table, [$jsonField => is_array($temp) && !empty($temp) ? json_encode($temp) : ''], [$keyField => $keyValue]);
    }

    public function updateFileextname($fileextname, $fileId)
    {
        return $this->db->update($this->table, ['fileextname' => $fileextname], ['fileid' => $fileId]);
    }
}