#!/usr/bin/env python3
"""
Проверка наличия пользователя в группе 2FA через Active Directory.
Использует credentials и настройки из config/config.py.

Запуск:
    python check_ad_2fa.py
"""

import sys
import os
from ldap3 import Server, Connection, ALL, SUBTREE

# Подтягиваем конфиг
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from config.config import AD_SERVER, AD_USER, AD_PASSWORD, AD_BASES
from utils.ad_search import search_by_filter as ad_search_all_bases


def find_user(login: str) -> dict | None:
    """Найти пользователя в AD по логину (sAMAccountName или mail).
    Ищет по всем OU из AD_BASES."""
    filter_login = login.lower().replace("\\", "\\5c").replace("*", "\\2a").replace("(", "\\28").replace(")", "\\29")

    if "@" in filter_login:
        ldap_filter = "(|{}{})".format("(mail={})".format(filter_login), "(sAMAccountName={})".format(filter_login))
    else:
        ldap_filter = "(|{}{})".format("(sAMAccountName={})".format(filter_login), "(mail={})".format(filter_login))

    entries = ad_search_all_bases(ldap_filter, ["cn", "sAMAccountName", "memberOf"])

    if not entries:
        return None

    entry = entries[0]
    return {
        "dn": entry.entry_dn,
        "cn": str(entry.cn),
        "sam": str(entry.sAMAccountName),
        "groups": [str(g) for g in entry.memberOf],
    }


def check_2fa_group(login: str) -> dict:
    """Проверить, входит ли пользователь в группу 2FA."""
    user = find_user(login)
    if user is None:
        return {"found": False, "error": f"Пользователь '{login}' не найден в AD."}

    # Ищем группу, содержащую "2FA" в имени
    groups_2fa = [g for g in user["groups"] if "2FA" in g.upper()]

    return {
        "found": True,
        "user": user,
        "in_2fa_group": len(groups_2fa) > 0,
        "matching_groups": groups_2fa,
    }


def main():
    print("\n" + "=" * 60)
    print("  Проверка пользователя в группе 2FA (Active Directory)")
    print("=" * 60)
    print(f"\n  Сервер AD: {AD_SERVER}")
    print(f"  Базы поиска: {config.AD_BASES}")
    print(f"  Подключено как: {AD_USER}")
    print()

    while True:
        login = input("  Введите логин (sAMAccountName или email) или 'q' для выхода:\n  > ").strip()
        if not login or login.lower() == "q":
            print("\n  До свидания!\n")
            break

        result = check_2fa_group(login)

        if not result["found"]:
            print(f"\n  ❌ {result['error']}")
            continue

        u = result["user"]
        print(f"\n  ✅ Пользователь найден:")
        print(f"     CN:       {u['cn']}")
        print(f"     sAM:      {u['sam']}")
        print(f"     DN:       {u['dn']}")
        print(f"     Групп:    {len(u['groups'])}")

        if result["in_2fa_group"]:
            print(f"\n  🟢 Пользователь ВХОДИТ в группу 2FA:")
            for g in result["matching_groups"]:
                print(f"     {g}")
        else:
            print(f"\n  🔴 Пользователь НЕ найден в группе 2FA")
            if u["groups"]:
                print(f"\n  Все группы пользователя ({len(u['groups'])}):")
                for g in u["groups"]:
                    print(f"     {g}")
        print()


if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        print("\n  Прервано пользователем.\n")
    except Exception as e:
        print(f"\n  ❌ Ошибка: {e}")
        sys.exit(1)
