import os

from flask import Blueprint, jsonify, request

from model import db
from model.DanmakuClip import DanmakuClip
from util.flask import not_found_json_response, error_json_response

blueprint = Blueprint("api_danmaku_clip", __name__, url_prefix="/api/danmaku_clip")


@blueprint.get("/<int:danmaku_clip_id>")
def get_danmaku_clip_info(danmaku_clip_id):
    danmaku_clip = DanmakuClip.query.get(danmaku_clip_id)
    if danmaku_clip is None:
        return not_found_json_response(id=danmaku_clip_id)
    return jsonify(danmaku_clip.to_json())


@blueprint.put("/<int:danmaku_clip_id>")
def modify_danmaku_clip_info(danmaku_clip_id):
    danmaku_clip = DanmakuClip.query.get(danmaku_clip_id)
    if danmaku_clip is None:
        return not_found_json_response(id=danmaku_clip_id)
    payload = request.json
    if "video_clip_id" in payload:
        try:
            video_clip_id = int(payload["video_clip_id"])
            danmaku_clip.video_clip_id = video_clip_id
        except ValueError:
            return error_json_response("video_clip_id is not a int", video_clip_id=payload["video_clip_id"])
    if "base_path" in payload:
        if not os.path.isdir(payload["base_path"]):
            return error_json_response("base_path is not a dir", base_path=payload["base_path"])
        danmaku_clip.base_path = payload["base_path"]
    if "file" in payload:
        if os.path.isabs(payload["file"]):
            danmaku_clip.base_path = ""
        danmaku_clip.file = payload["file"]
    # file exist check
    if not os.path.isfile(danmaku_clip.full_path):
        return error_json_response("file not exist", full_path=danmaku_clip.full_path)
    db.session.commit()
    return jsonify(danmaku_clip.to_json())


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