<?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'];
	}
    //$keep = true 如果存在当前分类下文件名相同的，则不创建新ID,使用原文件ID
	public function add($reqfilename,$filename,$dir,$filebase,$extname,$category,$item,$params=null,$keep=false)
    {
        if($extname=='jpeg') $extname = 'jpg';
		$cfg = \mvc::$cfg['upload']['category'][$category]['items'][$item];
		$fileType = $cfg['filetype'];
		$remark = str_replace('.'.strtolower($extname),'',strtolower($reqfilename));
        $data = [
            'filename' => $dir.'/'.$filebase.'.'.$extname,
			'fileextname'=>$extname,
            'fileremark' => $remark,
            'filetype' => $fileType,
            'file_category' => $category,
            'file_item' => $item,
            'file_time' => getNowTime()
        ];
        $newid = 0;
        if($keep || (isset($cfg['keepFilename']) && $cfg['keepFilename'])){
            $where = [
                'fileremark'=>$remark,
                'file_category' => $category,
                'file_item' => $item
            ];
            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'){
				$dist = $dir.'/'.$filebase.'.jpg';
				$image->ToJPG($filename,$this->fileroot.'/'.$dist,false);
				$this->updateFilename($dist,$newid);
				$filename = $this->fileroot.'/'.$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,$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]);
    }
}