from time import sleep
from PyQt5.QtCore import QThread, pyqtSignal, QMutex
from lanzou.api import LanZouCloud
from lanzou.debug import logger


class GetAllFoldersWorker(QThread):
    '''获取所有文件夹name与fid,用于文件移动'''
    infos = pyqtSignal(object, object)
    msg = pyqtSignal(str, int)
    moved = pyqtSignal(bool, bool, bool)

    def __init__(self, parent=None):
        super(GetAllFoldersWorker, self).__init__(parent)
        self._disk = None
        self.org_infos = None
        self._mutex = QMutex()
        self._is_work = False
        self.move_infos = None

    def set_disk(self, disk):
        self._disk = disk

    def set_values(self, org_infos):
        self.org_infos = org_infos  # 对话框标识文件与文件夹
        self.move_infos = [] # 清除上次影响
        self.start()

    def move_file(self, infos):
        '''移动文件至新的文件夹'''
        self.move_infos = infos # file_id, folder_id, f_name, type(size)
        self.start()

    def __del__(self):
        self.wait()

    def stop(self):
        self._mutex.lock()
        self._is_work = False
        self._mutex.unlock()

    def move_file_folder(self, info, no_err:bool, r_files:bool, r_folders:bool):
        """移动文件(夹)"""
        # no_err 判断是否需要更新 UI
        if info.is_file:  # 文件
            if self._disk.move_file(info.id, info.new_id) == LanZouCloud.SUCCESS:
                self.msg.emit(f"{info.name} 移动成功!", 3000)
                no_err = True
                r_files = True
            else:
                self.msg.emit(f"移动文件{info.name}失败!", 4000)
        else:  # 文件夹
            if self._disk.move_folder(info.id, info.new_id) == LanZouCloud.SUCCESS:
                self.msg.emit(f"{info.name} 移动成功!", 3000)
                no_err = True
                r_folders = True
            else:
                self.msg.emit(f"移动文件夹 {info.name} 失败!移动的文件夹中不能包含子文件夹!", 4000)
        return no_err, r_files, r_folders

    def run(self):
        if not self._is_work:
            self._mutex.lock()
            self._is_work = True
            if self.move_infos:  # 移动文件
                no_err = False
                r_files = False
                r_folders = False
                for info in self.move_infos:
                    try:
                        no_err, r_files, r_folders = self.move_file_folder(info, no_err, r_files, r_folders)
                    except TimeoutError:
                        self.msg.emit(f"移动文件(夹) {info.name} 失败,网络超时!请稍后重试", 5000)
                    except Exception as e:
                        logger.error(f"GetAllFoldersWorker error: {e=}")
                        self.msg.emit(f"移动文件(夹) {info.name} 失败,未知错误!", 5000)
                if no_err:  # 没有错误就更新ui
                    sleep(2.1)  # 等一段时间后才更新文件列表
                    self.moved.emit(r_files, r_folders, False)
            else:  # 获取所有文件夹
                try:
                    self.msg.emit("网络请求中,请稍后……", 0)
                    all_dirs_dict = self._disk.get_move_folders().name_id
                    self.infos.emit(self.org_infos, all_dirs_dict)
                    self.msg.emit("", 0)  # 删除提示信息
                except TimeoutError:
                    self.msg.emit("网络超时!稍后重试", 6000)
                except Exception as e:
                    logger.error(f"GetAllFoldersWorker error: {e=}")
            self._is_work = False
            self._mutex.unlock()
        else:
            self.msg.emit("后台正在运行,请稍后重试!", 3100)