#!/usr/bin/env python3
"""
FastDesk Phase 2: Media Migration Tool
Downloads media from Supabase storage to NAS with verification
Usage: python3 migrate_media.py [--db /path/to/fastdesk.db] [--media-dir /path/to/media] [--limit 10]
"""

import sqlite3
import argparse
import sys
from pathlib import Path
import urllib.request
import hashlib
import json
from datetime import datetime
from urllib.parse import urlparse

def download_file(url, local_path, chunk_size=8192):
    """Download file with progress tracking"""
    try:
        local_path.parent.mkdir(parents=True, exist_ok=True)
        
        with urllib.request.urlopen(url, timeout=30) as response:
            total_size = response.headers.get('content-length')
            downloaded = 0
            
            with open(local_path, 'wb') as f:
                while True:
                    chunk = response.read(chunk_size)
                    if not chunk:
                        break
                    f.write(chunk)
                    downloaded += len(chunk)
                    
                    if total_size:
                        pct = (downloaded / int(total_size)) * 100
                        print(f"      {pct:.1f}% ", end='\r')
        
        return True
    except Exception as e:
        print(f"      ❌ Download failed: {e}")
        return False

def migrate_media(db_path, media_dir, limit=None, test_mode=False):
    """Migrate media from Supabase to NAS storage"""
    
    if not Path(db_path).exists():
        print(f"❌ Database not found: {db_path}")
        sys.exit(1)
    
    media_dir = Path(media_dir)
    media_dir.mkdir(parents=True, exist_ok=True)
    
    conn = sqlite3.connect(db_path)
    cursor = conn.cursor()
    
    # Get undownloaded media
    query = "SELECT id, original_url, file_name, item_id FROM media_files WHERE downloaded = 0"
    if limit:
        query += f" LIMIT {limit}"
    
    cursor.execute(query)
    media_files = cursor.fetchall()
    
    if not media_files:
        print("✅ All media already downloaded!")
        conn.close()
        return
    
    print(f"\n📥 Found {len(media_files)} files to download")
    print(f"📂 Storage directory: {media_dir}")
    print(f"🧪 Test mode: {test_mode}")
    print("=" * 60)
    
    downloaded = 0
    failed = 0
    skipped = 0
    
    for media_id, url, file_name, item_id in media_files:
        if not url or not url.strip():
            print(f"⏭️  Skipping media {media_id} (no URL)")
            skipped += 1
            continue
        
        # Generate local filename
        if file_name:
            local_file = file_name
        else:
            # Extract filename from URL
            parsed = urlparse(url)
            local_file = Path(parsed.path).name or f"media_{media_id}"
        
        # Organize by card/item
        local_path = media_dir / item_id[:8] / local_file
        
        print(f"\n📥 {local_file}")
        print(f"   From: {url[:80]}...")
        print(f"   To:   {local_path}")
        
        if test_mode:
            print(f"   [TEST MODE - not downloading]")
            skipped += 1
            continue
        
        # Download
        if download_file(url, local_path):
            print(f"   ✅ Downloaded ({local_path.stat().st_size} bytes)")
            
            # Update database
            local_path_rel = str(local_path.relative_to(media_dir))
            cursor.execute("""
                UPDATE media_files
                SET local_path = ?, downloaded = 1
                WHERE id = ?
            """, (local_path_rel, media_id))
            conn.commit()
            downloaded += 1
        else:
            failed += 1
    
    conn.close()
    
    print(f"\n{'=' * 60}")
    print(f"📊 Migration Summary:")
    print(f"   ✅ Downloaded: {downloaded}")
    print(f"   ❌ Failed: {failed}")
    print(f"   ⏭️  Skipped: {skipped}")
    
    if failed > 0:
        print(f"\n⚠️  {failed} files failed to download")
        print(f"   Retry with: python3 migrate_media.py --db {db_path} --media-dir {media_dir}")
    else:
        print(f"\n✅ Phase 2 media migration complete!")

def main():
    parser = argparse.ArgumentParser(description='FastDesk Media Migration Tool')
    parser.add_argument('--db', default='fastdesk.db', help='SQLite database path')
    parser.add_argument('--media-dir', default='./media', help='Media storage directory')
    parser.add_argument('--limit', type=int, help='Limit number of files to download (for testing)')
    parser.add_argument('--test', action='store_true', help='Test mode (no actual downloads)')
    
    args = parser.parse_args()
    
    print("🚀 FastDesk Phase 2: Media Migration")
    print("=" * 60)
    
    migrate_media(args.db, args.media_dir, limit=args.limit, test_mode=args.test)

if __name__ == '__main__':
    main()
