import logging
import sqlite3
import random
from aiogram import Router, F
from aiogram.types import CallbackQuery, InlineKeyboardMarkup, InlineKeyboardButton
from aiogram.fsm.context import FSMContext
from db import get_user_language, get_language_text, get_user_balance, update_user_balance, DATA_DB, MENU_DB
from handlers.order_save import save_order

router = Router(name="payment_handlers")
logger = logging.getLogger(__name__)

PAYMENT_CB_PREFIX = "payment:"
WALLET_CB_PREFIX = "wallet:"
BACK_NAV_PREFIX = "back_nav:"
BANK_CARD_PREFIX = "bank_card:"
CONFIRM_PAYMENT_PREFIX = "confirm_payment:"

def truncate_callback_data(data: str, max_length: int = 64) -> str:
    """Обрезает callback_data до максимальной длины"""
    if len(data) <= max_length:
        return data
    return data[:max_length]

def get_button9_text(lang: str) -> str:
    label = "⬅️ Назад"
    try:
        conn = sqlite3.connect(MENU_DB)
        cur = conn.cursor()
        cur.execute("SELECT button9 FROM language WHERE name = ?", (lang,))
        row = cur.fetchone()
        conn.close()
        if row and row[0] and str(row[0]).strip():
            label = str(row[0]).strip()
    except Exception as e:
        logger.error(f"get_button9_text error for lang={lang}: {e}")
    return label

def get_button13_text(lang: str) -> str:
    label = "💳 CryptoBot"
    try:
        conn = sqlite3.connect(MENU_DB)
        cur = conn.cursor()
        cur.execute("SELECT button13 FROM language WHERE name = ?", (lang,))
        row = cur.fetchone()
        conn.close()
        if row and row[0] and str(row[0]).strip():
            label = str(row[0]).strip()
    except Exception as e:
        logger.error(f"get_button13_text error for lang={lang}: {e}")
    return label

def get_button14_text(lang: str) -> str:
    label = "💳 Банковская карта"
    try:
        conn = sqlite3.connect(MENU_DB)
        cur = conn.cursor()
        cur.execute("SELECT button14 FROM language WHERE name = ?", (lang,))
        row = cur.fetchone()
        conn.close()
        if row and row[0] and str(row[0]).strip():
            label = str(row[0]).strip()
    except Exception as e:
        logger.error(f"get_button14_text error for lang={lang}: {e}")
    return label

def get_button16_text(lang: str) -> str:
    label = "💰 Оплатить с баланса"
    try:
        conn = sqlite3.connect(MENU_DB)
        cur = conn.cursor()
        cur.execute("SELECT button16 FROM language WHERE name = ?", (lang,))
        row = cur.fetchone()
        conn.close()
        if row and row[0] and str(row[0]).strip():
            label = str(row[0]).strip()
    except Exception as e:
        logger.error(f"get_button16_text error for lang={lang}: {e}")
    return label

def get_button18_text(lang: str) -> str:
    label = "✅ Подтвердить оплату"
    try:
        conn = sqlite3.connect(MENU_DB)
        cur = conn.cursor()
        cur.execute("SELECT button18 FROM language WHERE name = ?", (lang,))
        row = cur.fetchone()
        conn.close()
        if row and row[0] and str(row[0]).strip():
            label = str(row[0]).strip()
    except Exception as e:
        logger.error(f"get_button18_text error for lang={lang}: {e}")
    return label

def get_button21_text(lang: str) -> str:
    label = "📞 Оператор"
    try:
        conn = sqlite3.connect(MENU_DB)
        cur = conn.cursor()
        cur.execute("SELECT button21 FROM language WHERE name = ?", (lang,))
        row = cur.fetchone()
        conn.close()
        if row and row[0] and str(row[0]).strip():
            label = str(row[0]).strip()
    except Exception as e:
        logger.error(f"get_button21_text error for lang={lang}: {e}")
    return label

def get_product_base_price(product_id: int, tag_index: int) -> float | None:
    """Получает базовую цену товара (без конвертации по курсу)"""
    try:
        conn = sqlite3.connect(DATA_DB)
        cur = conn.cursor()
        
        tag_column = f"product_tags{tag_index}"
        
        cur.execute("PRAGMA table_info(products)")
        columns = [col[1] for col in cur.fetchall()]
        
        if tag_column not in columns:
            conn.close()
            return None
        
        cur.execute(f"SELECT {tag_column} FROM products WHERE product_id = ?", (product_id,))
        row = cur.fetchone()
        conn.close()
        
        if row and row[0]:
            tag_data = str(row[0]).strip()
            if tag_data:
                parts = [p.strip() for p in tag_data.split(',')]
                if len(parts) >= 2:
                    try:
                        base_price = float(parts[1])
                        return base_price
                    except ValueError:
                        return None
        
        return None
        
    except Exception as e:
        logger.error(f"get_product_base_price error product_id={product_id}, tag_index={tag_index}: {e}")
        return None

def get_bank_card_texts(city_id: int) -> list[str]:
    """Получает ВСЕ тексты банковской карты для указанного города"""
    try:
        conn = sqlite3.connect(DATA_DB)
        cur = conn.cursor()
        
        # Получаем все текстовые колонки из bank_card
        cur.execute("PRAGMA table_info(bank_card)")
        columns = [col[1] for col in cur.fetchall()]
        
        # Формируем список текстовых колонок (text, text2, text3, ..., text10)
        text_columns = []
        for col in columns:
            if col.startswith('text'):
                text_columns.append(col)
        
        if not text_columns:
            return []
        
        # Собираем все тексты для города
        query = f"SELECT {', '.join(text_columns)} FROM bank_card WHERE city_id LIKE ?"
        cur.execute(query, (f'%{city_id}%',))
        row = cur.fetchone()
        conn.close()
        
        if not row:
            return []
        
        # Собираем все непустые тексты
        texts = []
        for i, col in enumerate(text_columns):
            if row[i] and str(row[i]).strip():
                texts.append(str(row[i]).strip())
        
        return texts
        
    except Exception as e:
        logger.error(f"get_bank_card_texts error for city_id={city_id}: {e}")
        return []

def get_random_bank_card_text(city_id: int) -> str | None:
    """Возвращает случайный текст банковской карты для города"""
    texts = get_bank_card_texts(city_id)
    if not texts:
        return None
    
    return random.choice(texts)

def format_bank_card_text(text: str, user_id: int, base_price: float) -> str:
    """Форматирует текст банковской карты с заменой плейсхолдеров"""
    if not text:
        return text
    
    # Курсы валют (примерные, можно заменить на реальные)
    USD_TO_RUB = 90.0  # 1 USD = 90 RUB
    USD_TO_GRN = 40.0  # 1 USD = 40 GRN
    
    # Базовая сумма в USD
    base_usd = base_price
    
    # Заменяем плейсхолдеры
    formatted_text = text
    
    # {user_id}
    formatted_text = formatted_text.replace('{user_id}', str(user_id))
    
    # {summa-rub} - сумма в рублях
    summa_rub = base_usd * USD_TO_RUB
    formatted_text = formatted_text.replace('{summa-rub}', f"{summa_rub:.2f}")
    
    # {summa-grn} - сумма в гривнах
    summa_grn = base_usd * USD_TO_GRN
    formatted_text = formatted_text.replace('{summa-grn}', f"{summa_grn:.2f}")
    
    # {summa-rub+10%} - сумма в рублях + 10%
    if '{summa-rub+10%}' in formatted_text:
        summa_rub_plus_10 = summa_rub * 1.1
        formatted_text = formatted_text.replace('{summa-rub+10%}', f"{summa_rub_plus_10:.2f}")
    
    # {summa-grn+10%} - сумма в гривнах + 10%
    if '{summa-grn+10%}' in formatted_text:
        summa_grn_plus_10 = summa_grn * 1.1
        formatted_text = formatted_text.replace('{summa-grn+10%}', f"{summa_grn_plus_10:.2f}")
    
    return formatted_text

def format_wallet_text(text: str, user_id: int, base_price: float) -> str:
    """Форматирует текст кошелька с заменой плейсхолдеров"""
    if not text:
        return text
    
    formatted_text = text
    
    # {user_id}
    formatted_text = formatted_text.replace('{user_id}', str(user_id))
    
    # {summa} - базовая сумма в USD (без валюты)
    formatted_text = formatted_text.replace('{summa}', f"{base_price:.2f}")
    
    return formatted_text

def build_payment_keyboard(lang: str, product_id: int, city_id: int, tag_index: int, tag_name: str, district: str, user_id: int) -> InlineKeyboardMarkup:
    """Строит клавиатуру с опциями оплаты"""
    rows: list[list[InlineKeyboardButton]] = []
    
    base_price = get_product_base_price(product_id, tag_index)
    
    # АГРЕССИВНО обрезаем длинные значения для callback_data
    truncated_tag_name = tag_name[:8] if tag_name else ""  # Уменьшили до 8 символов
    truncated_district = district[:8] if district else ""  # Уменьшили до 8 символов
    
    button13_text = get_button13_text(lang)
    rows.append([InlineKeyboardButton(
        text=button13_text,
        callback_data=truncate_callback_data(f"{PAYMENT_CB_PREFIX}cryptobot:{product_id}:{city_id}:{tag_index}:{truncated_tag_name}:{truncated_district}", 64)
    )])
    
    button14_text = get_button14_text(lang)
    rows.append([InlineKeyboardButton(
        text=button14_text,
        callback_data=truncate_callback_data(f"{PAYMENT_CB_PREFIX}card:{product_id}:{city_id}:{tag_index}:{truncated_tag_name}:{truncated_district}", 64)
    )])
    
    if base_price is not None:
        user_balance = get_user_balance(user_id)
        if user_balance >= base_price:
            button16_text = get_button16_text(lang)
            rows.append([InlineKeyboardButton(
                text=button16_text,
                callback_data=truncate_callback_data(f"{PAYMENT_CB_PREFIX}balance:{product_id}:{city_id}:{tag_index}:{truncated_tag_name}:{truncated_district}", 64)
            )])
    
    button21_text = get_button21_text(lang)
    rows.append([InlineKeyboardButton(
        text=button21_text,
        callback_data=truncate_callback_data(f"{PAYMENT_CB_PREFIX}operator:{product_id}:{city_id}:{tag_index}:{truncated_tag_name}:{truncated_district}", 64)
    )])
    
    # Возврат к выбору района
    back_to_districts_cb = truncate_callback_data(f"tag:{product_id}:{city_id}:{tag_index}:{truncated_tag_name}", 64)
    rows.append([InlineKeyboardButton(text=get_button9_text(lang), callback_data=back_to_districts_cb)])
    
    return InlineKeyboardMarkup(inline_keyboard=rows)

def get_wallets() -> list[tuple[int, str, str, str, str, str, str]]:
    """Получает список кошельков из таблицы wallets со всеми текстами"""
    try:
        conn = sqlite3.connect(DATA_DB)
        cur = conn.cursor()
        
        cur.execute("""
            SELECT name FROM sqlite_master 
            WHERE type='table' AND name='wallets'
        """)
        if not cur.fetchone():
            conn.close()
            return []
        
        # Получаем все колонки таблицы wallets
        cur.execute("PRAGMA table_info(wallets)")
        columns = [col[1] for col in cur.fetchall()]
        
        # Формируем запрос в зависимости от доступных колонок
        select_columns = ["id", "name", "text"]
        for i in range(2, 6):
            col_name = f"text{i}"
            if col_name in columns:
                select_columns.append(col_name)
        
        query = f"SELECT {', '.join(select_columns)} FROM wallets ORDER BY name"
        cur.execute(query)
        rows = cur.fetchall()
        conn.close()
        
        wallets = []
        for row in rows:
            if row and row[1]:  # Проверяем что есть хотя бы name
                wallet_data = {
                    'id': int(row[0]),
                    'name': str(row[1]).strip(),
                    'texts': []
                }
                
                # Собираем все доступные тексты
                for i in range(2, len(row)):
                    if row[i] and str(row[i]).strip():
                        wallet_data['texts'].append(str(row[i]).strip())
                
                # Если нет дополнительных текстов, используем основной text
                if not wallet_data['texts'] and len(row) > 2 and row[2]:
                    wallet_data['texts'].append(str(row[2]).strip())
                
                wallets.append(wallet_data)
        
        return wallets
        
    except Exception as e:
        logger.error(f"get_wallets error: {e}")
        return []

def get_random_wallet_text(wallet_texts: list[str]) -> str:
    """Возвращает случайный текст из списка текстов кошелька"""
    if not wallet_texts:
        return "Текст кошелька не найден"
    
    if len(wallet_texts) == 1:
        return wallet_texts[0]
    
    # Рандомный выбор текста
    return random.choice(wallet_texts)

def build_wallets_keyboard(lang: str, wallets: list[dict], product_id: int, city_id: int, tag_index: int, tag_name: str, district: str) -> InlineKeyboardMarkup:
    """Строит клавиатуру с кошельками"""
    rows: list[list[InlineKeyboardButton]] = []
    
    # АГРЕССИВНО обрезаем длинные значения для callback_data
    truncated_tag_name = tag_name[:8] if tag_name else ""
    truncated_district = district[:8] if district else ""
    
    for wallet in wallets:
        rows.append([InlineKeyboardButton(
            text=wallet['name'],
            callback_data=f"{WALLET_CB_PREFIX}{wallet['id']}"
        )])
    
    back_to_payment_cb = truncate_callback_data(f"{BACK_NAV_PREFIX}payment:{product_id}:{city_id}:{tag_index}:{truncated_tag_name}:{truncated_district}", 64)
    rows.append([InlineKeyboardButton(text=get_button9_text(lang), callback_data=back_to_payment_cb)])
    
    return InlineKeyboardMarkup(inline_keyboard=rows)

def build_wallet_text_keyboard(lang: str, product_id: int, city_id: int, tag_index: int, tag_name: str, district: str, wallet_id: int) -> InlineKeyboardMarkup:
    """Строит клавиатуру с кнопкой подтверждения оплаты для текста кошелька"""
    rows = []
    
    # АГРЕССИВНО обрезаем длинные значения для callback_data
    truncated_tag_name = tag_name[:8] if tag_name else ""
    truncated_district = district[:8] if district else ""
    
    # Кнопка подтверждения оплаты
    button18_text = get_button18_text(lang)
    rows.append([InlineKeyboardButton(
        text=button18_text,
        callback_data=truncate_callback_data(f"{CONFIRM_PAYMENT_PREFIX}wallet:{product_id}:{city_id}:{tag_index}:{truncated_tag_name}:{truncated_district}:{wallet_id}", 64)
    )])
    
    # Кнопка назад
    back_to_wallets_cb = truncate_callback_data(f"{BACK_NAV_PREFIX}wallets:{product_id}:{city_id}:{tag_index}:{truncated_tag_name}:{truncated_district}", 64)
    rows.append([InlineKeyboardButton(text=get_button9_text(lang), callback_data=back_to_wallets_cb)])
    
    return InlineKeyboardMarkup(inline_keyboard=rows)

def build_bank_card_keyboard(lang: str, product_id: int, city_id: int, tag_index: int, tag_name: str, district: str) -> InlineKeyboardMarkup:
    """Строит клавиатуру для банковской карты с кнопкой подтверждения оплаты"""
    rows = []
    
    # АГРЕССИВНО обрезаем длинные значения для callback_data
    truncated_tag_name = tag_name[:8] if tag_name else ""  # Уменьшили до 8 символов
    truncated_district = district[:8] if district else ""  # Уменьшили до 8 символов
    
    # Собираем callback_data и обрезаем до 64 символов
    callback_data = f"{CONFIRM_PAYMENT_PREFIX}card:{product_id}:{city_id}:{tag_index}:{truncated_tag_name}:{truncated_district}"
    callback_data = truncate_callback_data(callback_data, 64)
    
    # Кнопка подтверждения оплаты
    button18_text = get_button18_text(lang)
    rows.append([InlineKeyboardButton(
        text=button18_text,
        callback_data=callback_data
    )])
    
    # Кнопка назад
    back_to_payment_cb = f"{BACK_NAV_PREFIX}payment:{product_id}:{city_id}:{tag_index}:{truncated_tag_name}:{truncated_district}"
    back_to_payment_cb = truncate_callback_data(back_to_payment_cb, 64)
    
    rows.append([InlineKeyboardButton(text=get_button9_text(lang), callback_data=back_to_payment_cb)])
    
    return InlineKeyboardMarkup(inline_keyboard=rows)

@router.callback_query(F.data.startswith(PAYMENT_CB_PREFIX))
async def on_payment_selected(cb: CallbackQuery, state: FSMContext):
    """Обработчик выбора способа оплаты"""
    user_id = cb.from_user.id
    lang = get_user_language(user_id)
    
    payload = cb.data[len(PAYMENT_CB_PREFIX):]
    try:
        payment_method, pid_str, cid_str, tag_index_str, tag_name, district = payload.split(":", 5)
        product_id = int(pid_str)
        city_id = int(cid_str)
        tag_index = int(tag_index_str)
    except Exception:
        await cb.answer("Ошибка выбора способа оплаты", show_alert=True)
        return
    
    try:
        await cb.message.delete()
    except Exception:
        pass
    
    # Сохраняем все данные в состоянии для использования в модулях оплаты
    await state.update_data(
        product_id=product_id,
        city_id=city_id,
        tag_index=tag_index,
        tag_name=tag_name,
        district=district,
        payment_method=payment_method
    )
    
    # Получаем базовую цену товара для проверки баланса
    base_price = get_product_base_price(product_id, tag_index)
    await state.update_data(product_base_price=base_price)
    
    # Передаем управление в соответствующие модули
    if payment_method == "cryptobot":
        # Передаем в cryptobot.py (как было раньше)
        from handlers.cryptobot import handle_cryptobot_payment
        await handle_cryptobot_payment(cb, state)
        
    elif payment_method == "card":
        # Обработка банковской карты
        await handle_bank_card_payment(cb, state)
        
    elif payment_method == "balance":
        # Обработка оплаты с баланса
        await handle_balance_payment(cb, state)
        
    elif payment_method == "operator":
        # Обработка связи с оператором
        await handle_operator_payment(cb, state)
    
    await cb.answer()

async def handle_bank_card_payment(cb: CallbackQuery, state: FSMContext):
    """Обработчик оплаты банковской картой - показывает СЛУЧАЙНЫЙ текст карты для города"""
    user_id = cb.from_user.id
    lang = get_user_language(user_id)
    
    print(f"=== HANDLE BANK CARD PAYMENT ===")
    
    # Получаем данные из состояния
    state_data = await state.get_data()
    product_id = state_data.get('product_id')
    city_id = state_data.get('city_id')
    tag_index = state_data.get('tag_index')
    tag_name = state_data.get('tag_name')
    district = state_data.get('district')
    base_price = state_data.get('product_base_price')
    
    try:
        await cb.message.delete()
    except Exception:
        pass
    
    # Получаем СЛУЧАЙНЫЙ текст банковской карты для города
    bank_card_text = get_random_bank_card_text(city_id)
    
    if bank_card_text and all([product_id, city_id, tag_index, tag_name, district]):
        # Форматируем текст с заменой плейсхолдеров
        formatted_text = format_bank_card_text(bank_card_text, user_id, base_price)
        
        kb = build_bank_card_keyboard(lang, product_id, city_id, tag_index, tag_name, district)
        await cb.message.answer(formatted_text, reply_markup=kb)
        print(f"Displayed formatted bank card text for user {user_id}, city_id: {city_id}")
    else:
        error_text = "Реквизиты банковской карты не найдены для вашего города"
        print(f"No bank card found for city_id: {city_id}")
        # Возврат к выбору способа оплаты
        text10 = get_language_text(lang, "text10") or "Выберите способ оплаты:"
        kb = build_payment_keyboard(lang, product_id, city_id, tag_index, tag_name, district, user_id)
        await cb.message.answer(error_text, reply_markup=kb)

async def handle_balance_payment(cb: CallbackQuery, state: FSMContext):
    """Обработчик оплаты с баланса"""
    user_id = cb.from_user.id
    lang = get_user_language(user_id)
    
    print(f"=== HANDLE BALANCE PAYMENT ===")
    
    # Получаем данные из состояния
    state_data = await state.get_data()
    base_price = state_data.get('product_base_price')
    
    if not base_price or base_price <= 0:
        error_text = "Ошибка: неверная цена товара"
        await cb.message.answer(error_text)
        return
    
    # Проверяем баланс пользователя
    user_balance = get_user_balance(user_id)
    
    if user_balance < base_price:
        error_text = get_language_text(lang, "text18") or "❌ Недостаточно средств на балансе!"
        await cb.message.answer(error_text)
        return
    
    # Списываем средства с баланса
    balance_updated = update_user_balance(user_id, base_price)
    
    if not balance_updated:
        error_text = "Ошибка списания средств с баланса"
        await cb.message.answer(error_text)
        return
    
    # Сохраняем заказ в базу данных
    order_saved = await save_order(state_data, user_id, "button16", cb.bot)
    
    if order_saved:
        print("Order successfully saved to database with payment method: button16")
        
        # Показываем text23 после успешной оплаты
        text23 = get_language_text(lang, "text23") or "✅ Оплата прошла успешно с вашего баланса!"
        await cb.message.answer(text23)
        print("Showing text23 after balance payment")
    else:
        print("Failed to save order to database")
        error_text = "Ошибка сохранения заказа"
        await cb.message.answer(error_text)
    
    # Очищаем состояние
    await state.clear()

async def handle_operator_payment(cb: CallbackQuery, state: FSMContext):
    """Обработчик связи с оператором - показывает кошельки"""
    user_id = cb.from_user.id
    lang = get_user_language(user_id)
    
    print(f"=== HANDLE OPERATOR PAYMENT ===")
    
    # Получаем данные из состояния
    state_data = await state.get_data()
    product_id = state_data.get('product_id')
    city_id = state_data.get('city_id')
    tag_index = state_data.get('tag_index')
    tag_name = state_data.get('tag_name')
    district = state_data.get('district')
    
    try:
        await cb.message.delete()
    except Exception:
        pass
    
    # Получаем текст text34, если не найден - используем button21
    text34_content = get_language_text(lang, "text34")
    if not text34_content:
        # Если text34 не найден, используем текст из button21
        text34_content = get_button21_text(lang)
        print(f"text34 not found, using button21 text: '{text34_content}'")
    
    # Получаем кошельки из базы данных
    wallets = get_wallets()
    
    if wallets and all([product_id, city_id, tag_index, tag_name, district]):
        # Сохраняем wallets в состоянии для использования при показе текста
        await state.update_data(wallets=wallets)
        
        # Строим клавиатуру с кошельками
        kb = build_wallets_keyboard(lang, wallets, product_id, city_id, tag_index, tag_name, district)
        await cb.message.answer(text34_content, reply_markup=kb)
        print(f"Displayed text34: '{text34_content}' with {len(wallets)} wallets")
    else:
        # Если кошельков нет или данные неполные, показываем сообщение об ошибке
        error_text = "Способы оплаты временно недоступны"
        print(f"No wallets found or incomplete data. Wallets: {len(wallets)}, Data complete: {all([product_id, city_id, tag_index, tag_name, district])}")
        # Возврат в главное меню
        from handlers.catalog import build_back_keyboard
        await cb.message.answer(error_text, reply_markup=build_back_keyboard(lang))
    
    # НЕ очищаем состояние, чтобы сохранить контекст для возврата

@router.callback_query(F.data.startswith(WALLET_CB_PREFIX))
async def on_wallet_clicked(cb: CallbackQuery, state: FSMContext):
    """Обработчик выбора кошелька - показывает РАНДОМНЫЙ текст кошелька"""
    user_id = cb.from_user.id
    lang = get_user_language(user_id)
    
    wallet_id = int(cb.data[len(WALLET_CB_PREFIX):])
    
    state_data = await state.get_data()
    product_id = state_data.get('product_id')
    city_id = state_data.get('city_id')
    tag_index = state_data.get('tag_index')
    tag_name = state_data.get('tag_name')
    district = state_data.get('district')
    base_price = state_data.get('product_base_price')
    wallets = state_data.get('wallets', [])
    
    try:
        await cb.message.delete()
    except Exception:
        pass
    
    # Находим выбранный кошелек
    selected_wallet = None
    for wallet in wallets:
        if wallet['id'] == wallet_id:
            selected_wallet = wallet
            break
    
    if selected_wallet and selected_wallet['texts']:
        # Выбираем случайный текст из доступных
        wallet_text = get_random_wallet_text(selected_wallet['texts'])
        
        # Форматируем текст с заменой плейсхолдеров
        formatted_wallet_text = format_wallet_text(wallet_text, user_id, base_price)
        
        print(f"Showing formatted text for wallet '{selected_wallet['name']}'. Available texts: {len(selected_wallet['texts'])}")
        
        if all([product_id, city_id, tag_index, tag_name, district]):
            kb = build_wallet_text_keyboard(lang, product_id, city_id, tag_index, tag_name, district, wallet_id)
            await cb.message.answer(formatted_wallet_text, reply_markup=kb)
        else:
            error_text = "Ошибка навигации"
            from handlers.catalog import build_back_keyboard
            await cb.message.answer(error_text, reply_markup=build_back_keyboard(lang))
    else:
        error_text = "Информация о кошельке не найдена"
        from handlers.catalog import build_back_keyboard
        await cb.message.answer(error_text, reply_markup=build_back_keyboard(lang))
    
    await cb.answer()

@router.callback_query(F.data.startswith(CONFIRM_PAYMENT_PREFIX))
async def on_payment_confirmed(cb: CallbackQuery, state: FSMContext):
    """Обработчик подтверждения оплаты"""
    user_id = cb.from_user.id
    lang = get_user_language(user_id)
    
    payload = cb.data[len(CONFIRM_PAYMENT_PREFIX):]
    try:
        parts = payload.split(":")
        payment_type = parts[0]
        product_id = int(parts[1])
        city_id = int(parts[2])
        tag_index = int(parts[3])
        tag_name = parts[4]
        district = parts[5]
        
        # Для wallet может быть дополнительный параметр wallet_id
        wallet_id = int(parts[6]) if payment_type == "wallet" and len(parts) > 6 else None
    except Exception as e:
        await cb.answer("Ошибка подтверждения оплаты", show_alert=True)
        return
    
    try:
        await cb.message.delete()
    except Exception:
        pass
    
    # Обновляем состояние
    state_data = await state.get_data()
    await state.update_data(
        product_id=product_id,
        city_id=city_id,
        tag_index=tag_index,
        tag_name=tag_name,
        district=district
    )
    
    # Определяем метод оплаты для сохранения
    if payment_type == "card":
        payment_method = "button14"  # Банковская карта
    elif payment_type == "wallet":
        payment_method = "operator_wallet"  # Кошелек оператора
    else:
        payment_method = "unknown"
    
    # Сохраняем заказ в базу данных
    order_saved = await save_order(await state.get_data(), user_id, payment_method, cb.bot)
    
    if order_saved:
        print(f"Order successfully saved to database with payment method: {payment_method}")
        
        # Показываем text17 после успешной оплаты для банковской карты и кошельков
        success_text = get_language_text(lang, "text17") or "✅ Оплата прошла успешно! Ожидайте доставки."
        
        await cb.message.answer(success_text)
        print(f"Showing text17 for {payment_type} payment")
    else:
        print("Failed to save order to database")
        error_text = "Ошибка сохранения заказа"
        await cb.message.answer(error_text)
    
    # Очищаем состояние
    await state.clear()
    
    await cb.answer()

@router.callback_query(F.data.startswith(BACK_NAV_PREFIX))
async def back_navigation_handler(cb: CallbackQuery, state: FSMContext):
    """Обработчик навигации назад"""
    user_id = cb.from_user.id
    lang = get_user_language(user_id)
    
    payload = cb.data[len(BACK_NAV_PREFIX):]
    parts = payload.split(":")
    
    if len(parts) < 6:
        from handlers.menu import send_main_menu
        await send_main_menu(user_id, cb.message.chat.id)
        await cb.answer()
        return
    
    nav_type = parts[0]
    product_id = int(parts[1])
    city_id = int(parts[2])
    tag_index = int(parts[3])
    tag_name = parts[4]
    district = parts[5]
    
    try:
        await cb.message.delete()
    except Exception:
        pass
    
    await state.update_data(
        product_id=product_id,
        city_id=city_id,
        tag_index=tag_index,
        tag_name=tag_name,
        district=district
    )
    
    if nav_type == "payment":
        text10 = get_language_text(lang, "text10") or "Выберите способ оплаты:"
        kb = build_payment_keyboard(lang, product_id, city_id, tag_index, tag_name, district, user_id)
        await cb.message.answer(text10, reply_markup=kb)
        
    elif nav_type == "wallets":
        text34_content = get_language_text(lang, "text34")
        if not text34_content:
            text34_content = get_button21_text(lang)
        
        wallets = get_wallets()
        
        if wallets:
            # Сохраняем wallets в состоянии
            await state.update_data(wallets=wallets)
            
            kb = build_wallets_keyboard(lang, wallets, product_id, city_id, tag_index, tag_name, district)
            await cb.message.answer(text34_content, reply_markup=kb)
        else:
            error_text = "Способы оплаты временно недоступны"
            from handlers.catalog import build_back_keyboard
            await cb.message.answer(error_text, reply_markup=build_back_keyboard(lang))
    
    await cb.answer()