#!/usr/bin/env python3
"""
Script to fix missing roles for existing users
This script assigns default roles to users who don't have any roles assigned
"""

import asyncio
import sys
from bson import ObjectId

# Add shared modules to path
sys.path.append('/app')

from app.models.user_profile import UserProfile
from app.models.role import Role, RoleType
from app.models.user_role import UserRole
from shared.database import connect_to_mongo, init_database

async def fix_missing_roles():
    """Assign default roles to users who don't have any roles"""
    try:
        # Connect to database
        await connect_to_mongo()
        await init_database([UserProfile, Role, UserRole])
        
        print("Connected to database successfully")
        
        # Get or create default role
        default_role = await Role.find_one(Role.name == "user")
        if not default_role:
            print("Creating default 'user' role...")
            default_role = Role(
                name="user",
                display_name="Regular User",
                description="Default user role",
                role_type=RoleType.SYSTEM,
                is_system_role=True,
                is_default=True,
                priority=100,
                color="#0000FF",
                permissions=["profile.read.own", "profile.write.own"]
            )
            await default_role.save()
            print("Default role created successfully")
        else:
            print("Default role already exists")
        
        # Get all user profiles
        user_profiles = await UserProfile.find_all().to_list()
        print(f"Found {len(user_profiles)} user profiles")
        
        fixed_count = 0
        for profile in user_profiles:
            # Check if user already has roles
            user_roles = await UserRole.get_user_roles(profile.user_id, active_only=True)
            
            if not user_roles:
                print(f"User {profile.username} ({profile.email}) has no roles, assigning default role...")
                
                try:
                    # Assign default role
                    user_role = UserRole(
                        user_id=profile.user_id,
                        role_name=default_role.name,
                        notes="Default role assignment by fix script",
                        is_active=True
                    )
                    await user_role.save()
                    fixed_count += 1
                    print(f"✓ Assigned default role to {profile.username}")
                except Exception as e:
                    print(f"✗ Failed to assign role to {profile.username}: {e}")
            else:
                print(f"User {profile.username} already has roles: {[role.role_name for role in user_roles]}")
        
        print(f"\nSummary: Fixed {fixed_count} users with missing roles")
        
    except Exception as e:
        print(f"Error: {e}")
        raise
    finally:
        # Close database connection
        from shared.database import close_mongo_connection
        await close_mongo_connection()

if __name__ == "__main__":
    asyncio.run(fix_missing_roles())
