# /opt/trueconf_bot/utils/ad_checker.py
# Проверка членства пользователя в группах Active Directory


from ldap3 import Server, Connection, ALL
from utils.ad_search import search_by_filter as ad_search_all_bases


def get_user_groups(cn: str) -> list[str] | None:
    """
    Найти пользователя по CN и вернуть список групп.
    Ищет по всем OU из AD_BASES.
    Возвращает None если пользователь не найден.
    """
    entries = ad_search_all_bases("(cn={})".format(cn), ["cn", "sAMAccountName", "memberOf"])
    if not entries:
        return None
    entry = entries[0]
    return [str(g) for g in entry.memberOf]


def check_group_membership(cn: str, group_pattern: str = "2FA") -> dict:
    """
    Проверить членство пользователя в группе.

    Args:
        cn: CN пользователя (например 'Krivochenko_Denis_Sergeevich')
        group_pattern: подстрока для поиска в имени группы (по умолчанию '2FA')

    Returns:
        dict с полями:
            found: bool — найден ли пользователь
            cn: str | None — CN пользователя
            sam: str | None — sAMAccountName
            in_group: bool — в группе ли
            groups: list[str] — все группы
            matching_groups: list[str] — группы с паттерном
    """
    groups = get_user_groups(cn)
    if groups is None:
        return {
            "found": False,
            "cn": None,
            "sam": None,
            "in_group": False,
            "groups": [],
            "matching_groups": [],
        }

    matching = [g for g in groups if group_pattern.upper() in g.upper()]

    return {
        "found": True,
        "cn": cn,
        "sam": groups[0].split(",")[0].split("=")[-1],  # грубо из DN
        "in_group": len(matching) > 0,
        "groups": groups,
        "matching_groups": matching,
    }
