# /opt/trueconf_bot/utils/texts.py
# Все текстовые сообщения бота, отправляемые пользователю

# =========================================================
# GLOBAL CONSTANTS
# =========================================================

# --- Main Bot ---
# Общее для главного бота
UNKNOWN_MAIN_CMD_TEXT = (
    "⚠️ <b>Неизвестная команда.</b>\n\n"
    "Пожалуйста, используйте только цифры, соответствующие нужным пунктам меню, и отправьте выбранную цифру мне в сообщении."
)

# --- Emoji Digits ---
# Используются для навигации и выбора пунктов меню
EMOJI_DIGITS = {
    "0": "0⃣",
    "1": "1⃣",
    "2": "2⃣",
    "3": "3⃣",
    "4": "4⃣",
    "5": "5⃣",
    "6": "6⃣",
    "7": "7⃣",
    "8": "8⃣",
    "9": "9⃣",
    "10": "🔟"
}

# --- Footer Templates ---
# Шаблоны подвалов сообщений для навигации

def _footer(emojis: dict) -> str:
    """Стандартный футер с кнопками Назад и Меню"""
    return f"\n\n<i>{emojis['9']} — Назад\n{emojis['0']} — В главное меню</i>"

def _footer_main_only(emojis: dict) -> str:
    """Футер только с кнопкой Меню"""
    return f"\n\n<i>{emojis['0']} — В главное меню</i>"


# =========================================================
# TRANSCRIPTION BOT
# =========================================================
# Модуль для расшифровки аудио и видео файлов

# --- Private functions (Internal logic) ---

def _transcription_welcome(emojis: dict) -> str:
    return (
        f"🎙 <b>Добро пожаловать! Я — Ассистент расшифровки совещаний.</b>\n\n"
        f"Я помогу вам перевести аудио или видео в текст, а также подготовлю краткое резюме вашей встречи.\n\n"
        f"📎 Для начала работы просто отправьте нужный файл прямо в этот чат.\n\n"
        f"{emojis['0']} — В главное меню"
    )

def _transcription_unknown(emojis: dict) -> str:
    return (
        f"⚠️ <b>Неизвестная команда.</b>\n\n"
        f"Пожалуйста, отправьте в сообщении мне нужную цифру соответствующего пункта меню в чат."
    )

def _transcription_bad_extension(ext: str, emojis: dict) -> str:
    return (
        f"❌ <b>Ошибка: Недопустимый формат файла ({ext}).</b>\n\n"
        f"Пожалуйста, отправьте поддерживаемый аудио или видео файл.\n\n"
        f"{_footer(emojis)}"
    )

def _transcription_uploading() -> str:
    return "⏳ <b>Загружаю файл...</b>"

def _transcription_success(email: str, emojis: dict) -> str:
    return (
        f"✅ <b>Хорошо, файл принят в обработку.</b>\n\n"
        f"Как только всё будет готово, я отправлю вам результаты на почту (<code>{email}</code>).\n\n"
        f"⏳ Обычно это занимает от 5 до 30 минут.\n\n"
        f"{_footer(emojis)}"
    )

def _transcription_api_error(status_code: int, emojis: dict) -> str:
    return f"❌ <b>Ошибка API сервера ({status_code}).</b>{_footer(emojis)}"

def _transcription_system_error(emojis: dict) -> str:
    return f"❌ <b>Произошла системная ошибка при передаче файла.</b>{_footer(emojis)}"

# --- Public constants and functions ---

TRANSCRIPTION_MAIN_MENU_TEXT = _transcription_welcome(EMOJI_DIGITS)
TRANSCRIPTION_UNKNOWN_CMD_TEXT = _transcription_unknown(EMOJI_DIGITS)

def transcription_error_bad_extension(ext: str) -> str:
    return _transcription_bad_extension(ext, EMOJI_DIGITS)

TRANSCRIPTION_UPLOADING_TEXT = _transcription_uploading()

def transcription_success_received(email: str) -> str:
    return _transcription_success(email, EMOJI_DIGITS)

def transcription_error_api(status_code: int) -> str:
    return _transcription_api_error(status_code, EMOJI_DIGITS)

def transcription_error_system() -> str:
    return _transcription_system_error(EMOJI_DIGITS)


# =========================================================
# SERVICE DESK BOT
# =========================================================
# Модуль для создания и управления заявками в Service Desk

# --- Private functions (Internal logic) ---

def _sd_welcome(emojis: dict) -> str:
    return (
        f"🎫 <b>Режим создания заявки в Service Desk</b>\n\n"
        f"• Опишите проблему текстом.\n"
        f"• Можно прикрепить фото или документ.\n\n"
        f"{emojis['0']} — В главное меню"
    )

def _sd_unknown(emojis: dict) -> str:
    return (
        f"⚠️ <b>Неизвестная команда.</b>\n"
        f"Пожалуйста, используйте цифры меню из сообщения выше.\n\n"
        f"{emojis['9']} — Назад\n"
        f"{emojis['0']} — В главное меню"
    )

def _sd_text_required(emojis: dict) -> str:
    return f"⚠️ <b>Сначала опишите проблему текстом.</b>"

def _sd_creating() -> str:
    return "⏳ Создаю заявку, пожалуйста, подождите..."

def _sd_ticket_created(ticket_id: int, subject: str, description: str, emojis: dict) -> str:
    clean_desc = description.replace("\n", " ").strip()
    if len(clean_desc) > 150:
        clean_desc = clean_desc[:147] + "..."
    return (
        f"✅ <b>Заявка #{ticket_id} создана!</b>\n\n"
        
        f"📌 <b>Тема: {subject}</b>\n\n"
        f"📝 <b>Текст: {clean_desc}</b>\n\n"
        
        f"Если нужно добавить скриншоты или документ — отправьте их сейчас.\n\n"
        f"{_footer(emojis)}"
    )

def sd_ticket_created(ticket_id: int, subject: str, description: str) -> str:
    return _sd_ticket_created(ticket_id, subject, description, EMOJI_DIGITS)

def _sd_system_error(emojis: dict) -> str:
    return f"❌ <b>Системная ошибка.</b> Попробуйте позже.{_footer_main_only(emojis)}"

def _sd_uploading_file(ticket_id: int, emojis: dict) -> str:
    return f"⏳ Загружаю файл в заявку #{ticket_id}..."

def _sd_file_attached(emojis: dict) -> str:
    return f"✅ <b>Файл успешно прикреплен!</b>{_footer(emojis)}"

def _sd_file_upload_error(emojis: dict) -> str:
    return f"❌ <b>Ошибка загрузки файла.</b>{_footer_main_only(emojis)}"

# --- Public constants and functions ---

SD_MAIN_MENU_TEXT = _sd_welcome(EMOJI_DIGITS)
SD_UNKNOWN_CMD_TEXT = _sd_unknown(EMOJI_DIGITS)
SD_TEXT_REQUIRED = _sd_text_required(EMOJI_DIGITS)
SD_CREATING = _sd_creating()

def sd_ticket_create_error() -> str:
    return _sd_ticket_create_error(EMOJI_DIGITS)

def sd_system_error() -> str:
    return _sd_system_error(EMOJI_DIGITS)

def sd_uploading_file(ticket_id: int) -> str:
    return _sd_uploading_file(ticket_id, EMOJI_DIGITS)

def sd_file_attached() -> str:
    return _sd_file_attached(EMOJI_DIGITS)

def sd_file_upload_error() -> str:
    return _sd_file_upload_error(EMOJI_DIGITS)


# =========================================================
# PHOTO BOT
# =========================================================
# Модуль для обновления фото профиля

# --- Private functions (Internal logic) ---

def _photo_welcome(emojis: dict) -> str:
    return (
        f"🖼 <b>Режим обновления фото профиля</b>\n\n"
        f"📸 Пришлите мне вашу фотографию.\n\n"
        f"{emojis['0']} — В главное меню"
    )

def _photo_unknown(emojis: dict) -> str:
    return (
        f"⚠️ <b>Неизвестная команда.</b>\n"
        f"Пожалуйста, используйте цифры меню из сообщения выше.\n\n"
        f"{emojis['9']} — Назад\n"
        f"{emojis['0']} — В главное меню"
    )

def _photo_error_handling(emojis: dict) -> str:
    return (
        f"⚠️ <i>В данный момент выполнить это действие невозможно. "
        f"Информация о проблеме передана ответственным.\n"
        f"Приносим извинения за доставленные неудобства.</i>\n\n"
        f"{emojis['0']} — В главное меню"
    )

def _photo_uploading() -> str:
    return "⏳ Отправка..."

def _photo_success_sent() -> str:
    return "📩 <b>Фото отправлено на утверждение.</b>"

def _photo_cancel(emojis: dict) -> str:
    return (
        f"🚫 Отменено. Пришлите другое фото.\n\n"
        f"{emojis['0']} — В главное меню"
    )

def _photo_processing() -> str:
    return "⏳ Обработка..."

def _photo_preview_ready(emojis: dict) -> str:
    return (
        f"... <b>Фото готово!</b>\n\n"
        f"{emojis['1']} — Отправить на утверждение\n"
        f"{emojis['2']} — Попробовать другое\n\n"
        f"{emojis['0']} — В главное меню"
    )

def _photo_error_processing(error_text: str, emojis: dict) -> str:
    return (
        f"❌ <b>Ошибка:</b> {error_text}\n\n"
        f"Пожалуйста, отправьте другое фото.\n\n"
        f"{emojis['0']} — В главное меню"
    )

# --- Public constants and functions ---

PHOTO_MAIN_MENU_TEXT = _photo_welcome(EMOJI_DIGITS)
PHOTO_UNKNOWN_CMD_TEXT = _photo_unknown(EMOJI_DIGITS)

def photo_error_handling() -> str:
    return _photo_error_handling(EMOJI_DIGITS)

PHOTO_UPLOADING_TEXT = _photo_uploading()

def photo_success_sent() -> str:
    return _photo_success_sent()

def photo_cancel_text() -> str:
    return _photo_cancel(EMOJI_DIGITS)

PHOTO_PROCESSING_TEXT = _photo_processing()

def photo_preview_ready() -> str:
    return _photo_preview_ready(EMOJI_DIGITS)

def photo_error_processing(error_text: str) -> str:
    return _photo_error_processing(error_text, EMOJI_DIGITS)


# =========================================================
# SEARCH BOT
# =========================================================
# Модуль поиска по регламентам

# --- Private functions (Internal logic) ---

def _search_welcome(emojis: dict) -> str:
    return (
        f"📚 <b>Поиск по регламентам</b>\n\n"
        f"Введите ваш вопрос (например: <i>'время хранения электронных документов'</i> ).\n"
        f"Бот найдет наиболее подходящие абзацы из нормативных документов.\n\n"
        f"Для возврата в главное меню отправьте {emojis['0']}."
    )

def _search_unknown(emojis: dict) -> str:
    return (
        f"⚠️ <b>Неизвестная команда.</b>\n"
        f"Пожалуйста, используйте цифры меню из сообщения выше.\n\n"
        f"{emojis['9']} — Назад\n"
        f"{emojis['0']} — В главное меню"
    )

def _search_searching() -> str:
    return "🔍 <b>Ищу информацию в регламентах...</b>"

def _search_not_found(emojis: dict) -> str:
    return (
        f"🤖 Точной информации в регламентах не найдено.\n\n"
        f"Для выхода отправьте {emojis['0']}."
    )

def _search_feedback_thanks(emojis: dict) -> str:
    return (
        f"🙏 <b>Спасибо за ваш отзыв!</b> Мы передали его разработчикам.\n\n"
        f"🔍 <b>Можете сразу задать следующий вопрос по регламентам.</b>\n\n"
        f"Для выхода отправьте {emojis['0']}."
    )

def _search_feedback_info(emojis: dict) -> str:
    return (
        f"⚠️ <b>Информация передана.</b>\n\n"
        f"Если желаете, напишите прямо сейчас текстовым сообщением, что конкретно вам не понравилось в ответе.\n\n"
        f"{emojis['1']} — Задать ещё вопрос\n"
        f"{emojis['0']} — Выйти в главное меню"
    )

def _search_unavailable(emojis: dict) -> str:
    return (
        "⚠️ <i>В данный момент выполнить это действие невозможно. "
        "Информация о проблеме передана ответственным.\n"
        "Приносим извинения за доставленные неудобства.</i>\n\n"
        f"<i>{emojis['0']} — В главное меню</i>"
    )

# --- Public constants and functions ---

SEARCH_MAIN_MENU_TEXT = _search_welcome(EMOJI_DIGITS)
SEARCH_UNKNOWN_CMD_TEXT = _search_unknown(EMOJI_DIGITS)

def search_searching_text() -> str:
    return _search_searching()

def search_not_found_text(emojis: dict) -> str:
    return _search_not_found(emojis)

def search_feedback_thanks_text(emojis: dict) -> str:
    return _search_feedback_thanks(emojis)

def search_feedback_info_text(emojis: dict) -> str:
    return _search_feedback_info(emojis)

def search_unavailable_action(emojis: dict) -> str:
    return _search_unavailable(emojis)


# =========================================================
# LK BOT
# =========================================================
# Модуль Личного Кабинета (финансовые документы, табель и др.)

# --- Constants ---

DOC_TYPES = {
    "1": "Справка о доходах физического лица (2-НДФЛ)",
    "2": "Справка об удержаниях за ДМС",
    "3": "Справка о средней заработной плате",
    "4": "Справка о получении единовременного пособия по рождению ребенка",
    "5": "Справка о получении ежемесячного пособия и назначении отпуска по уходу за ребенком",
    "6": "Справка об удержаниях по исполнительным листам",
    "7": "Копия трудовой книжки"
}

# --- Private functions (Internal logic) ---

def _lk_error_handling(emojis: dict) -> str:
    return (
        "⚠️ <i>В данный момент выполнить это действие невозможно. Информация о проблеме передана ответственным. Приносим извинения за доставленные неудобства.</i>\n\n"
        f"<i>{emojis['9']} — Назад\n{emojis['0']} — В главное меню</i>"
    )

def _lk_auth_processing(emojis: dict) -> str:
    return "⏳ <i>Проверка безопасности... Запрашиваю контакты авторизации...</i>"

def _lk_auth_success(emojis: dict) -> str:
    return "⏳ <i>Авторизация успешна. Загружаю детализацию расчетного листа...</i>"

def _lk_auth_2fa_expired(emojis: dict) -> str:
    return f"⏱ <b>Время действия кода подтверждения изменилось или истекло.</b>\nПожалуйста, запросите расчетный лист заново.{emojis['9']} — Назад"

def _lk_auth_2fa_wrong_code(emojis: dict, attempts_left: int) -> str:
    return (
        f"⚠️ <b>Неверный код подтверждения.</b>\nОсталось попыток: {attempts_left}. Попробуйте еще раз или вернитесь назад.\n\n<i>{emojis['9']} — Назад\n{emojis['0']} — В главное меню</i>"
    )

def _lk_auth_2fa_blocked_max(emojis: dict, minutes: int) -> str:
    return (
        f"❌ <b>Превышено максимальное количество попыток ввода кода.</b>\nДоступ к финансовым документам заблокирован на <b>{minutes} минут</b>.<br>\n<i>{emojis['9']} — Назад\n{emojis['0']} — В главное меню</i>"
    )

def _lk_payslip_loading(emojis: dict) -> str:
    return "⏳ <i>Формирую архив расчетных листков...</i>"

def _lk_vacation_loading(emojis: dict) -> str:
    return "⏳ <i>Формирую справку по отпускам...</i>"

def _lk_sick_loading(emojis: dict) -> str:
    return "⏳ <i>Загружаю историю больничных листов...</i>"

def _lk_missions_loading(emojis: dict) -> str:
    return "⏳ <i>Загружаю историю командировок...</i>"

def _lk_rewards_loading(emojis: dict) -> str:
    return "⏳ <i>Ищу информацию о ваших наградах...</i>"

def _lk_transfers_loading(emojis: dict) -> str:
    return "⏳ <i>Загружаю историю кадровых перемещений...</i>"

def _lk_tabel_loading(emojis: dict) -> str:
    return "⏳ <i>Рассчитываю баланс рабочего времени...</i>"

def _lk_auth_sending(emojis: dict) -> str:
    return "⏳ <i>Отправка заявки...</i>"

def _lk_success_submission(emojis: dict) -> str:
    return (
        "✅ <b>Ваша заявка успешно отправлена!</b>\n"
        "Специалисты свяжутся с вами по готовности документа.\n\n"
        f"<i>{emojis['9']} — Назад в список справок\n{emojis['0']} — В главное меню</i>"
    )

def _lk_main_menu_text(header: str, emojis: dict) -> str:
    return (
        f"{header}\n"
        f"{emojis['1']} — Расчётный лист\n"
        f"{emojis['2']} — Информация о днях отпуска\n"
        f"{emojis['3']} — Больничные\n"
        f"{emojis['4']} — Командировки\n"
        f"{emojis['5']} — Награды\n"
        f"{emojis['6']} — Переводы\n"
        f"{emojis['7']} — Табель учёта рабочего времени\n"
        f"{emojis['8']} — Справки\n\n"
        f"<i>{emojis['0']} — Вернуться в главное меню</i>"
    )

def _lk_tabel_months_menu_text(prev_1, prev_2, months_ru, emojis: dict) -> str:
    return (
        "⏱ <b>Выберите месяц для просмотра табеля:</b>\n\n"
        f"{emojis['1']} — {months_ru[prev_1.month]} {prev_1.year} г.\n"
        f"{emojis['2']} — {months_ru[prev_2.month]} {prev_2.year} г.\n\n"
        f"<i>{emojis['9']} — Назад\n{emojis['0']} — В главное меню</i>"
    )

def _lk_payslip_months_menu_text(months_data: list, months_ru: dict, emojis: dict) -> str:
    menu_text = "📅 <b>Выберите месяц для просмотра:</b>\n\n"
    for idx, cmonth in enumerate(months_data, start=1):
        month_name = months_ru.get((cmonth - 1) % 12 + 1, '00')
        year = (cmonth - 1) // 12
        menu_text += f"{emojis[str(idx)]} — {month_name} {year} г.\n"
    menu_text += f"\n<i>{emojis['9']} — Назад\n{emojis['0']} — В главное меню</i>"
    return menu_text

def _lk_docs_quantity_prompt(emojis: dict) -> str:
    return f"Укажите необходимое количество экземпляров (максимум — 5 шт.):\n\n<i>{emojis['9']} — Назад\n{emojis['0']} — В главное меню</i>"

def _lk_docs_year_prompt(emojis: dict) -> str:
    return f"📅 <b>Выберите год, за который требуется справка:</b>\n\n<i>{emojis['9']} — Назад\n{emojis['0']} — В главное меню</i>"

def _lk_docs_avg_salary_prompt(emojis: dict) -> str:
    return f"Укажите количество месяцев для расчета средней ЗП (например: 3):\n\n<i>{emojis['9']} — Назад\n{emojis['0']} — В главное меню</i>"

def _lk_docs_child_age_prompt(emojis: dict) -> str:
    return f"👶 <b>Выберите возраст ребенка (до скольки лет):</b>\n\n{emojis['1']} — до 1.5 лет\n{emojis['2']} — до 3 лет\n\n<i>{emojis['9']} — Назад\n{emojis['0']} — В главное меню</i>"

def _lk_docs_period_prompt(year: int, emojis: dict) -> str:
    return f"за {year} год\n\n<i>{emojis['9']} — Назад\n{emojis['0']} — В главное меню</i>"

def _lk_docs_child_age_options(emojis: dict) -> str:
    return f"{emojis['1']} — до 1.5 лет\n{emojis['2']} — до 3 лет\n\n<i>{emojis['9']} — Назад\n{emojis['0']} — В главное меню</i>"

def _lk_docs_period_options(emojis: dict) -> str:
    return f"{emojis['1']} — до 1.5 лет\n{emojis['2']} — до 3 лет\n\n<i>{emojis['9']} — Назад\n{emojis['0']} — В главное меню</i>"

def _lk_nav_text(emojis: dict) -> str:
    return f"\n\n<i>{emojis['9']} — Назад\n{emojis['0']} — В главное меню</i>"

# --- Public constants and functions ---

LK_DOCS_MENU_TEXT = (
    "\n".join([f"{EMOJI_DIGITS[k]} — {v}" for k, v in DOC_TYPES.items()]) + 
    f"\n\n<i>{EMOJI_DIGITS['9']} — Назад\n{EMOJI_DIGITS['0']} — В главное меню</i>"
)
LK_UNKNOWN_CMD_TEXT = (
    "⚠️ <b>Неизвестная команда.</b>\n"
    "Пожалуйста, выберите пункт меню, используя цифры или кнопки.<br>\n"
    f"<i>{EMOJI_DIGITS['9']} — Назад\n{EMOJI_DIGITS['0']} — В главное меню</i>"
)


def lk_error_handling(emojis: dict) -> str:
    return _lk_error_handling(emojis)

def lk_auth_processing(emojis: dict) -> str:
    return _lk_auth_processing(emojis)

def lk_auth_success(emojis: dict) -> str:
    return _lk_auth_success(emojis)

def lk_auth_2fa_expired(emojis: dict) -> str:
    return _lk_auth_2fa_expired(emojis)

def lk_auth_2fa_wrong_code(emojis: dict, attempts_left: int) -> str:
    return _lk_auth_2fa_wrong_code(emojis, attempts_left)

def lk_auth_2fa_blocked_max(emojis: dict, minutes: int) -> str:
    return _lk_auth_2fa_blocked_max(emojis, minutes)

def lk_payslip_loading(emojis: dict) -> str:
    return _lk_payslip_loading(emojis)

def lk_vacation_loading(emojis: dict) -> str:
    return _lk_vacation_loading(emojis)

def lk_sick_loading(emojis: dict) -> str:
    return _lk_sick_loading(emojis)

def lk_missions_loading(emojis: dict) -> str:
    return _lk_missions_loading(emojis)

def lk_rewards_loading(emojis: dict) -> str:
    return _lk_rewards_loading(emojis)

def lk_transfers_loading(emojis: dict) -> str:
    return _lk_transfers_loading(emojis)

def lk_tabel_loading(emojis: dict) -> str:
    return _lk_tabel_loading(emojis)

def lk_auth_sending(emojis: dict) -> str:
    return _lk_auth_sending(emojis)

def lk_success_submission(emojis: dict) -> str:
    return _lk_success_submission(emojis)

def lk_main_menu_text(header: str, emojis: dict) -> str:
    return _lk_main_menu_text(header, emojis)

def lk_tabel_months_menu_text(prev_1, prev_2, months_ru, emojis: dict) -> str:
    return _lk_tabel_months_menu_text(prev_1, prev_2, months_ru, emojis)

def lk_payslip_months_menu_text(months_data: list, months_ru: dict, emojis: dict) -> str:
    return _lk_payslip_months_menu_text(months_data, months_ru, emojis)

def lk_docs_quantity_prompt(emojis: dict) -> str:
    return _lk_docs_quantity_prompt(emojis)

def lk_docs_year_prompt(emojis: dict) -> str:
    return _lk_docs_year_prompt(emojis)

def lk_docs_avg_salary_prompt(emojis: dict) -> str:
    return _lk_docs_avg_salary_prompt(emojis)

def lk_docs_child_age_prompt(emojis: dict) -> str:
    return _lk_docs_child_age_prompt(emojis)

def lk_docs_period_prompt(year: int, emojis: dict) -> str:
    return _lk_docs_period_prompt(year, emojis)

def lk_docs_child_age_options(emojis: dict) -> str:
    return _lk_docs_child_age_options(emojis)

def lk_docs_period_options(emojis: dict) -> str:
    return _lk_docs_period_options(emojis)

def lk_nav_text(emojis: dict) -> str:
    return _lk_nav_text(emojis)

def lk_years_menu(current_year: int, emojis: dict) -> str:
    return lk_years_menu(current_year, emojis)


# =========================================================
# INSTRUCT BOT (Инструкции)
# =========================================================
# Модуль инструкций

# --- Private functions (Internal logic) ---

def _instruct_main_menu(emojis: dict) -> str:
    return (
        f"📋 <b>Выберите инструкцию:</b>\n\n"
        f"{emojis['1']} — 🖥 Trueconf\n"
        f"{emojis['2']} — 📧 Почта\n\n"
        f"<i>{emojis['0']} — В главное меню</i>"
    )
def _instruct_trueconf(emojis: dict) -> str:
    """Статический текст Trueconf — без проверки группы."""
    return (
        "🖥 <b>Инструкция по Trueconf</b>\n\n"
        "Данная функция находится в разработке.\n\n"
        f"<i>{emojis['9']} — Назад\n{emojis['0']} — В главное меню</i>"
    )


def _instruct_trueconf_with_ad(emojis: dict, cn: str, ticket_id: str = None) -> str:
    """
    Текст Trueconf с проверкой группы 2FA.
    cn — CN пользователя из AD.
    ticket_id — номер созданной заявки в SD.
    """
    from utils.ad_checker import check_group_membership

    result = check_group_membership(cn, "2FA")

    if not result["found"]:
        ticket_part = f"\n\n🎫 <b>Заявка #{ticket_id} создана!</b>" if ticket_id else ""
        return (
            f"🖥 <b>Инструкция по Trueconf</b>\n\n"
            f"Пользователь {cn} не найден в Active Directory.{ticket_part}\n\n"
            f"<i>{emojis['9']} — Назад\n{emojis['0']} — В главное меню</i>"
        )

    if result["in_group"]:
        body = (
            f"🖥 <b>Инструкция по Trueconf</b>\n\n"
            f"✅ <b>Доступ к Trueconf разрешён.</b>\n\n"
            f"У вас есть доступ к функциям Trueconf.\n\n"
            f"Детали:\n"
            f"• CN: {result['cn']}\n"
            f"• Группы 2FA: {', '.join(result['matching_groups'])}\n\n"
            f"<i>{emojis['9']} — Назад\n{emojis['0']} — В главное меню</i>"
        )
    else:
        ticket_part = f"\n\n🎫 <b>Заявка #{ticket_id} создана!</b>" if ticket_id else ""
        body = (
            f"🖥 <b>Инструкция по Trueconf</b>\n\n"
            f"❌ <b>Доступ к Trueconf запрещён.</b>\n\n"
            f"У вас нет группы 2FA в Active Directory.{ticket_part}\n\n"
            f"Детали:\n"
            f"• CN: {result['cn']}\n"
            f"• Групп 2FA: 0\n\n"
            f"<i>{emojis['9']} — Назад\n{emojis['0']} — В главное меню</i>"
        )

    return body


def _instruct_email(emojis: dict) -> str:
    return (
        "📧 <b>Инструкция по Почте</b>\n\n"
        "Данная функция находится в разработке.\n\n"
        f"<i>{emojis['9']} — Назад\n{emojis['0']} — В главное меню</i>"
    )

# --- Public constants and functions ---

INSTRUCT_MAIN_MENU_TEXT = _instruct_main_menu(EMOJI_DIGITS)
INSTRUCT_TRUECONF_TEXT = _instruct_trueconf(EMOJI_DIGITS)
INSTRUCT_TRUECONF_WITH_AD = _instruct_trueconf_with_ad
INSTRUCT_EMAIL_TEXT = _instruct_email(EMOJI_DIGITS)
