import logging
import requests
import time
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup, ParseMode
from telegram.ext import Updater, CommandHandler, CallbackQueryHandler, ConversationHandler, MessageHandler, Filters, CallbackContext

# ============ НАСТРОЙКИ AI АССИСТЕНТА ============
AI_ASSISTANT_ID = "749791cd-cfce-4b68-a5f5-1695fa387b54"
API_TOKEN = "eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCIsImtpZCI6IjFrYnhacFJNQGJSI0tSbE1xS1lqIn0.eyJ1c2VyIjoiYTIwMjAiLCJ0eXBlIjoiYXBpX2tleSIsImFwaV9rZXlfaWQiOiJhYWJjMjA3Zi0xZmZjLTRhOTgtOTYwNC1kY2RjMjZlNTljMTkiLCJpYXQiOjE3NjkxMjUzNzZ9.CtrcAqUXOq6z2lfKvX2pfa_rpj8oHT_h8gPG_l1JNxD1ELz3dCL96LQY3C8BQ23dGW6sIvNOXHf1jQqqWtii8h2xG-oZL_pkOlW0LNKtf9iTB-PJupMgfE9YX_kQdU61R-F55KLhyvXdyhCRijD552KWZPZVLWKG4wKirGRKC7Rx04sUaDavDr09uNejSq0KdF6uwqEkAOBEPFJyVdsOw3axirrtq0aWkmzgntYh-E0RzVqNP9-ueueiXEq_N_qUpkH68FDZvfNvZKwEVJ5J_GvB8p6wSWKQVyiDBKbF4m2YBKkEpQHXWv8W8r8xxS7vsmJOtRnHy56jYQsaGwhVk6iO3_CcCyez-TnseG2DTKMO0W-92xAQWWU1iW702a2wkyJ1dQ4KrkW4Qsu2m0aia-lllS8JDz23yw5zmtM58a-uY7AdwUGSkWXccu8xT6xV6tDqNahAdTRFFK4Fno49uz1Oo4gc7qUwJyQmvsqwqOPWTQ0NqoPp8PaJbdMTXq_o"
BASE_URL = "https://agent.timeweb.cloud"

HEADERS = {
    "Authorization": f"Bearer {API_TOKEN}",
    "Content-Type": "application/json",
    "x-proxy-source": "telegram-bot"
}

# Логирование
logging.basicConfig(
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    level=logging.INFO,
    handlers=[
        logging.FileHandler('bot.log'),
        logging.StreamHandler()
    ]
)
logger = logging.getLogger(__name__)

# Токен бота
TOKEN = "8525528845:AAGp8Hw5Dhn4QRSl3KLbqhfcVmSrAXLtK-k"

# Состояние (для обратной совместимости)
AI_CONSULTATION = 1

# ============ ФУНКЦИЯ AI ДЛЯ АГЕНТА С БАЗОЙ ЗНАНИЙ ============
def call_ai_assistant(message_text, context):
    """Вызов AI ассистента с базой знаний - правильный формат"""
    try:
        url = f"{BASE_URL}/api/v1/cloud-ai/agents/{AI_ASSISTANT_ID}/call"
        
        payload = {
            "message": message_text
        }
        
        logger.info(f"Отправляю запрос к AI ассистенту с базой знаний")
        logger.info(f"Длина запроса: {len(message_text)} символов")
        
        start_time = time.time()
        
        response = requests.post(
            url, 
            headers=HEADERS, 
            json=payload, 
            timeout=180
        )
        
        elapsed_time = time.time() - start_time
        logger.info(f"AI ответ получен за {elapsed_time:.1f} секунд")
        
        if response.status_code == 200:
            result = response.json()
            if "message" in result:
                ai_response = result["message"]
                logger.info(f"Успешный ответ от AI, длина: {len(ai_response)} символов")
                return ai_response
            else:
                logger.error(f"Неожиданная структура ответа: {result}")
                return "⚠️ Получен ответ с неожиданной структурой. Попробуйте переформулировать вопрос."
            
        else:
            logger.error(f"AI API ошибка {response.status_code}: {response.text[:500]}")
            
            if response.status_code == 400:
                return "❌ Ошибка запроса. Проверьте формат запроса к AI агенту."
            elif response.status_code == 401:
                return "🔐 Ошибка авторизации API. Проверьте токен."
            elif response.status_code == 404:
                return "🔍 AI ассистент не найден. Проверьте ID ассистента."
            elif response.status_code == 504:
                return "⏱️ Сервер AI долго обрабатывает запрос. База знаний очень большая. Попробуйте задать вопрос короче или подождите."
            elif response.status_code == 429:
                return "⚠️ Слишком много запросов. Пожалуйста, подождите минуту перед следующим вопросом."
            elif response.status_code == 502:
                return "🔧 Проблемы с сервером AI. Пожалуйста, попробуйте позже."
            else:
                return f"❌ Ошибка сервера (код {response.status_code}). Попробуйте позже."
            
    except requests.exceptions.Timeout:
        logger.error("Таймаут при запросе к AI (больше 180 секунд)")
        return "⏱️ AI долго обрабатывает запрос с базой знаний. Попробуйте:\n1. Задать вопрос короче\n2. Подождать 1-2 минуты\n3. Если проблема повторяется, сообщите администратору"
        
    except requests.exceptions.ConnectionError:
        logger.error("Ошибка соединения с AI сервером")
        return "🔌 Проблема с соединением к AI серверу. Проверьте интернет."
        
    except Exception as e:
        logger.error(f"Критическая ошибка в AI: {str(e)}", exc_info=True)
        return "⚠️ Технические проблемы с AI. Администратор уведомлен."

# ============ ОБРАБОТЧИК ВСЕХ ТЕКСТОВЫХ СООБЩЕНИЙ ============
def handle_any_message(update: Update, context: CallbackContext):
    """Обработка ЛЮБЫХ текстовых сообщений в любое время"""
    # Игнорируем команды
    if update.message.text.startswith('/'):
        return
    
    user_message = update.message.text
    
    # Проверка длины
    if len(user_message) > 2000:
        update.message.reply_text("❌ Вопрос слишком длинный. Сократите до 2000 символов.")
        return
    
    # Показываем "печатает"
    context.bot.send_chat_action(chat_id=update.effective_chat.id, action="typing")
    
    # Отправляем сообщение о том, что бот думает
    thinking_msg = update.message.reply_text(
        "⏳ <b>AI обрабатывает запрос...</b>\n\n"
        "<i>База знаний большая, это займет 30-60 секунд. Пожалуйста, подождите...</i>",
        parse_mode=ParseMode.HTML
    )
    
    try:
        # Получаем ответ от AI
        ai_response = call_ai_assistant(user_message, context)
        
        # Удаляем сообщение о процессе
        try:
            context.bot.delete_message(
                chat_id=update.effective_chat.id,
                message_id=thinking_msg.message_id
            )
        except:
            pass
        
        # Отправляем ответ
        response_text = f"⚖️ <b>Ответ AI-автоюриста:</b>\n\n{ai_response}\n\n"
        
        keyboard = [
            [InlineKeyboardButton("🔄 Новый вопрос", callback_data='new_question')],
            [InlineKeyboardButton("👨‍💼 Консультация юриста", callback_data='online_lawyer')],
            [InlineKeyboardButton("📞 Связь", callback_data='contact_lawyer')],
            [InlineKeyboardButton("🏠 Главное меню", callback_data='main_menu')]
        ]
        reply_markup = InlineKeyboardMarkup(keyboard)
        
        # Если ответ длинный, разбиваем
        if len(response_text) > 4000:
            chunks = [response_text[i:i+4000] for i in range(0, len(response_text), 4000)]
            for i, chunk in enumerate(chunks):
                if i == 0:
                    update.message.reply_text(
                        chunk,
                        parse_mode=ParseMode.HTML,
                        reply_markup=reply_markup if i == len(chunks)-1 else None
                    )
                else:
                    update.message.reply_text(chunk, parse_mode=ParseMode.HTML)
        else:
            update.message.reply_text(
                response_text,
                parse_mode=ParseMode.HTML,
                reply_markup=reply_markup
            )
        
    except Exception as e:
        logger.error(f"Ошибка в handle_any_message: {str(e)}")
        update.message.reply_text(
            "❌ Произошла ошибка при обработке запроса. Пожалуйста, попробуйте еще раз."
        )

# ============ ОСНОВНЫЕ ФУНКЦИИ ============
def start(update: Update, context: CallbackContext):
    """Команда /start"""
    context.user_data.clear()
    
    keyboard = [
        [InlineKeyboardButton("⚖️ Консультация AI Автоюриста", callback_data='ai_consult')],
        [InlineKeyboardButton("👨‍💼 Консультация онлайн-юриста", callback_data='online_lawyer')],
        [InlineKeyboardButton("📞 Связь с юристом", callback_data='contact_lawyer')],
        [InlineKeyboardButton("ℹ️ О боте", callback_data='about_bot')]
    ]
    
    reply_markup = InlineKeyboardMarkup(keyboard)
    
    welcome_text = """
⚖️ <b>БОТ-АВТОЮРИСТ</b>

Просто напишите ваш вопрос по автомобильному праву!

<b>Примеры вопросов:</b>
• Штрафы ГИБДД
• ДТП и страховые выплаты
• Лишение водительских прав
• ОСАГО и КАСКО

<b>Внимание:</b> База знаний большая, ответ может занять 30-60 секунд.
"""
    
    update.message.reply_text(
        welcome_text,
        parse_mode=ParseMode.HTML,
        reply_markup=reply_markup
    )

def start_ai_consultation(update: Update, context: CallbackContext):
    """Начало консультации через кнопку (для обратной совместимости)"""
    query = update.callback_query
    query.answer()
    
    context.user_data['chat_history'] = []
    
    keyboard = [
        [InlineKeyboardButton("❌ Завершить", callback_data='end_consultation')],
        [InlineKeyboardButton("🏠 Главное меню", callback_data='main_menu')]
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)
    
    query.edit_message_text(
        text="🤖 <b>AI-АВТОЮРИСТ</b>\n\n"
             "Задайте ваш вопрос:\n\n"
             "⚠️ <i>База знаний большая, ответ займет 30-60 секунд. Пожалуйста, подождите...</i>",
        parse_mode=ParseMode.HTML,
        reply_markup=reply_markup
    )
    
    return AI_CONSULTATION

def handle_ai_message(update: Update, context: CallbackContext):
    """Обработка вопросов в режиме консультации (для обратной совместимости)"""
    user_message = update.message.text
    
    if len(user_message) > 2000:
        update.message.reply_text("❌ Вопрос слишком длинный. Сократите до 2000 символов.")
        return AI_CONSULTATION
    
    context.bot.send_chat_action(chat_id=update.effective_chat.id, action="typing")
    
    thinking_msg = update.message.reply_text(
        "⏳ <b>AI обрабатывает запрос...</b>\n\n"
        "<i>База знаний большая, это займет 30-60 секунд. Пожалуйста, подождите...</i>",
        parse_mode=ParseMode.HTML
    )
    
    try:
        ai_response = call_ai_assistant(user_message, context)
        
        try:
            context.bot.delete_message(
                chat_id=update.effective_chat.id,
                message_id=thinking_msg.message_id
            )
        except:
            pass
        
        response_text = f"⚖️ <b>Ответ:</b>\n\n{ai_response}"
        
        keyboard = [
            [InlineKeyboardButton("🔄 Новый вопрос", callback_data='new_question')],
            [InlineKeyboardButton("❌ Завершить", callback_data='end_consultation')],
            [InlineKeyboardButton("🏠 Главное меню", callback_data='main_menu')]
        ]
        reply_markup = InlineKeyboardMarkup(keyboard)
        
        if len(response_text) > 4000:
            chunks = [response_text[i:i+4000] for i in range(0, len(response_text), 4000)]
            for i, chunk in enumerate(chunks):
                if i == 0:
                    update.message.reply_text(
                        chunk,
                        parse_mode=ParseMode.HTML,
                        reply_markup=reply_markup if i == len(chunks)-1 else None
                    )
                else:
                    update.message.reply_text(chunk, parse_mode=ParseMode.HTML)
        else:
            update.message.reply_text(
                response_text,
                parse_mode=ParseMode.HTML,
                reply_markup=reply_markup
            )
        
    except Exception as e:
        logger.error(f"Ошибка в handle_ai_message: {str(e)}")
        update.message.reply_text(
            "❌ Произошла ошибка при обработке запроса. Пожалуйста, попробуйте еще раз."
        )
    
    return AI_CONSULTATION

def new_question(update: Update, context: CallbackContext):
    """Новый вопрос"""
    query = update.callback_query
    query.answer()
    
    query.edit_message_text(
        text="🤖 <b>Задайте следующий вопрос:</b>\n\n"
             "⚠️ <i>База знаний большая, ответ займет 30-60 секунд. Пожалуйста, подождите...</i>",
        parse_mode=ParseMode.HTML
    )
    
    return AI_CONSULTATION

def end_consultation(update: Update, context: CallbackContext):
    """Завершение консультации"""
    query = update.callback_query
    query.answer()
    
    context.user_data.pop('chat_history', None)
    
    keyboard = [
        [InlineKeyboardButton("⚖️ Новая консультация", callback_data='ai_consult')],
        [InlineKeyboardButton("🏠 Главное меню", callback_data='main_menu')]
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)
    
    query.edit_message_text(
        text="✅ <b>Консультация завершена</b>\n\n"
             "Обращайтесь снова! Просто напишите новый вопрос в любое время.",
        parse_mode=ParseMode.HTML,
        reply_markup=reply_markup
    )
    
    return ConversationHandler.END

def main_menu(update: Update, context: CallbackContext):
    """Главное меню"""
    query = update.callback_query
    query.answer()
    
    context.user_data.clear()
    
    keyboard = [
        [InlineKeyboardButton("⚖️ Консультация AI Автоюриста", callback_data='ai_consult')],
        [InlineKeyboardButton("👨‍💼 Консультация онлайн-юриста", callback_data='online_lawyer')],
        [InlineKeyboardButton("📞 Связь с юристом", callback_data='contact_lawyer')],
        [InlineKeyboardButton("ℹ️ О боте", callback_data='about_bot')]
    ]
    
    reply_markup = InlineKeyboardMarkup(keyboard)
    
    welcome_text = """
⚖️ <b>Главное меню</b>

Выберите нужный раздел или просто напишите ваш вопрос!
"""
    
    query.edit_message_text(
        welcome_text,
        parse_mode=ParseMode.HTML,
        reply_markup=reply_markup
    )
    
    return ConversationHandler.END

# ============ КОНТАКТЫ И КОНСУЛЬТАЦИИ ============
def contact_lawyer(update: Update, context: CallbackContext):
    """Связь с юристом"""
    query = update.callback_query
    query.answer()
    
    text = """
📞 <b>СВЯЗЬ С ЮРИСТОМ</b>

Работаем 24/7 без выходных

<b>Телефон:</b> +7 (921) 077-43-97
<b>WhatsApp/Telegram:</b> +7 (921) 077-43-97
<b>Email:</b> lawyer@auto-help.ru

<b>Первая консультация:</b> бесплатно

<i>Звоните в любое время!</i>
"""
    
    query.edit_message_text(
        text=text,
        parse_mode=ParseMode.HTML
    )
    
    keyboard = [
        [InlineKeyboardButton("📱 Позвонить", url='tel:+79210774397')],
        [InlineKeyboardButton("✏️ Написать в WhatsApp", url='https://wa.me/79210774397')],
        [InlineKeyboardButton("✉️ Написать в Telegram", url='https://t.me/+79210774397')],
        [InlineKeyboardButton("🏠 Главное меню", callback_data='main_menu')]
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)
    
    context.bot.send_message(
        chat_id=update.effective_chat.id,
        text="Выберите способ связи:",
        reply_markup=reply_markup
    )

def online_lawyer(update: Update, context: CallbackContext):
    """Консультация онлайн-юриста"""
    query = update.callback_query
    query.answer()
    
    text = """
👨‍💼 <b>КОНСУЛЬТАЦИЯ ОНЛАЙН-ЮРИСТА</b>

Если вам нужна живая консультация юриста, вы можете написать в макс +7 (921) 077-43-97

Так же в Telegram и WhatsApp.

Работаем 24/7 без выходных!

<b>Что мы поможем:</b>
• Разбор вашей ситуации с юристом
• Подготовка документов
• Представление интересов в суде
• Помощь со страховыми выплатами
• Оспаривание штрафов ГИБДД

<i>Пишите или звоните в любое время!</i>
"""
    
    query.edit_message_text(
        text=text,
        parse_mode=ParseMode.HTML
    )
    
    keyboard = [
        [InlineKeyboardButton("📱 Позвонить", url='tel:+79210774397')],
        [InlineKeyboardButton("✏️ Написать в WhatsApp", url='https://wa.me/79210774397')],
        [InlineKeyboardButton("✉️ Написать в Telegram", url='https://t.me/+79210774397')],
        [InlineKeyboardButton("🏠 Главное меню", callback_data='main_menu')]
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)
    
    context.bot.send_message(
        chat_id=update.effective_chat.id,
        text="Выберите способ связи:",
        reply_markup=reply_markup
    )

def about_bot(update: Update, context: CallbackContext):
    """О боте"""
    query = update.callback_query
    query.answer()
    
    text = """
ℹ️ <b>О БОТЕ</b>

🤖 <b>Бот-автоюрист</b> — ваш помощник в автомобильных вопросах.

<b>Что делает бот:</b>
• Отвечает на вопросы по авто-праву
• Помогает со штрафами ГИБДД
• Консультирует по ДТП и страховым выплатам
• Объясняет про лишение прав

<b>Особенности:</b>
• Большая база знаний (ответ может занять 30-60 секунд)
• Искусственный интеллект GPT-4
• Актуальное законодательство РФ
• Отвечает на вопросы в любое время - просто напишите!

<b>Важно:</b>
Бот даёт информационные ответы.
Для сложных случаев рекомендуем консультацию живого юриста.
"""
    
    keyboard = [
        [InlineKeyboardButton("⚖️ Начать консультацию", callback_data='ai_consult')],
        [InlineKeyboardButton("👨‍💼 Консультация онлайн-юриста", callback_data='online_lawyer')],
        [InlineKeyboardButton("📞 Связь с юристом", callback_data='contact_lawyer')],
        [InlineKeyboardButton("🏠 Главное меню", callback_data='main_menu')]
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)
    
    query.edit_message_text(
        text=text,
        parse_mode=ParseMode.HTML,
        reply_markup=reply_markup
    )

def cancel(update: Update, context: CallbackContext):
    """Отмена"""
    update.message.reply_text("Диалог завершён.")
    context.user_data.clear()
    return ConversationHandler.END

# ============ ЗАПУСК БОТА ============
def main():
    """Главная функция"""
    updater = Updater(TOKEN, use_context=True)
    dispatcher = updater.dispatcher
    
    # ConversationHandler для обратной совместимости (старый режим через кнопки)
    conv_handler = ConversationHandler(
        entry_points=[CallbackQueryHandler(start_ai_consultation, pattern='^ai_consult$')],
        states={
            AI_CONSULTATION: [
                MessageHandler(Filters.text & ~Filters.command, handle_ai_message),
                CallbackQueryHandler(new_question, pattern='^new_question$'),
                CallbackQueryHandler(end_consultation, pattern='^end_consultation$'),
                CallbackQueryHandler(main_menu, pattern='^main_menu$')
            ]
        },
        fallbacks=[
            CallbackQueryHandler(end_consultation, pattern='^end_consultation$'),
            CommandHandler('cancel', cancel),
            CommandHandler('start', start)
        ],
        allow_reentry=True
    )
    
    # Обработчики
    dispatcher.add_handler(CommandHandler("start", start))
    dispatcher.add_handler(conv_handler)
    dispatcher.add_handler(CallbackQueryHandler(contact_lawyer, pattern='^contact_lawyer$'))
    dispatcher.add_handler(CallbackQueryHandler(online_lawyer, pattern='^online_lawyer$'))
    dispatcher.add_handler(CallbackQueryHandler(about_bot, pattern='^about_bot$'))
    dispatcher.add_handler(CallbackQueryHandler(main_menu, pattern='^main_menu$'))
    
    # ГЛАВНЫЙ ОБРАБОТЧИК - реагирует на ЛЮБЫЕ текстовые сообщения в любое время
    dispatcher.add_handler(MessageHandler(Filters.text & ~Filters.command, handle_any_message))
    
    # Запуск
    logger.info("🤖 Бот запущен с базой знаний AI ассистента")
    logger.info(f"AI Assistant ID: {AI_ASSISTANT_ID}")
    logger.info("Режим: отвечает на любые текстовые сообщения в любое время")
    
    updater.start_polling()
    updater.idle()

if __name__ == '__main__':
    main()