import random
from driver.chrome_proxy import ChromeProxy
from urllib.parse import urlparse
import undetected_chromedriver as uc
import logging


# В patcher.py библиотеки undetected_chromedriver
    # import secrets 
    # prefix = 'undetected' ----> prefix = secrets.token_hex(8)
# Использование случайного токена в качестве префикса гарантирует, 
# что каждый процесс будет иметь свою уникальную директорию, 
# даже если несколько процессов работают одновременн

class DriverCreator:
    def __init__(self, proxy_list):
        self.proxy_list = proxy_list

    def _switch_proxy(self):
        proxy = random.choice(self.proxy_list)
        parsed_proxy = urlparse(proxy)
        return ChromeProxy(
            parsed_proxy.hostname,
            parsed_proxy.port,
            parsed_proxy.username,
            parsed_proxy.password
        ).create_extension()

    def get_driver(self):
        '''
        Отключает JS
        Каждый запрос получает `сырой` html
        '''
        # extension_path = self._switch_proxy()

        options = uc.ChromeOptions()
        # options.add_argument(f"--load-extension={extension_path}") # временно
        options.add_argument("--headless=new")
        options.add_argument("--disable-gpu")
        options.add_argument("--disable-dev-shm-usage")
        options.add_argument("--no-sandbox")
        options.add_argument("--disable-webgl")
        options.add_argument("--disable-software-rasterizer")
        # options.add_argument("--disable-extensions")
        
        prefs = {"profile.managed_default_content_settings.javascript": 2}
        options.experimental_options["prefs"] = prefs
        
        driver = uc.Chrome(
            options=options,
            version_main=132,
            # user_multi_procs=True
        )

        driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
            "source": "Object.defineProperty(navigator, 'javaEnabled', {get: () => false});"
        })
        driver.execute_cdp_cmd("Emulation.setScriptExecutionDisabled", {"value": True})
        
        return driver