import os.path

from entity.ffmpeg import FfmpegTask
import logging

from util import ffmpeg

logger = logging.getLogger('biz/ffmpeg')


def parse_ffmpeg_task(task_info, template_info):
    tasks = []
    # 中间片段
    for part in template_info.get("video_parts"):
        source = select_video_if_needed(part.get('source'), task_info, template_info)
        if not source:
            logger.warning("no video found for part: " + str(part))
            continue
        sub_ffmpeg_task = FfmpegTask(source)
        sub_ffmpeg_task.frame_rate = template_info.get("frame_rate", 25)
        for lut in part.get('filters', []):
            sub_ffmpeg_task.add_lut(os.path.join(template_info.get("local_path"), lut))
        for audio in part.get('audios', []):
            sub_ffmpeg_task.add_audios(os.path.join(template_info.get("local_path"), audio))
        for overlay in part.get('overlays', []):
            sub_ffmpeg_task.add_overlay(os.path.join(template_info.get("local_path"), overlay))
        tasks.append(sub_ffmpeg_task)
    task = FfmpegTask(tasks, output_file="test.mp4")
    overall = template_info.get("overall_template")
    task.frame_rate = template_info.get("frame_rate", 25)
    for lut in overall.get('filters', []):
        task.add_lut(os.path.join(template_info.get("local_path"), lut))
    for audio in overall.get('audios', []):
        task.add_audios(os.path.join(template_info.get("local_path"), audio))
    for overlay in overall.get('overlays', []):
        task.add_overlay(os.path.join(template_info.get("local_path"), overlay))
    return task


def select_video_if_needed(source, task_info, template_info):
    if source.startswith('PLACEHOLDER_'):
        placeholder_id = source.replace('PLACEHOLDER_', '')
        new_sources = task_info.get('user_videos', {}).get(placeholder_id, [])
        if type(new_sources) is list:
            if len(new_sources) == 0:
                logger.debug("no video found for placeholder: " + placeholder_id)
                return None
            else:
                # TODO: Random Pick / Policy Pick
                new_sources = new_sources[0]
        return new_sources
    return os.path.join(template_info.get("local_path"), source)


def start_ffmpeg_task(ffmpeg_task):
   for task in ffmpeg_task.analyze_input_render_tasks():
       start_ffmpeg_task(task)
   ffmpeg.start_render(ffmpeg_task)