import threading
from queue import SimpleQueue as Queue
from time import sleep

from model.Workflow import Workflow
from workflow.video import quick_split_video
from workflow.worker import do_workflow

from . import LOGGER


IS_LIVING = threading.Event()
IS_ENCODING = threading.Event()
IS_UPLOADING = threading.Event()
ENCODING_QUEUE: "Queue[Workflow]" = Queue()


class Bilibili(threading.Thread):

    def __init__(self) -> None:
        super().__init__()
        self.parts = []

    def run(self) -> None:
        while True:
            if ENCODING_QUEUE.empty():
                sleep(5)
                if len(self.parts) > 0 and not IS_UPLOADING.is_set():
                    self.do_upload()
            else:
                workflow_item = ENCODING_QUEUE.get()
                LOGGER.info("收到工作流请求:ID:【{}】".format(workflow_item.id))
                for video_clip in workflow_item.video_clips:
                    IS_ENCODING.set()
                    try:
                        LOGGER.info("工作流视频:ID:【{}】,路径:【{}】".format(video_clip.id, video_clip.full_path))
                        if len(video_clip.danmaku_clips) < 1:
                            _parts = quick_split_video(video_clip.full_path)
                        else:
                            _parts = do_workflow(video_clip.full_path, video_clip.danmaku_clips[0].full_path)
                        LOGGER.info("工作流视频压制完成:结果:【{}】".format(_parts))
                        for _part in _parts:
                            self.parts.append(_part)
                    except:
                        LOGGER.error("压制异常!工作流视频:ID:【{}】,路径:【{}】".format(video_clip.id, video_clip.full_path))
                    finally:
                        IS_ENCODING.clear()

    def do_upload(self):
        LOGGER.info("尝试投稿:内容【{}】".format(self.parts))
        self.clear()

    def clear(self):
        self.parts = []



INSTANCE = Bilibili()