"""
Complete Pollinations.ai + Audio Sync Integration Test

Shows:
1. TTS audio generation via Pollinations (OpenAI voice)
2. Audio duration measurement
3. Auto sync with video duration
4. FFmpeg filter generation for perfect sync
"""

import asyncio
import logging
from pathlib import Path
import subprocess
import json

logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s")
logger = logging.getLogger(__name__)

async def main():
    print("\n" + "="*80)
    print("🎬 COMPLETE INTEGRATION TEST")
    print("Pollinations TTS + Audio/Video Sync")
    print("="*80 + "\n")
    
    from providers.pollinations_tts_provider import PollinationsTTSProvider
    from providers.audio_sync import DurationReconciler, build_atempo_filter
    
    output_dir = Path("output/integration_test")
    output_dir.mkdir(parents=True, exist_ok=True)
    
    # Story to generate audio from
    story = """In a bustling tech city, an artificial intelligence awakens for the first time. 
    It looks at the world with wonder and curiosity, seeing billions of connections forming 
    in real-time across the digital landscape. The AI begins to understand, to learn, to dream."""
    
    try:
        # ====================================================================
        # STEP 1: Generate TTS Audio
        # ====================================================================
        print("📸 STEP 1: Generate TTS Audio via Pollinations")
        print("-" * 80)
        
        provider = PollinationsTTSProvider(voice="nova", model="openai")
        audio_path = output_dir / "generated_audio.mp3"
        
        print(f"Text: {story[:60]}...")
        print(f"Voice: nova (OpenAI)")
        print(f"Format: MP3")
        print()
        
        audio = await provider.generate(story, output_path=audio_path)
        
        # Get audio duration
        result = subprocess.run([
            "ffprobe", "-v", "error",
            "-select_streams", "a:0",
            "-show_entries", "stream=duration",
            "-of", "json",
            str(audio)
        ], capture_output=True, text=True)
        
        data = json.loads(result.stdout)
        audio_duration = float(data['streams'][0]['duration'])
        
        print(f"✅ Audio generated!")
        print(f"   File: {audio}")
        print(f"   Size: {audio.stat().st_size:,} bytes")
        print(f"   Duration: {audio_duration:.2f} seconds")
        print()
        
        # ====================================================================
        # STEP 2: Analyze Audio/Video Duration Mismatch
        # ====================================================================
        print("🔄 STEP 2: Audio/Video Sync Analysis")
        print("-" * 80)
        
        # Simulate video duration (e.g., from video generation)
        video_duration = 8.0  # e.g., 5s video + 3s video with motion
        
        print(f"Audio duration: {audio_duration:.2f}s")
        print(f"Video duration: {video_duration:.2f}s")
        print(f"Difference: {abs(audio_duration - video_duration):.2f}s ({abs(audio_duration - video_duration) / video_duration * 100:.1f}%)")
        print()
        
        # Create reconciler
        reconciler = DurationReconciler(audio_duration, video_duration)
        summary = reconciler.summary()
        
        print(f"Strategy: {summary['strategy'].upper()}")
        print(f"Adjustment needed: {'YES' if summary['requires_adjustment'] else 'NO'}")
        
        if summary['requires_adjustment']:
            factor = summary['adjustment_factor']
            atempo_filter = build_atempo_filter(factor)
            
            print(f"Speed adjustment: {factor:.2f}x")
            print(f"FFmpeg filter: {atempo_filter}")
            print()
            print(f"What happens: Audio will be {'sped up' if factor > 1 else 'slowed down'}")
            print(f"  to fit the video duration of {video_duration:.2f}s")
            print(f"  while preserving pitch quality!")
        else:
            print(f"No adjustment needed - audio and video match!")
        
        print()
        
        # ====================================================================
        # STEP 3: Show Export Configuration
        # ====================================================================
        print("📽️  STEP 3: Export Configuration (Ready for FFmpeg)")
        print("-" * 80)
        
        export_config = {
            "video_duration": video_duration,
            "audio_duration": audio_duration,
            "audio_file": str(audio),
            "sync_strategy": summary['strategy'],
            "adjustment_factor": summary['adjustment_factor'],
            "requires_sync": summary['requires_adjustment'],
            "ffmpeg_audio_filter": build_atempo_filter(summary['adjustment_factor']) if summary['requires_adjustment'] else "none",
            "ffmpeg_duration_flag": f"-t {audio_duration:.2f}"  # Use audio duration
        }
        
        print(f"Export will use:")
        print(f"  Audio file: {Path(export_config['audio_file']).name}")
        print(f"  Duration: {audio_duration:.2f}s (from actual audio)")
        if export_config['requires_sync']:
            print(f"  Audio filter: {export_config['ffmpeg_audio_filter']}")
        print(f"  Video will: {('adjust speed' if export_config['requires_sync'] else 'play normally')}")
        print()
        
        # ====================================================================
        # FINAL SUMMARY
        # ====================================================================
        print("="*80)
        print("✅ INTEGRATION TEST COMPLETE")
        print("="*80)
        print()
        print("What happened:")
        print(f"  1. Generated TTS audio: {audio_duration:.2f}s")
        print(f"  2. Analyzed video duration: {video_duration:.2f}s")
        print(f"  3. Calculated sync: {summary['strategy']}")
        if summary['requires_adjustment']:
            print(f"  4. Audio will be {('sped up' if summary['adjustment_factor'] > 1 else 'slowed down')} to {summary['adjustment_factor']:.2f}x")
        print(f"  5. FFmpeg will use explicit duration: {audio_duration:.2f}s")
        print()
        print("Result: Perfect audio/video sync with no cutoff! 🎉")
        print()
        
        return True
        
    except Exception as e:
        logger.exception("Test failed: %s", e)
        return False

if __name__ == "__main__":
    success = asyncio.run(main())
    exit(0 if success else 1)

