import pprint
import base64
from pathlib import Path
import json

disk_root = "D:\\projects\\scriptiot\\evm_app_store_files"

class FileManager(object):
    def __init__(self) -> None:
        pass

    '''
    @description: 根据前端传递的路径参数，获取该路径的目录以及文件信息，文件类别，可以看做是一个盘符
    @param {*} self
    @return {*}
    '''
    def initialize(self):
        '''
        disks: {
            files: {driver: "local"},
            images: {driver: "local"}
        }
        lang: "en"
        leftDisk: null
        rightDisk: null
        windowsConfig: 2
        '''

        result = {
            "disks": {},
            "lang": "zh",
            "leftDisk": None,
            "rightDisk": None,
            "windowsConfig": 1
        }

        # 这里需要过滤，有些目录只能管理员才能查看
        p = Path(disk_root)
        for child in p.iterdir():
            if child.is_dir():
                result["disks"].update({
                    child.name: { "driver": "local" }
                })

        return result

    '''
    @description: 获取当前类别的目录信息
    @param {*} self
    @return {*}
    '''
    def content(self, disk, target_path='/'):
        '''
        目录信息结构体：
        {
            basename: "docs"
            dirname: ""
            path: "docs"
            timestamp: 1556821372
            type: "dir"
        },
        {
            basename: "cars"
            dirname: "wallpapers"
            path: "wallpapers/cars"
            timestamp: 1544277291
            type: "dir"
        }

        文件信息结构体：
        {
            basename: "alfa.sql"
            dirname: "code"
            extension: "sql"
            filename: "alfa"
            path: "code/alfa.sql"
            size: 3208
            timestamp: 1544277274
            type: "file"
        }
        '''

        target_path = Path(target_path)
        result = {
            "directories": [],
            "files": []
        }

        disk_path = Path(disk_root).joinpath(disk)
        if not disk_path.exists():
            return result
            
        target_path = disk_path.joinpath(target_path)
        if not target_path.exists():
            return result

        for child in target_path.iterdir():
            if child.is_dir():
                result["directories"].append({
                    "basename": child.name,
                    "dirname": child.parent.relative_to(disk_path).as_posix(),
                    "path": child.resolve().relative_to(disk_path).as_posix(),
                    "timestamp": int(child.stat().st_mtime),
                    "type": "dir"
                })
            else:
                result["files"].append({
                    "basename": child.name,
                    "dirname": child.parent,
                    "extension": child.suffix[1:],
                    "filename": child.stem,
                    "path": child.resolve().relative_to(disk_path).as_posix(),
                    "size": child.stat().st_size,
                    "timestamp": int(child.stat().st_mtime),
                    "type": "file"
                })

        with open("result.json", "w") as f:
            json.dump(result, f)
            f.seek(0)
            f.truncate()
            f.write(json.dumps(result, ensure_ascii=True))

        pprint.pprint(result)
        return result

    '''
    @description: 获取目录结构树
    @param {*} self
    @return {*}
    '''
    def tree(self, disk, target_path="/"):
        '''
        {
            basename: "trees"
            dirname: "wallpapers/nature"
            path: "wallpapers/nature/trees"
            props: {
                hasSubdirectories: false
            }
            timestamp: 1544277291
            type: "dir"
        }
        '''

        target_path = Path(target_path)
        result = []
        rp = Path(disk_root)
        disk_path = rp / disk
        if not disk_path.exists():
            return result

        temp_path = disk_path.joinpath(target_path)
        if not temp_path.exists():
            return result

        p = Path(disk_path)
        for child in p.iterdir():
            if child.is_dir():
                result.append({
                    "basename": child.name,
                    "dirname": child.parent.relative_to(rp).as_posix(),
                    "path": child.relative_to(rp).as_posix(),
                    "props": {
                        "hasSubdirectories": True if child.iterdir() else False
                    },
                    "timestamp": int(child.stat().st_mtime),
                    "type": "dir"
                })
            # print("//////////", child.is_dir(), child.resolve(), child.name, child.parent, child.root, child.relative_to(rp))
        pprint.pprint(result)

        return result

    def selectDisk(self, disk):
        print(disk)
        return True

    def download(self, disk):
        print(disk)
        return True

    def preview(self, disk, target_file):
        # 预览图片
        img_stream = None
        if not target_file:
            target_file = './evue_photo.png'
        with open(target_file, 'rb') as img_f:
            img_stream = img_f.read()
            img_stream = base64.b64encode(img_stream).decode()
        print(disk, target_file)
        return img_stream

fileManager = FileManager()

if __name__ == "__main__":
    '''
    python -m memory_profiler example.py
    '''
    # from memory_profiler import profile
    # @profile
    # def test():
    #     pass

    result = fileManager.initialize()
    print("----->", result)
    
    result = fileManager.content("uploads", "evueapps/evm")
    print(">>>>>>", result)

    result = fileManager.tree("uploads", "evueapps/evm")
    print("=====>", result)

    result = fileManager.preview("uploads", "evueapps/evm")
    print("$$$$$>", result)