import json

from opentelemetry.trace import Status, StatusCode

from biz.ffmpeg import parse_ffmpeg_task, start_ffmpeg_task, clear_task_tmp_file, probe_video_info
from telemetry import get_tracer
from template import get_template_def
from util import api


def start_task(task_info):
    tracer = get_tracer(__name__)
    with tracer.start_as_current_span("start_task") as span:
        span.set_attribute("task.id", task_info)
        task_info = api.normalize_task(task_info)
        span.set_attribute("task.info", json.dumps(task_info))
        template_info = get_template_def(task_info.get("templateId"))
        api.report_task_start(task_info)
        ffmpeg_task = parse_ffmpeg_task(task_info, template_info)
        result = start_ffmpeg_task(ffmpeg_task)
        if not result:
            span.set_status(Status(StatusCode.ERROR))
            return api.report_task_failed(task_info)
        oss_result = api.upload_task_file(task_info, ffmpeg_task)
        if not oss_result:
            span.set_status(Status(StatusCode.ERROR))
            return api.report_task_failed(task_info)
        # 获取视频长度宽度和时长
        width, height, duration = probe_video_info(ffmpeg_task)
        clear_task_tmp_file(ffmpeg_task)
        api.report_task_success(task_info, videoInfo={
            "width": width,
            "height": height,
            "duration": duration
        })
        span.set_status(Status(StatusCode.OK))