from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options
from selenium.common.exceptions import TimeoutException, NoSuchElementException
import requests
import time
import logging
import re
import threading
import os
import tempfile
from flask import Flask, request, jsonify
from datetime import datetime, timedelta

# Настройка логирования
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

# Конфигурация
DEEPSEEK_API_KEY = "sk-zgNRn-0nt3S-55znJhE5NQ"
DEEPSEEK_API_URL = "https://api.artemox.com/v1/chat/completions"
AMOCRM_CREDENTIALS = {
    "username": "ejgulev@mail.ru",
    "password": "230906jg"
}

class AmoCRMBot:
    def __init__(self):
        self.driver = None
        self.is_running = False
        self.monitor_thread = None
        self.user_data_dir = None
        self.setup_driver()

    def setup_driver(self):
        """Настройка Chrome драйвера с уникальной папкой пользовательских данных"""
        chrome_options = Options()

        # Создаем уникальную временную папку для пользовательских данных
        self.user_data_dir = tempfile.mkdtemp(prefix="chrome_profile_")
        chrome_options.add_argument(f"--user-data-dir={self.user_data_dir}")

        chrome_options.add_argument("--start-maximized")
        chrome_options.add_argument("--disable-blink-features=AutomationControlled")
        chrome_options.add_argument("--no-sandbox")
        chrome_options.add_argument("--disable-dev-shm-usage")
        chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
        chrome_options.add_experimental_option('useAutomationExtension', False)

        try:
            self.driver = webdriver.Chrome(options=chrome_options)
            self.driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
            logger.info("🚀 Браузер запущен")
        except Exception as e:
            logger.error(f"❌ Ошибка запуска браузера: {e}")
            # Пробуем альтернативный вариант без user-data-dir
            chrome_options.add_argument("--incognito")
            chrome_options.arguments = [arg for arg in chrome_options.arguments if not arg.startswith('--user-data-dir')]
            self.driver = webdriver.Chrome(options=chrome_options)
            logger.info("🚀 Браузер запущен в режиме инкогнито")

    def cleanup(self):
        """Очистка временных файлов"""
        if self.user_data_dir and os.path.exists(self.user_data_dir):
            try:
                import shutil
                shutil.rmtree(self.user_data_dir)
                logger.info("✅ Временные файлы браузера очищены")
            except Exception as e:
                logger.warning(f"⚠️ Не удалось очистить временные файлы: {e}")

    def login(self):
        """Авторизация в amoCRM без проверки результата"""
        try:
            logger.info("📄 Открываем страницу логина")
            self.driver.get("https://ejgulev.amocrm.ru/")

            # Ждем и заполняем логин
            username_field = WebDriverWait(self.driver, 20).until(
                EC.presence_of_element_located((By.NAME, "username"))
            )
            username_field.send_keys(AMOCRM_CREDENTIALS["username"])
            logger.info("✅ Логин введен")

            # Заполняем пароль
            password_field = self.driver.find_element(By.NAME, "password")
            password_field.send_keys(AMOCRM_CREDENTIALS["password"])
            logger.info("✅ Пароль введен")

            # Нажимаем кнопку входа
            login_button = self.driver.find_element(By.ID, "auth_submit")
            login_button.click()
            logger.info("🔐 Нажата кнопка входа")

            # Просто ждем немного без проверок
            time.sleep(5)
            logger.info("⏳ Ожидание завершения авторизации...")

        except Exception as e:
            logger.error(f"❌ Ошибка при авторизации: {e}")

    def get_deepseek_response(self, message, chat_history=None):
        """Получение ответа от DeepSeek API"""
        try:
            headers = {
                "Content-Type": "application/json",
                "Authorization": f"Bearer {DEEPSEEK_API_KEY}"
            }

            messages = [
                {
                    "role": "system",
                    "content": "Ты полезный ассистент в чате amoCRM. Отвечай кратко и по делу, 1-2 предложения."
                }
            ]

            # Добавляем историю чата если есть
            if chat_history:
                for msg in chat_history[-4:]:  # Берем последние 4 сообщения для контекста
                    role = "user" if msg["is_customer"] else "assistant"
                    messages.append({"role": role, "content": msg["text"]})

            # Добавляем текущее сообщение
            messages.append({"role": "user", "content": message})

            payload = {
                "model": "deepseek-chat",
                "messages": messages,
                "max_tokens": 150,
                "temperature": 0.7
            }

            response = requests.post(DEEPSEEK_API_URL, headers=headers, json=payload, timeout=30)
            response.raise_for_status()

            result = response.json()
            return result["choices"][0]["message"]["content"].strip()

        except Exception as e:
            logger.error(f"❌ Ошибка DeepSeek API: {e}")
            return "Извините, произошла ошибка при обработке запроса."

    def extract_ids_from_url(self, url):
        """Извлечение imbox_id и lead_id из URL"""
        try:
            pattern = r'/imbox/(\d+)/leads/detail/(\d+)'
            match = re.search(pattern, url)
            if match:
                imbox_id = match.group(1)
                lead_id = match.group(2)
                return imbox_id, lead_id
            return None, None
        except Exception as e:
            logger.error(f"❌ Ошибка извлечения ID из URL: {e}")
            return None, None

    def find_available_chats(self):
        """Поиск всех доступных чатов"""
        try:
            logger.info("🔍 Ищем доступные чаты...")
            self.driver.get("https://ejgulev.amocrm.ru/imbox/")
            time.sleep(5)

            # Ищем все ссылки на чаты
            chat_elements = self.driver.find_elements(By.XPATH, "//a[contains(@href, '/imbox/') and contains(@href, '/leads/detail/')]")

            chats = []
            for element in chat_elements:
                try:
                    href = element.get_attribute('href')
                    imbox_id, lead_id = self.extract_ids_from_url(href)
                    if imbox_id and lead_id:
                        chat_name = element.text.strip() or f"Чат {imbox_id}"
                        chats.append({
                            'imbox_id': imbox_id,
                            'lead_id': lead_id,
                            'url': href,
                            'name': chat_name
                        })
                except:
                    continue

            logger.info(f"📊 Найдено {len(chats)} чатов")
            return chats

        except Exception as e:
            logger.error(f"❌ Ошибка поиска чатов: {e}")
            return []

    def get_last_message_info(self):
        """Получение информации о последнем сообщении в чате"""
        try:
            # Селекторы для сообщений
            message_selectors = [
                "//div[contains(@class, 'im-mess')]",
                "//div[contains(@class, 'message')]",
                "//div[contains(@class, 'im-mess__text')]"
            ]

            messages = []
            for selector in message_selectors:
                try:
                    message_elements = self.driver.find_elements(By.XPATH, selector)
                    for element in message_elements:
                        if element.is_displayed() and element.text.strip():
                            # Определяем, от клиента ли сообщение
                            is_customer = any([
                                'other' in element.get_attribute('class').lower(),
                                'customer' in element.get_attribute('class').lower(),
                                'client' in element.get_attribute('class').lower(),
                                not any(['own' in element.get_attribute('class').lower(),
                                         'my' in element.get_attribute('class').lower()])
                            ])

                            messages.append({
                                "text": element.text.strip(),
                                "is_customer": is_customer,
                                "element": element
                            })
                    if messages:
                        break
                except:
                    continue

            if messages:
                last_message = messages[-1]
                return last_message
            return None

        except Exception as e:
            logger.error(f"❌ Ошибка получения сообщений: {e}")
            return None

    def should_respond(self, last_message):
        """Проверка, нужно ли отвечать на сообщение"""
        if not last_message:
            return False

        # Отвечаем только если последнее сообщение от клиента
        if last_message["is_customer"]:
            logger.info("✅ Последнее сообщение от клиента - можно отвечать")
            return True
        else:
            logger.info("⏸️ Последнее сообщение не от клиента - пропускаем")
            return False

    def send_message(self, message):
        """Отправка сообщения в чат"""
        try:
            # Ищем поле ввода
            message_input = WebDriverWait(self.driver, 15).until(
                EC.presence_of_element_located((By.CSS_SELECTOR, "div[contenteditable='true']"))
            )
            logger.info("✅ Поле ввода найдено")

            # Вводим сообщение
            message_input.click()
            message_input.clear()
            message_input.send_keys(message)
            logger.info("✅ Сообщение введено в поле")
            time.sleep(1)

            # Ищем кнопку отправки
            send_button_selectors = [
                "//button[.//span[contains(text(), 'Отправить')]]",
                "//span[contains(text(), 'Отправить')]",
                "//button[@type='submit']",
                "//button[contains(@class, 'send-button')]"
            ]

            send_button = None
            for xpath in send_button_selectors:
                try:
                    send_button = WebDriverWait(self.driver, 10).until(
                        EC.element_to_be_clickable((By.XPATH, xpath))
                    )
                    logger.info(f"✅ Кнопка отправки найдена: {xpath}")
                    break
                except:
                    continue

            if send_button:
                try:
                    send_button.click()
                    logger.info("✅ Сообщение отправлено")
                    time.sleep(3)
                    return True
                except Exception as e:
                    try:
                        self.driver.execute_script("arguments[0].click();", send_button)
                        logger.info("✅ Сообщение отправлено через JavaScript")
                        time.sleep(3)
                        return True
                    except Exception as e2:
                        logger.error(f"❌ Не удалось отправить сообщение: {e2}")
                        return False
            else:
                logger.error("❌ Кнопка отправки не найдена")
                return False

        except Exception as e:
            logger.error(f"❌ Ошибка отправки сообщения: {e}")
            return False

    def process_chat_by_url(self, chat_url):
        """Обработка конкретного чата по URL"""
        try:
            logger.info(f"💬 Обрабатываем чат: {chat_url}")
            self.driver.get(chat_url)
            time.sleep(5)

            # Извлекаем ID из URL
            imbox_id, lead_id = self.extract_ids_from_url(chat_url)
            logger.info(f"📋 Чат imbox_id: {imbox_id}, lead_id: {lead_id}")

            # Получаем последнее сообщение
            last_message = self.get_last_message_info()

            if not self.should_respond(last_message):
                return False

            # Получаем историю чата для контекста
            chat_history = self.get_chat_history()

            # Получаем ответ от DeepSeek
            logger.info("🤖 Генерируем ответ через DeepSeek...")
            response_text = self.get_deepseek_response(last_message["text"], chat_history)
            logger.info(f"📤 Ответ готов: {response_text}")

            # Отправляем ответ
            if self.send_message(response_text):
                logger.info("✅ Ответ успешно отправлен")
                return True
            else:
                logger.error("❌ Не удалось отправить ответ")
                return False

        except Exception as e:
            logger.error(f"❌ Ошибка обработки чата: {e}")
            return False

    def get_chat_history(self):
        """Получение истории чата"""
        try:
            messages = []
            message_elements = self.driver.find_elements(By.XPATH, "//div[contains(@class, 'im-mess')]")

            for element in message_elements[-10:]:  # Последние 10 сообщений
                if element.is_displayed() and element.text.strip():
                    is_customer = any([
                        'other' in element.get_attribute('class').lower(),
                        'customer' in element.get_attribute('class').lower(),
                        not any(['own' in element.get_attribute('class').lower()])
                    ])

                    messages.append({
                        "text": element.text.strip(),
                        "is_customer": is_customer
                    })

            return messages

        except Exception as e:
            logger.error(f"❌ Ошибка получения истории чата: {e}")
            return []

    def monitor_chats(self, check_interval=60):
        """Фоновый мониторинг чатов"""
        logger.info("🔍 Запускаем фоновый мониторинг чатов...")

        processed_chats = set()

        while self.is_running:
            try:
                # Находим все доступные чаты
                chats = self.find_available_chats()

                for chat in chats:
                    chat_key = f"{chat['imbox_id']}_{chat['lead_id']}"

                    if chat_key not in processed_chats:
                        logger.info(f"🎯 Новый чат: {chat['name']}")

                        # Обрабатываем чат
                        if self.process_chat_by_url(chat['url']):
                            processed_chats.add(chat_key)

                logger.info(f"⏳ Следующая проверка через {check_interval} сек...")
                time.sleep(check_interval)

            except Exception as e:
                logger.error(f"❌ Ошибка мониторинга: {e}")
                time.sleep(check_interval)

    def start_monitoring(self, check_interval=60):
        """Запуск фонового мониторинга"""
        if not self.is_running:
            self.is_running = True
            self.monitor_thread = threading.Thread(target=self.monitor_chats, args=(check_interval,))
            self.monitor_thread.daemon = True
            self.monitor_thread.start()
            logger.info("✅ Фоновый мониторинг запущен")

    def stop_monitoring(self):
        """Остановка фонового мониторинга"""
        self.is_running = False
        logger.info("⏹️ Фоновый мониторинг остановлен")

    def close(self):
        """Закрытие браузера"""
        self.stop_monitoring()
        if self.driver:
            self.driver.quit()
            logger.info("🔚 Браузер закрыт")
        self.cleanup()

# Создаем Flask приложение и бота
app = Flask(__name__)
bot = AmoCRMBot()

@app.route('/amocrm/webhook', methods=['POST'])
def handle_webhook():
    """Обработчик вебхуков от amoCRM"""
    try:
        data = request.json
        logger.info(f"🔔 Получен вебхук: {data}")

        # Извлекаем данные из вебхука
        chat_url = data.get('chat_url')
        imbox_id = data.get('imbox_id')
        lead_id = data.get('lead_id')
        message = data.get('message')

        # Если передан URL чата
        if chat_url:
            success = bot.process_chat_by_url(chat_url)

        # Если передан imbox_id и lead_id, формируем URL
        elif imbox_id and lead_id:
            chat_url = f"https://ejgulev.amocrm.ru/imbox/{imbox_id}/leads/detail/{lead_id}"
            success = bot.process_chat_by_url(chat_url)

        else:
            logger.error("❌ Недостаточно данных в вебхуке")
            return jsonify({"status": "error", "message": "Недостаточно данных"}), 400

        if success:
            return jsonify({"status": "success", "message": "Чат обработан"})
        else:
            return jsonify({"status": "error", "message": "Ошибка обработки чата"}), 500

    except Exception as e:
        logger.error(f"❌ Ошибка обработки вебхука: {e}")
        return jsonify({"status": "error", "message": str(e)}), 500

@app.route('/health', methods=['GET'])
def health_check():
    """Проверка здоровья сервиса"""
    return jsonify({"status": "healthy", "timestamp": datetime.now().isoformat()})

@app.route('/chats', methods=['GET'])
def get_chats():
    """Получение списка доступных чатов"""
    try:
        chats = bot.find_available_chats()
        return jsonify({"status": "success", "chats": chats})
    except Exception as e:
        return jsonify({"status": "error", "message": str(e)}), 500

def main():
    """Основная функция запуска"""
    try:
        # Авторизуемся
        bot.login()

        # Запускаем фоновый мониторинг
        bot.start_monitoring(check_interval=60)

        logger.info("✅ Бот запущен и готов к работе!")
        logger.info("🌐 Flask сервер запущен на http://localhost:5000")
        logger.info("📞 Вебхук доступен по адресу: http://localhost:5000/amocrm/webhook")

        # Запускаем Flask сервер
        app.run(host='0.0.0.0', port=5000, debug=False)

    except Exception as e:
        logger.error(f"❌ Критическая ошибка: {e}")
    finally:
        bot.close()

if __name__ == "__main__":
    main()