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 scripts.asset_downloader import download_pending_assets
from scripts.kling_auth import make_jwt
from server.callback_receiver import _extract_assets
from scripts.scene_router import choose_endpoint


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()
    token = make_jwt('AK_TEST', 'SK_TEST', now=1700000000)
    jwt_ok = token.count('.') == 2

    create_project('proj_demo', 'Demo Project', 'Doublecheck 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_error = None
    try:
        validate_payload('extend', {'prompt':'x'})
    except ValidationError as e:
        validation_error = str(e)

    routes = {
        'text': choose_endpoint({'scene_type':'text'}),
        'image_ref': choose_endpoint({'scene_type':'image_ref'}),
        'continuity': choose_endpoint({'scene_type':'continuity'}),
    }

    task_id = create_task('scene_demo_001', 'text2video', {'prompt':'demo'})
    mark_task_submitted(task_id, 'kling_demo_task_003', 'req_demo_003', {'request_id':'req_demo_003','data':{'task_id':'kling_demo_task_003','task_status':'submitted'}})
    payload = {
        'task_id':'kling_demo_task_003',
        'task_status':'succeed',
        'task_status_msg':'ok',
        'final_unit_deduction':'12',
        'task_info': {'parent_video': {'id':'parent_2','url':'https://example.com/parent2.mp4','duration':'9'}, 'external_task_id':'ext_003'},
        'task_result': {'videos':[{'id':'vid_003','url':'file:///Users/moon/.openclaw/workspace/youtube-automation/README.md','watermark_url':'','duration':'5'}], 'images':[{'index':0,'url':'file:///Users/moon/.openclaw/workspace/youtube-automation/README.md'}]}
    }
    internal = update_task_from_callback(payload)
    _extract_assets(internal, payload)
    _extract_assets(internal, payload)  # dedupe repeat extraction
    downloaded = download_pending_assets()
    task = fetch_one('SELECT final_unit_deduction,parent_video_id,parent_video_url,parent_video_duration FROM tasks WHERE task_id_internal=?', (internal,))
    asset_count = fetch_one('SELECT COUNT(*) AS cnt FROM assets WHERE source_task_id=?', (internal,))['cnt']
    print(json.dumps({'ok': True, 'jwt_ok': jwt_ok, 'validation_error': validation_error, 'routes': routes, 'normalized_task_fields': task, 'asset_count': asset_count, 'downloaded_count': len(downloaded)}, ensure_ascii=False, indent=2))


if __name__ == '__main__':
    main()
