#!/usr/bin/env python3
"""
NotebookLM Asset Repair Script

This script repairs notebook assets that are incorrectly marked as failed
or have error messages despite being successfully created.

Usage:
    python3 scripts/repair_notebook_assets.py [report_id]

If report_id is provided, only repairs that report.
Otherwise, repairs all reports with mismatched assets.
"""
import os
import sys
from datetime import datetime

# Add app directory to path
sys.path.insert(0, '/home/ashraffarid2010/jadwaai.com')

def main():
    try:
        import psycopg2
        from psycopg2.extras import RealDictCursor

        # Connect to database
        conn = psycopg2.connect(
            host="127.0.0.1",
            port=5432,
            database="jadwa",
            user="postgres",
        )

        report_id_filter = None
        if len(sys.argv) > 1:
            try:
                report_id_filter = int(sys.argv[1])
                print(f"Repairing assets for report {report_id_filter} only...")
            except ValueError:
                print(f"Invalid report_id: {sys.argv[1]}")
                sys.exit(1)

        cursor = conn.cursor(cursor_factory=RealDictCursor)

        # Find assets with issues
        if report_id_filter:
            cursor.execute("""
                SELECT id, report_id, asset_type, status, file_path, file_format, error_message, created_at, completed_at
                FROM notebook_assets
                WHERE report_id = %s
                ORDER BY report_id, asset_type
            """, (report_id_filter,))
        else:
            cursor.execute("""
                SELECT id, report_id, asset_type, status, file_path, file_format, error_message, created_at, completed_at
                FROM notebook_assets
                ORDER BY report_id, asset_type
            """)

        assets = cursor.fetchall()

        print("=" * 80)
        print("NOTEBOOKLM ASSET REPAIR SCRIPT")
        print("=" * 80)

        repairs_made = 0
        issues_found = 0

        for asset in assets:
            report_id = asset['report_id']
            asset_id = asset['id']
            asset_type = asset['asset_type']
            status = asset['status']
            file_path = asset['file_path']
            error_message = asset['error_message']

            needs_repair = False
            repair_actions = []

            # Check if file exists
            file_exists = False
            file_size = 0
            if file_path:
                full_path = f"/home/ashraffarid2010/jadwaai.com/app/static/{file_path}"
                file_exists = os.path.exists(full_path)
                if file_exists:
                    file_size = os.path.getsize(full_path)

            # Issue 1: Ready status with error message but valid file
            if status == 'ready' and error_message and file_exists and file_size > 0:
                needs_repair = True
                repair_actions.append(f"Clear error message: '{error_message[:60]}...'")
                issues_found += 1

            # Issue 2: Failed status but file exists and is valid
            if status == 'failed' and file_exists and file_size > 0:
                needs_repair = True
                repair_actions.append(f"Change status from 'failed' to 'ready' (file exists: {file_size:,} bytes)")
                issues_found += 1

            # Issue 3: Generating status for old assets (> 30 minutes)
            if status == 'generating' and asset['created_at']:
                age_minutes = (datetime.now() - asset['created_at']).total_seconds() / 60
                if age_minutes > 30:
                    if file_exists and file_size > 0:
                        needs_repair = True
                        repair_actions.append(f"Reset stale 'generating' to 'ready' (age: {age_minutes:.1f} min)")
                        issues_found += 1
                    else:
                        needs_repair = True
                        repair_actions.append(f"Reset stale 'generating' to 'failed' (age: {age_minutes:.1f} min)")
                        issues_found += 1

            # Issue 4: Missing completed_at for ready assets
            if status == 'ready' and not asset['completed_at']:
                needs_repair = True
                repair_actions.append("Set completed_at timestamp")
                issues_found += 1

            # Perform repairs
            if needs_repair:
                print(f"\n🔧 Repairing Asset ID {asset_id} (Report {report_id}, {asset_type}):")
                for action in repair_actions:
                    print(f"   - {action}")

                # Build update query
                updates = []
                params = []

                if status == 'ready' and error_message:
                    updates.append("error_message = NULL")

                if status == 'failed' and file_exists and file_size > 0:
                    updates.append("status = 'ready'")
                    updates.append("error_message = NULL")
                    updates.append("completed_at = %s")
                    params.append(datetime.now())

                if status == 'generating' and asset['created_at']:
                    age_minutes = (datetime.now() - asset['created_at']).total_seconds() / 60
                    if age_minutes > 30:
                        if file_exists and file_size > 0:
                            updates.append("status = 'ready'")
                            updates.append("error_message = NULL")
                            updates.append("completed_at = %s")
                            params.append(datetime.now())
                        else:
                            updates.append("status = 'failed'")
                            updates.append("error_message = 'انتهت مهلة الإنشاء. الملف غير موجود.'")

                if status == 'ready' and not asset['completed_at']:
                    updates.append("completed_at = %s")
                    params.append(datetime.now())

                if updates:
                    params.append(asset_id)
                    update_query = f"UPDATE notebook_assets SET {', '.join(updates)} WHERE id = %s"
                    cursor.execute(update_query, params)
                    repairs_made += 1

        # Commit changes
        if repairs_made > 0:
            conn.commit()
            print(f"\n✅ Successfully repaired {repairs_made} assets")
        else:
            print(f"\n✓ No repairs needed - all assets are correctly configured")

        # Show summary
        print("\n" + "=" * 80)
        print("SUMMARY")
        print("=" * 80)
        print(f"Total assets scanned: {len(assets)}")
        print(f"Issues found: {issues_found}")
        print(f"Repairs made: {repairs_made}")

        # Show current asset status
        print("\n" + "=" * 80)
        print("CURRENT ASSET STATUS")
        print("=" * 80)

        cursor.execute("""
            SELECT report_id, asset_type, status,
                   CASE WHEN file_path IS NOT NULL THEN 'Yes' ELSE 'No' END as has_file,
                   CASE WHEN error_message IS NOT NULL THEN 'Yes' ELSE 'No' END as has_error
            FROM notebook_assets
        """ + (f" WHERE report_id = {report_id_filter}" if report_id_filter else "") + """
            ORDER BY report_id, asset_type
        """)

        current_assets = cursor.fetchall()

        print(f"\n{'Report':<8} {'Type':<15} {'Status':<12} {'File':<6} {'Error':<6}")
        print("-" * 60)
        for asset in current_assets:
            status_icon = "✓" if asset['status'] == 'ready' else ("⏳" if asset['status'] == 'generating' else "✗")
            print(f"{asset['report_id']:<8} {asset['asset_type']:<15} {asset['status']:<10} {status_icon} {asset['has_file']:<6} {asset['has_error']:<6}")

        cursor.close()
        conn.close()

        print("\n" + "=" * 80)

    except Exception as e:
        print(f"Error: {e}")
        import traceback
        traceback.print_exc()
        sys.exit(1)

if __name__ == "__main__":
    main()