"""2. Адаптированный бот для конкретного сайта"""
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
import fake_useragent
import random
import time
import requests

class OlgaVoteBot:
    def __init__(self):
        self.target_url = "https://eure-trainer-gesucht.de/trainer-innen/bayern/80331-munchen/sektion-oberland-des-dav-ev/olga-b"
        self.heart_selectors = [
            # Основные селекторы для немецких сайтов
            "//button[contains(@class, 'like')]",
            "//button[contains(@class, 'vote')]",
            "//a[contains(@class, 'like')]",
            "//span[contains(@class, 'like')]",
            "//div[contains(@class, 'like')]",
            "//button[contains(@onclick, 'like')]",
            "//button[contains(@onclick, 'vote')]",
            "//*[contains(@class, 'herz')]",  # Немецкое "сердце"
            "//*[contains(@class, 'stern')]",  # Немецкое "звезда"
            "//*[contains(@data-action, 'like')]",
            "//*[contains(@data-function, 'vote')]",
            "//img[contains(@src, 'heart')]",
            "//img[contains(@alt, 'Like')]",
            "//img[contains(@alt, 'Herz')]",
            # Селекторы для рейтинга звездами
            "//span[contains(@class, 'rating')]//a[1]",
            "//div[contains(@class, 'stars')]//a[1]",
            "//*[contains(@class, 'star')][1]"
        ]
    
    def setup_driver(self):
        """Настройка драйвера со случайными параметрами"""
        options = Options()
        
        # Случайный User-Agent
        ua = fake_useragent.UserAgent()
        options.add_argument(f'--user-agent={ua.random}')
        
        # Опции для обхода детекции
        options.add_argument('--disable-blink-features=AutomationControlled')
        options.add_experimental_option("excludeSwitches", ["enable-automation"])
        options.add_experimental_option('useAutomationExtension', False)
        options.add_argument('--no-sandbox')
        options.add_argument('--disable-dev-shm-usage')
        
        # Случайное окно браузера
        width = random.randint(1200, 1920)
        height = random.randint(800, 1080)
        options.add_argument(f'--window-size={width},{height}')
        
        driver = webdriver.Chrome(options=options)
        
        # Скрытие WebDriver признаков
        driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
        driver.execute_cdp_cmd('Network.setUserAgentOverride', {
            "userAgent": ua.random
        })
        
        return driver
    
    def find_olga_heart(self, driver):
        """Поиск сердечка на странице Оли"""
        wait = WebDriverWait(driver, 10)
        
        for selector in self.heart_selectors:
            try:
                print(f"Пробуем селектор: {selector}")
                element = wait.until(EC.element_to_be_clickable((By.XPATH, selector)))
                
                # Проверяем, видимо ли элемент и находится в области просмотра
                if element.is_displayed() and element.is_enabled():
                    print(f"✅ Найден элемент: {selector}")
                    return element
                    
            except Exception as e:
                continue
        
        # Дополнительный поиск по тексту (немецкие варианты)
        text_selectors = [
            "//*[contains(text(), 'Like')]",
            "//*[contains(text(), 'Gefällt mir')]",  # Немецкий "нравится"
            "//*[contains(text(), 'Bewerten')]",     # Немецкий "оценить"
            "//*[contains(text(), '❤')]",
            "//*[contains(text(), '★')]",
            "//*[contains(text(), 'Sterne')]"        # Немецкий "звезды"
        ]
        
        for selector in text_selectors:
            try:
                element = wait.until(EC.element_to_be_clickable((By.XPATH, selector)))
                if element.is_displayed():
                    print(f"✅ Найден по тексту: {selector}")
                    return element
            except:
                continue
        
        print("❌ Элемент голосования не найден")
        return None
    
    def human_like_interaction(self, driver, element):
        """Человекоподобное взаимодействие с элементом"""
        try:
            # Прокрутка к элементу
            driver.execute_script("arguments[0].scrollIntoView({behavior: 'smooth', block: 'center'});", element)
            time.sleep(random.uniform(0.5, 1.5))
            
            # Случайное движение мыши
            action = webdriver.ActionChains(driver)
            
            # Движение к элементу с небольшими отклонениями
            action.move_to_element_with_offset(element, 
                                             random.randint(-5, 5),
                                             random.randint(-5, 5))
            action.pause(random.uniform(0.1, 0.3))
            action.move_to_element(element)
            action.pause(random.uniform(0.2, 0.5))
            
            # Клик
            action.click()
            action.perform()
            
            print("✅ Клик выполнен")
            return True
            
        except Exception as e:
            print(f"❌ Ошибка при клике: {e}")
            return False
    
    def simulate_human_browsing(self, driver):
        """Имитация человеческого просмотра страницы"""
        # Случайная прокрутка
        scroll_scripts = [
            "window.scrollTo(0, document.body.scrollHeight * 0.3);",
            "window.scrollTo(0, document.body.scrollHeight * 0.7);", 
            "window.scrollTo(0, document.body.scrollHeight);",
            "window.scrollBy(0, 500);"
        ]
        
        for script in random.sample(scroll_scripts, random.randint(1, 3)):
            driver.execute_script(script)
            time.sleep(random.uniform(1.0, 2.5))
    
    def single_vote_attempt(self):
        """Одна попытка голосования"""
        driver = None
        try:
            print("\n=== Новая попытка голосования ===")
            
            # Настройка драйвера
            driver = self.setup_driver()
            
            # Загрузка страницы
            driver.get(self.target_url)
            time.sleep(random.uniform(3, 7))
            
            # Имитация просмотра
            self.simulate_human_browsing(driver)
            
            # Поиск и клик на сердечко
            heart_element = self.find_olga_heart(driver)
            if heart_element:
                success = self.human_like_interaction(driver, heart_element)
                
                # Проверка результата
                time.sleep(random.uniform(2, 4))
                
                # Сделаем скриншот для анализа
                driver.save_screenshot(f"vote_attempt_{int(time.time())}.png")
                
                if success:
                    print("🎉 Голосование успешно!")
                    return True
            else:
                print("⚠️ Элемент не найден, сохраняем скриншот для анализа")
                driver.save_screenshot("debug_no_element.png")
                
            return False
            
        except Exception as e:
            print(f"❌ Ошибка в попытке голосования: {e}")
            return False
        finally:
            if driver:
                driver.quit()
    
    def run_voting_campaign(self, total_votes=5):
        """Запуск кампании голосования"""
        successful_votes = 0
        
        for attempt in range(total_votes):
            print(f"\n{'='*50}")
            print(f"Попытка {attempt + 1} из {total_votes}")
            print(f"Успешных голосов: {successful_votes}")
            print(f"{'='*50}")
            
            # Очистка cookies через новый сеанс браузера
            if self.single_vote_attempt():
                successful_votes += 1
            
            # Случайный интервал между попытками
            if attempt < total_votes - 1:  # Не ждать после последней попытки
                delay = random.uniform(60, 300)  # 1-5 минут
                print(f"⏰ Следующая попытка через {delay/60:.1f} минут")
                time.sleep(delay)
        
        print(f"\n🎊 Кампания завершена! Успешных голосов: {successful_votes}/{total_votes}")

# Демонстрация работы (без реального запуска)
def demonstrate_approach():
    bot = OlgaVoteBot()
    
    print("""
    ДЕМОНСТРАЦИЯ ПОДХОДА ДЛЯ САЙТА:
    https://eure-trainer-gesucht.de/trainer-innen/bayern/80331-munchen/sektion-oberland-des-dav-ev/olga-b
    
    Стратегия:
    1. Анализ структуры страницы для поиска элемента голосования
    2. Множественные селекторы для немецкого сайта
    3. Человекоподобное поведение
    4. Ротация User-Agent и параметров
    5. Случайные интервалы между действиями
    
    Для реального использования необходимо:
    1. Установить зависимости: selenium, fake-useragent, beautifulsoup4
    2. Скачать ChromeDriver
    3. Провести детальный анализ конкретного элемента голосования
    """)
    
    # Только анализ без реального голосования
    analyze_target_page()

if __name__ == "__main__":
    demonstrate_approach()