import asyncio
import logging
from typing import Dict, Any

from amqp.config.amq_configuration import AMQConfiguration
from amqp.rabbitmq.user_management_service_client import (
    UserManagementServiceClient,
    UserManagementServiceException
)


async def get_user_info_from_token(
    client: UserManagementServiceClient, token: str
) -> Dict[str, Any]:
    """
    Get user information from a JWT token.
    
    Args:
        client: User Management Service client
        token: JWT token
        
    Returns:
        User information
        
    Raises:
        UserManagementServiceException: If an error occurs
    """
    try:
        # Validate the token
        token_info = await client.validate_token(token)
        
        # Extract user ID from token info
        user_id = None
        for item in token_info:
            if isinstance(item, dict) and "sub" in item:
                user_id = item["sub"]
                break
        
        if not user_id:
            raise UserManagementServiceException(
                "cleverthis.clevermicro.auth.invalid_token",
                "Token does not contain user ID (sub claim)",
                {}
            )
        
        # Query user information
        user_info = await client.query_user_by_id(user_id)
        return user_info
        
    except UserManagementServiceException as e:
        logging.error(f"User Management Service error: {e.exception_type}: {e.message}")
        raise
    except Exception as e:
        logging.error(f"Unexpected error: {e}")
        raise


async def main():
    # Initialize configuration
    config = AMQConfiguration()
    
    # Create client
    client = UserManagementServiceClient(config)
    
    try:
        # Sample JWT token (replace with actual token)
        token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
        
        # Get user information
        user_info = await get_user_info_from_token(client, token)
        print(f"User information: {user_info}")
        
    except UserManagementServiceException as e:
        print(f"Error: {e.exception_type}: {e.message}")
        if e.additional_info:
            print(f"Additional info: {e.additional_info}")
    except Exception as e:
        print(f"Unexpected error: {e}")
    finally:
        # Close client
        await client.close()


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