import re


def extract_mentions(message: str, triggerChar: str = '@'):
    # Escape triggerChar in case it's a regex special character
    triggerChar = re.escape(triggerChar)
    pattern = rf'<{triggerChar}([A-Z]):([^|>]+)'

    matches = re.findall(pattern, message)
    return [{'id_type': id_type, 'id': id_value} for id_type, id_value in matches]


def replace_mentions(message: str, triggerChar: str = '@', use_label: bool = True):
    """
    Replace mentions in the message with either their label (after the pipe `|`)
    or their id if no label exists.

    Example:
      "<@M:gpt-4.1|GPT-4>" -> "GPT-4"   (if use_label=True)
      "<@M:gpt-4.1|GPT-4>" -> "gpt-4.1" (if use_label=False)
    """
    # Escape triggerChar
    triggerChar = re.escape(triggerChar)

    def replacer(match):
        id_type, id_value, label = match.groups()
        return label if use_label and label else id_value

    # Regex captures: idType, id, optional label
    pattern = rf'<{triggerChar}([A-Z]):([^|>]+)(?:\|([^>]+))?>'
    return re.sub(pattern, replacer, message)
