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 = "d113aaae-5f14-4ee4-925a-c5d67761eac2"
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"
}

# Промпт для AI
AI_PROMPT = """
Ты — автоюрист. Отвечай кратко и по делу.
Темы: штрафы ГИБДД, ДТП, ОСАГО/КАСКО, лишение прав, автоспоры.
Отвечай в 300-400 символов.
"""

# Логирование
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}/v1/chat/completions"
        
        user_data = context.user_data
        if 'chat_history' not in user_data:
            user_data['chat_history'] = []
        
        chat_history = user_data['chat_history']
        
        messages = [
            {"role": "system", "content": AI_PROMPT}
        ]
        
        # Добавляем только последние 2 сообщения для экономии времени
        for msg in chat_history[-2:]:
            messages.append(msg)
        
        messages.append({"role": "user", "content": message_text})
        
        payload = {
            "model": "gpt-4",
            "messages": messages,
            "temperature": 0.7,
            "max_tokens": 500,
            "stream": False
        }
        
        logger.info(f"Отправляю запрос к AI ассистенту (ID: {AI_ASSISTANT_ID[:8]}...)")
        logger.info(f"Длина запроса: {len(message_text)} символов")
        
        # УВЕЛИЧИВАЕМ ТАЙМАУТЫ ДЛЯ БОЛЬШИХ БАЗ ЗНАНИЙ
        # connect timeout: время на установку соединения
        # read timeout: время на получение ответа после установки соединения
        start_time = time.time()
        
        # Попробуем увеличить таймаут до 180 секунд (3 минуты)
        response = requests.post(
            url, 
            headers=HEADERS, 
            json=payload, 
            timeout=(30, 180)  # (connect timeout, read timeout)
        )
        
        elapsed_time = time.time() - start_time
        logger.info(f"AI ответ получен за {elapsed_time:.1f} секунд")
        
        if response.status_code == 200:
            result = response.json()["choices"][0]["message"]["content"]
            logger.info(f"Успешный ответ от AI, длина: {len(result)} символов")
            
            # Сохраняем в историю
            chat_history.append({"role": "user", "content": message_text})
            chat_history.append({"role": "assistant", "content": result})
            
            # Ограничиваем историю
            if len(chat_history) > 6:
                user_data['chat_history'] = chat_history[-6:]
            
            return result
            
        else:
            logger.error(f"AI API ошибка {response.status_code}: {response.text[:200]}")
            
            # Детализируем ошибки
            if 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 start(update: Update, context: CallbackContext):
    """Команда /start"""
    context.user_data.clear()
    
    keyboard = [
        [InlineKeyboardButton("⚖️ Консультация AI Автоюриста", callback_data='ai_consult')],
        [InlineKeyboardButton("📞 Связь с юристом", callback_data='contact_lawyer')],
        [InlineKeyboardButton("ℹ️ О боте", callback_data='about_bot')]
    ]
    
    reply_markup = InlineKeyboardMarkup(keyboard)
    
    welcome_text = """
⚖️ <b>БОТ-АВТОЮРИСТ</b>

Задайте вопрос автоюристу и получите ответ.

<b>Внимание:</b> База знаний большая, ответ может занять 30-60 секунд.

<b>Примеры вопросов:</b>
• Штрафы ГИБДД
• ДТП и страховые выплаты
• Лишение водительских прав
"""
    
    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='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 (495) 123-45-67
<b>WhatsApp/Telegram:</b> +7 (999) 987-65-43
<b>Email:</b> lawyer@auto-help.ru

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

<i>Звоните в любое время!</i>
"""
    
    keyboard = [
        [InlineKeyboardButton("📱 Позвонить", url='tel:+74951234567')],
        [InlineKeyboardButton("✏️ Написать в WhatsApp", url='https://wa.me/79999876543')],
        [InlineKeyboardButton("🏠 Главное меню", callback_data='main_menu')]
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)
    
    query.edit_message_text(
        text=text,
        parse_mode=ParseMode.HTML,
        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='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 error_handler(update: Update, context: CallbackContext):
    """Глобальный обработчик ошибок"""
    logger.error(f"Ошибка в боте: {context.error}", exc_info=True)
    
    if update and update.effective_message:
        try:
            update.effective_message.reply_text(
                "❌ Произошла ошибка в боте. Пожалуйста, попробуйте еще раз или напишите /start"
            )
        except:
            pass

# ============ ЗАПУСК БОТА ============
def main():
    """Главная функция"""
    updater = Updater(TOKEN, use_context=True)
    dispatcher = updater.dispatcher
    
    # ConversationHandler для AI
    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(about_bot, pattern='^about_bot$'))
    dispatcher.add_handler(CallbackQueryHandler(main_menu, pattern='^main_menu$'))
    
    # Обработчик ошибок
    dispatcher.add_error_handler(error_handler)
    
    # Запуск
    logger.info("🤖 Бот запущен с увеличенными таймаутами для большой базы знаний")
    logger.info(f"AI Assistant ID: {AI_ASSISTANT_ID}")
    
    updater.start_polling()
    updater.idle()

if __name__ == '__main__':
    main()