<?php
namespace app\controller\manager;

use app\model\{File as MFile, Archives, Block, Category, Link, Slide, Log};
use app\service\Tool;

class File extends Base
{
    protected $noNeedLogin = ['delPath', 'del', 'unuse', 'getAllFilesInUse', 'list', 'index'];
    //删除磁盘上的文件
    public function delPath()
    {
        if ($this->request->isPost()) {
            $paths = input('post.paths/a');
            if(!empty($paths)){
                foreach($paths as $path){
                    Tool::delFile($path);
                }
                Log::write('file', 'delPath', '批量删除了磁盘文件,涉及到的文件路径为:' . implode(',', $paths));
                return $this->json();
            }
            return $this->json(2, '待删除文件列表为空');
        }
        return $this->json(1, '非法请求!');
    }
    //删除文件记录
    public function del()
    {
        if ($this->request->isPost()) {
            $ids = input('post.ids/a');
            if(empty($ids) || !is_array($ids)) {
                return $this->json(2, '参数错误,请核对之后再操作!');
            }
            $items = MFile::getListByIds($ids);
            if(!empty($items)){
                $delIds = [];
                foreach($items as $item){
                    $delIds[] = $item['id'];
                    if($item['type'] == MFile::IMG){
                        Tool::delFile($item['src'], 1);
                    }else{
                        Tool::delFile($item['src']);
                    }
                }
                MFile::destroy($delIds);
                Log::write('file', 'del', '批量删除了文件,涉及到的文件ID为:' . implode(',', $delIds));
                return $this->json();
            }else{
                return $this->json(3, '待删除文件列表为空');
            }
        }
        return $this->json(1, '非法请求!');
    }
    /**
     * 未使用文件列表,
     * 1. 遍历数据库中使用的图片视频及文件路径
     * 2. 遍历上传目录中的文件
     * 3. 数据对比,找出存在目录中的文件&不在数据库中的文件
     * 4. 页面上显示查找出来的文件
    */
    public function unuse()
    {
        $filesInUse = $this->getAllFilesInUse();    //数据库中在使用的文件
        $rootPath = app()->getRootPath();
        $uploadPath = $rootPath . 'storage';
        $uploadedFiles = getAllFilesByPath($uploadPath, $rootPath); //磁盘上上传的文件
        $files = MFile::getAll();
        $dbUploadedFiles = [];  //数据库中上传的文件
        foreach($files as $file){
            $src = trim($file['src']);
            if(!empty($src)){
                $key = getKeyByPath($src);
                $dbUploadedFiles[$key] = $file;
            }
        }

        $uploadedNotInUseFiles = array_diff_key($uploadedFiles, $filesInUse);   //磁盘上上传未使用的文件
        $dbUploadedNotInUseFiles = array_diff_key($dbUploadedFiles, $filesInUse);    //数据库中上传未使用的文件
        $bothNotInUseFiles = array_intersect_key($uploadedNotInUseFiles, $dbUploadedNotInUseFiles);  //磁盘和数据库中,两边都未使用
        $this->data['uploadedNotInUseFiles'] = $uploadedNotInUseFiles;
        $this->data['dbUploadedNotInUseFiles'] = $dbUploadedNotInUseFiles;
        $this->data['bothNotInUseFilesKey'] = array_keys($bothNotInUseFiles);
        return $this->view();
    }

    //获取所有在使用的文件
    private function getAllFilesInUse()
    {
        $files = [];
        $blockFiles = Block::getFilesInUse();
        if(!empty($blockFiles)){
            $files = array_merge($files, $blockFiles);
        }
        $slideFiles = Slide::getFilesInUse();
        if(!empty($slideFiles)){
            $files = array_merge($files, $slideFiles);
        }
        $linkFiles = Link::getFilesInUse();
        if(!empty($linkFiles)){
            $files = array_merge($files, $linkFiles);
        }
        $categoryFiles = Category::getFilesInUse();
        if(!empty($categoryFiles)){
            $files = array_merge($files, $categoryFiles);
        }
        $articleFiles = Archives::getFilesInUse();
        if(!empty($articleFiles)){
            $files = array_merge($files, $articleFiles);
        }
        return $files;
    }


    //ajax获取文件列表
    public function list()
    {
        if($this->request->isAjax()){
            $page = input('param.page/d', 1);
            $size = input('param.size/d', 20);
            if(!is_integer($page) || $page < 1){
                $page = 1;
            }
            if (!is_integer($size) || $size < 1) {
                $size = 20;
            }
            $type = input('param.type', '');
            if(!in_array($type, array_keys(MFile::getTypes()))){
                $type = '';
            }
            $items = MFile::getList($type, $page, $size);
            return $this->json(0, 'ok', $items);
        }
        return $this->json(1, '无此操作');
    }
    //列表
    public function index()
    {
        $items = MFile::getListPage();
        $this->data['items'] = $items;
        $this->data['types'] = MFile::getTypes();
        return $this->view();
    }
}