from typing import Optional

from actions_logging.app_logging import logger
from common.common import raise_with_context
from github.env import get_required_env_var
from slack_sdk import WebClient as SlackWebClient
from slack_sdk.errors import SlackApiError


def get_slack_web_client(token: Optional[str] = None) -> SlackWebClient:
    """
    Get a Slack WebClient instance.

    :param token: Slack bot token. If not provided, it will fetch from env var GLOBAL_CICD_DEVOPS_AUTO_SLACK_BOT_TOKEN
    :return: A WebClient instance.
    """
    try:
        if not token:
            logger.debug("No token provided, fetching from env var GLOBAL_CICD_DEVOPS_AUTO_SLACK_BOT_TOKEN")
            token = get_required_env_var("GLOBAL_CICD_DEVOPS_AUTO_SLACK_BOT_TOKEN")
        return SlackWebClient(token=token)
    except SlackApiError as e:
        raise_with_context(e, RuntimeError, "Failed to create Slack WebClient")
