"""
Update Legacy Users to Current System Schema
==============================================
This script updates old user records created before recent migrations
to ensure compatibility with the current User model and database schema.

Run this script after migrations to ensure all users have proper values
for newly added fields.

Usage: python update_legacy_users.py
"""

import sys
from datetime import datetime
from app import create_app
from app.extensions import db
from app.models.user import User


def update_legacy_users():
    """Update old user records to comply with current schema"""
    
    print("=" * 70)
    print("LEGACY USER UPDATE SCRIPT")
    print("=" * 70)
    print()
    
    # Track statistics
    stats = {
        'total_users': 0,
        'updated_users': 0,
        'errors': 0,
        'updates_by_field': {}
    }
    
    try:
        # Get all users
        users = User.query.all()
        stats['total_users'] = len(users)
        
        print(f"Found {stats['total_users']} users in database")
        print()
        print("Checking and updating users...")
        print("-" * 70)
        
        for user in users:
            updated = False
            user_updates = []
            
            # 1. GST Registration (added Oct 29, 2025)
            if user.gst_registered is None:
                user.gst_registered = False
                user_updates.append('gst_registered')
                updated = True
            
            # 2. Stripe Connect Fields (added Oct 20, 2025)
            if user.stripe_account_id is None:
                # Keep as None - will be set when they connect
                pass
            
            if user.stripe_onboarding_complete is None:
                user.stripe_onboarding_complete = False
                user_updates.append('stripe_onboarding_complete')
                updated = True
            
            if user.stripe_payouts_enabled is None:
                user.stripe_payouts_enabled = False
                user_updates.append('stripe_payouts_enabled')
                updated = True
            
            if user.stripe_charges_enabled is None:
                user.stripe_charges_enabled = False
                user_updates.append('stripe_charges_enabled')
                updated = True
            
            # 3. Password Reset Fields (added Nov 4, 2025)
            # Keep these as None - only set when user requests reset
            
            # 4. Profile Picture (added Nov 13, 2025)
            # Keep as None - will be set when user uploads
            
            # 5. Gamification Fields (ensure defaults)
            if user.total_points is None:
                user.total_points = 0
                user_updates.append('total_points')
                updated = True
            
            if user.current_level is None:
                user.current_level = 1
                user_updates.append('current_level')
                updated = True
            
            if user.seasonal_league is None:
                user.seasonal_league = 'bronze'
                user_updates.append('seasonal_league')
                updated = True
            
            # 6. Statistics Fields
            if user.jobs_completed is None:
                user.jobs_completed = 0
                user_updates.append('jobs_completed')
                updated = True
            
            if user.total_reviews is None:
                user.total_reviews = 0
                user_updates.append('total_reviews')
                updated = True
            
            if user.average_rating is None:
                user.average_rating = 0.0
                user_updates.append('average_rating')
                updated = True
            
            if user.response_rate is None:
                user.response_rate = 0.0
                user_updates.append('response_rate')
                updated = True
            
            # 7. Insurance Fields
            if user.public_liability_insurance is None:
                user.public_liability_insurance = False
                user_updates.append('public_liability_insurance')
                updated = True
            
            if user.workers_comp_insurance is None:
                user.workers_comp_insurance = False
                user_updates.append('workers_comp_insurance')
                updated = True
            
            # 8. Account Status Fields
            if user.is_active is None:
                user.is_active = True
                user_updates.append('is_active')
                updated = True
            
            if user.account_status is None:
                user.account_status = 'active'
                user_updates.append('account_status')
                updated = True
            
            if user.privacy_consent is None:
                # For legacy users, assume consent was given
                user.privacy_consent = True
                user_updates.append('privacy_consent')
                updated = True
            
            if user.terms_accepted is None:
                # For legacy users, assume terms were accepted
                user.terms_accepted = True
                user.terms_accepted_date = user.date_created if user.date_created else datetime.utcnow()
                user_updates.append('terms_accepted')
                updated = True
            
            # 9. Date Fields
            if user.date_created is None:
                user.date_created = datetime.utcnow()
                user_updates.append('date_created')
                updated = True
            
            # 10. Username field (ensure it exists)
            if not user.username:
                # Generate username from email
                user.username = user.email.split('@')[0]
                user_updates.append('username')
                updated = True
            
            # Track updates
            if updated:
                stats['updated_users'] += 1
                for field in user_updates:
                    stats['updates_by_field'][field] = stats['updates_by_field'].get(field, 0) + 1
                
                print(f"✓ Updated user: {user.email}")
                print(f"  Fields updated: {', '.join(user_updates)}")
        
        # Commit all changes
        print()
        print("-" * 70)
        print("Committing changes to database...")
        db.session.commit()
        print("✓ Changes committed successfully!")
        
    except Exception as e:
        print(f"✗ ERROR: {str(e)}")
        db.session.rollback()
        stats['errors'] += 1
        return False
    
    # Print summary
    print()
    print("=" * 70)
    print("UPDATE SUMMARY")
    print("=" * 70)
    print(f"Total users found:        {stats['total_users']}")
    print(f"Users updated:            {stats['updated_users']}")
    print(f"Users already current:    {stats['total_users'] - stats['updated_users']}")
    print(f"Errors:                   {stats['errors']}")
    print()
    
    if stats['updates_by_field']:
        print("Updates by field:")
        for field, count in sorted(stats['updates_by_field'].items()):
            print(f"  • {field:<30} {count} users")
    
    print()
    print("=" * 70)
    
    return True


def verify_users():
    """Verify all users have required fields set"""
    
    print()
    print("=" * 70)
    print("VERIFICATION CHECK")
    print("=" * 70)
    print()
    
    required_fields = {
        'gst_registered': False,
        'stripe_onboarding_complete': False,
        'stripe_payouts_enabled': False,
        'stripe_charges_enabled': False,
        'total_points': 0,
        'current_level': 1,
        'seasonal_league': 'bronze',
        'jobs_completed': 0,
        'total_reviews': 0,
        'average_rating': 0.0,
        'response_rate': 0.0,
        'public_liability_insurance': False,
        'workers_comp_insurance': False,
        'is_active': True,
        'account_status': 'active',
        'privacy_consent': True,
        'terms_accepted': True,
    }
    
    users = User.query.all()
    issues_found = 0
    
    for user in users:
        user_issues = []
        
        for field, expected_type in required_fields.items():
            value = getattr(user, field, None)
            if value is None:
                user_issues.append(field)
        
        if user_issues:
            issues_found += 1
            print(f"✗ User {user.email} missing: {', '.join(user_issues)}")
    
    if issues_found == 0:
        print("✓ All users have required fields set correctly!")
    else:
        print(f"\n✗ Found {issues_found} users with missing fields")
    
    print("=" * 70)
    print()
    
    return issues_found == 0


if __name__ == '__main__':
    print()
    print("Starting legacy user update process...")
    print()
    
    # Create Flask app context
    app = create_app()
    
    with app.app_context():
        # Update users
        success = update_legacy_users()
        
        if success:
            # Verify updates
            verify_users()
            print("✓ Legacy user update completed successfully!")
            sys.exit(0)
        else:
            print("✗ Legacy user update failed!")
            sys.exit(1)
