#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
import os
import json
from pathlib import Path

# Set UTF-8
if sys.platform == "win32":
    try:
        sys.stdout.reconfigure(encoding="utf-8")
        sys.stderr.reconfigure(encoding="utf-8")
    except Exception:
        pass

BASE_DIR = Path(r"c:\Projects\KieuStory")
sys.path.insert(0, str(BASE_DIR / "05_Production_Pipeline"))
import production_orchestrator as po

shots = po.get_all_shots("ep01")
ep01_shots = [(k, v) for k, v in sorted(shots.items()) if any(k.startswith(f"ep01_scene{i:02d}") for i in range(1, 11))]

scene_stats = {}
missing_cut_files = []
cut_shots = []
take_shots = []
cut_detail = []

for sid, sdata in ep01_shots:
    scene_id = sid.split("_shot")[0]
    take_type = po.classify_shot_take(sid, shot_data=sdata)
    sf_path, returned_type = po.resolve_start_frame(sid, sdata, return_classification=True)
    curr_anchor = po.get_character_anchor(sid, sdata)
    
    file_exists = False
    if sf_path:
        file_exists = Path(sf_path).exists()
    
    if scene_id not in scene_stats:
        scene_stats[scene_id] = {
            "total": 0, "cuts": 0, "takes": 0,
            "cuts_exist": 0, "cuts_missing": 0,
            "takes_with_sf": 0, "takes_without_sf": 0
        }
    
    stat = scene_stats[scene_id]
    stat["total"] += 1
    
    if take_type == "CINEMATIC_CUT":
        stat["cuts"] += 1
        cut_shots.append((sid, sf_path, file_exists, curr_anchor))
        cut_detail.append({
            "shot_id": sid,
            "anchor": curr_anchor,
            "asset_ref": sdata.get("character_asset_ref"),
            "ref_sf": sdata.get("reference_start_frame"),
            "resolved": sf_path,
            "exists": file_exists
        })
        if file_exists:
            stat["cuts_exist"] += 1
        else:
            stat["cuts_missing"] += 1
            missing_cut_files.append((sid, sf_path, sdata.get("character_asset_ref"), curr_anchor))
    else:
        stat["takes"] += 1
        take_shots.append((sid, sf_path, file_exists, curr_anchor))
        if file_exists:
            stat["takes_with_sf"] += 1
        else:
            stat["takes_without_sf"] += 1

print("=== SCENE BREAKDOWN TABLE ===")
headers = f"{'Scene':<15} | {'Total':<5} | {'Cuts':<5} | {'Takes':<5} | {'Cut SF Exist':<12} | {'Cut SF Miss':<11} | {'Take SF Avail':<13}"
print(headers)
print("-" * len(headers))
for sc in sorted(scene_stats.keys()):
    st = scene_stats[sc]
    print(f"{sc:<15} | {st['total']:>5} | {st['cuts']:>5} | {st['takes']:>5} | {st['cuts_exist']:>12} | {st['cuts_missing']:>11} | {st['takes_with_sf']:>5}/{st['takes']:<7}")

print("-" * len(headers))
tot_shots = sum(s['total'] for s in scene_stats.values())
tot_cuts = sum(s['cuts'] for s in scene_stats.values())
tot_takes = sum(s['takes'] for s in scene_stats.values())
tot_cut_ex = sum(s['cuts_exist'] for s in scene_stats.values())
tot_cut_miss = sum(s['cuts_missing'] for s in scene_stats.values())
tot_take_sf = sum(s['takes_with_sf'] for s in scene_stats.values())
print(f"{'TOTAL':<15} | {tot_shots:>5} | {tot_cuts:>5} | {tot_takes:>5} | {tot_cut_ex:>12} | {tot_cut_miss:>11} | {tot_take_sf:>5}/{tot_takes:<7}")

print(f"\nTotal Missing Cinematic Cut Files: {len(missing_cut_files)}")
if missing_cut_files:
    print("\nMissing Cut Details:")
    for m in missing_cut_files:
        print(f"  Shot: {m[0]}")
        print(f"    Resolved Path: {m[1]}")
        print(f"    Asset Ref:     {m[2]}")
        print(f"    Anchor:        {m[3]}")

# Also analyze Continuous Takes behavior when prev_tail is absent
print("\n=== CONTINUOUS TAKES COLD-START BEHAVIOR ===")
take_fallback_count = 0
take_none_count = 0
for sid, sdata in ep01_shots:
    if po.classify_shot_take(sid, shot_data=sdata) == "CONTINUOUS_TAKE":
        sf = po.resolve_start_frame(sid, sdata)
        if sf is None:
            take_none_count += 1
        else:
            take_fallback_count += 1
print(f"Takes returning None when prev_tail missing: {take_none_count}")
print(f"Takes returning fallback start frame: {take_fallback_count}")

# Save full audit json
output_json = BASE_DIR / ".agents" / "teamwork" / "explorer_m3_1" / "ep01_start_frame_audit.json"
with open(output_json, "w", encoding="utf-8") as f:
    json.dump({
        "scene_stats": scene_stats,
        "missing_cut_files": missing_cut_files,
        "cut_detail": cut_detail
    }, f, ensure_ascii=False, indent=2)
print(f"\nSaved full audit data to: {output_json}")
