from __future__ import annotations

import json
import os
import sys
from pathlib import Path

ROOT = Path(__file__).resolve().parents[1]
if str(ROOT) not in sys.path:
    sys.path.insert(0, str(ROOT))

from scripts.db import DB_PATH, init_db, fetch_one
from scripts.repository import create_project, create_scene, create_task, mark_task_submitted, update_task_from_callback
from scripts.validators import validate_payload, ValidationError
from server.callback_receiver import _extract_assets
from scripts.asset_downloader import download_pending_assets


def reset_db():
    if DB_PATH.exists(): DB_PATH.unlink()
    for suffix in ('-wal', '-shm'):
        p = Path(str(DB_PATH) + suffix)
        if p.exists(): p.unlink()
    init_db()


def main():
    reset_db()
    create_project('proj_demo', 'Demo Project', 'Next stage validation')
    create_scene({'scene_id':'scene_demo_001','project_id':'proj_demo','ordering':1,'narration':'n','visual_prompt':'v','target_duration':5,'scene_type':'text'})
    # validation fail-fast
    validation_error = None
    try:
        validate_payload('text2video', {'duration':'5'})
    except ValidationError as e:
        validation_error = str(e)
    # normalized callback fields
    task_id = create_task('scene_demo_001', 'text2video', {'prompt':'demo'})
    mark_task_submitted(task_id, 'kling_demo_task_002', 'req_demo_002', {'request_id':'req_demo_002','data':{'task_id':'kling_demo_task_002','task_status':'submitted'}})
    payload = {
        'task_id':'kling_demo_task_002',
        'task_status':'succeed',
        'task_status_msg':'ok',
        'final_unit_deduction':'12',
        'task_info': {'parent_video': {'id':'parent_1','url':'https://example.com/parent.mp4'}},
        'task_result': {'videos':[{'id':'vid_002','url':'file:///Users/moon/.openclaw/workspace/youtube-automation/README.md','watermark_url':'','duration':'5'}]}
    }
    internal = update_task_from_callback(payload)
    _extract_assets(internal, payload)
    task = fetch_one('SELECT final_unit_deduction, parent_video_id, parent_video_url FROM tasks WHERE task_id_internal=?', (internal,))
    downloaded = download_pending_assets()
    asset = fetch_one('SELECT local_path FROM assets WHERE source_task_id=?', (internal,))
    print(json.dumps({'ok': True, 'validation_error': validation_error, 'normalized_task_fields': task, 'downloaded': downloaded, 'asset_local_path': asset}, ensure_ascii=False, indent=2))


if __name__ == '__main__':
    main()
