from typing import Optional

from actions_logging.app_logging import logger
from common.common import raise_with_context
from slack_sdk.errors import SlackApiError
from slack_wrapper.webclient import get_slack_web_client


def get_slack_user_by_email(email: str) -> Optional[dict]:
    """
    Get a Slack user by their email address.

    :param email: The email address of the user.
    :return: The user object if found, otherwise None.
    """
    try:
        slack_web_client = get_slack_web_client()
        logger.info(f"Looking up Slack user by email: {email}")
        response = slack_web_client.users_lookupByEmail(email=email)
        logger.debug(f"Slack API response: {response}")
        return response["user"]
    except SlackApiError as e:
        if e.response["error"] == "users_not_found":
            logger.warning(f"Slack user not found for email: {email}")
        else:
            logger.error(f"Error fetching Slack user for email {email}: {e.response['error']}")
        return None
    except Exception as e:
        raise_with_context(e, RuntimeError, f"An error occurred while fetching Slack user by email {email}")
