import threading

from flask import Blueprint, jsonify

from model import db
from model.Workflow import Workflow
from util.flask import not_found_json_response
from workflow.worker import do_workflow

blueprint = Blueprint("api_workflow", __name__, url_prefix="/api/workflow")


@blueprint.get("/")
def get_workflow_list():
    workflows = Workflow.query.all()
    return jsonify([d.to_dict() for d in workflows])


@blueprint.get("/<int:workflow_id>")
def get_workflow_info(workflow_id):
    workflow = Workflow.query.get(workflow_id)
    if workflow is None:
        return not_found_json_response(id=workflow_id)
    return jsonify(workflow.to_dict())


@blueprint.put("/<int:workflow_id>")
def modify_workflow_info(workflow_id):
    workflow = Workflow.query.get(workflow_id)
    if workflow is None:
        return not_found_json_response(id=workflow_id)
    return jsonify(workflow)


@blueprint.delete("/<int:workflow_id>")
def delete_workflow(workflow_id):
    workflow = Workflow.query.get(workflow_id)
    if workflow is not None:
        db.session.delete(workflow)
        db.session.commit()
    return jsonify({
        "id": workflow_id,
        "old_data": workflow.to_json() if workflow is not None else {}
    })


@blueprint.post("/<int:workflow_id>/edit")
def start_editing(workflow_id):
    workflow = Workflow.query.get(workflow_id)
    if workflow is None:
        return not_found_json_response(id=workflow_id)
    workflow.editing = True
    db.session.commit()
    return jsonify(workflow.to_dict())


@blueprint.delete("/<int:workflow_id>/edit")
def done_editing(workflow_id):
    workflow = Workflow.query.get(workflow_id)
    if workflow is None:
        return not_found_json_response(id=workflow_id)
    workflow.editing = False
    db.session.commit()
    return jsonify(workflow.to_dict())


@blueprint.post("/<int:workflow_id>/do")
def start_workflow(workflow_id):
    workflow = Workflow.query.get(workflow_id)
    if workflow is None:
        return not_found_json_response(id=workflow_id)
    if len(workflow.video_clips) > 0:
        for video_clip in workflow.video_clips:
            if len(video_clip.danmaku_clips) > 0:
                threading.Thread(target=do_workflow, args=(
                    video_clip.full_path,
                    video_clip.danmaku_clips[0].full_path,
                    *[clip.full_path for clip in video_clip.danmaku_clips[1:]]
                )).start()
    return jsonify(workflow.to_dict())