# selenium_setup.py
import os
import threading
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
import sys
import logging

# Import the logger module itself to access its state
import logger
from logger import app_logger  # Also import the logger instance

# Import ConsoleUI for type hinting
try:
    from console_ui import ConsoleUI
except ImportError:
    ConsoleUI = None  # Fallback type


def setup_selenium_driver(
    config, dynamic_output_dir_base, worker_id=0, ui: ConsoleUI | None = None
):
    """
    Configures and returns a Selenium WebDriver instance and its specific download directory.
    Creates a unique subdirectory for each worker.
    """
    thread_name = threading.current_thread().name
    app_logger.debug(
        f"[{thread_name}] Setting up Selenium driver for Worker ID: {worker_id}"
    )

    worker_download_dir_name = f"worker_{worker_id}_dl"
    selenium_temp_base = os.path.join(dynamic_output_dir_base, "selenium_temp")
    abs_worker_download_dir = os.path.abspath(
        os.path.join(selenium_temp_base, worker_download_dir_name)
    )

    app_logger.info(
        f"[{thread_name}] Configuring download directory: {abs_worker_download_dir}"
    )

    try:
        os.makedirs(abs_worker_download_dir, exist_ok=True)
    except OSError as e:
        app_logger.critical(
            f"[{thread_name}] Failed to create worker download directory '{abs_worker_download_dir}': {e}"
        )
        return None, None

    options = webdriver.ChromeOptions()
    headless = config.getboolean("Selenium", "headless", fallback=False)
    user_agent = config.get("Misc", "user_agent")

    if headless:
        options.add_argument("--headless=new")
        app_logger.debug(f"[{thread_name}] Running in headless mode.")
    else:
        app_logger.debug(f"[{thread_name}] Running in headful mode.")

    options.add_argument("--no-sandbox")
    options.add_argument("--disable-dev-shm-usage")
    options.add_argument("--disable-gpu")
    options.add_argument("--window-size=1920,1080")
    options.add_argument(f"user-agent={user_agent}")
    options.add_argument("--log-level=3")
    options.add_argument("--disable-logging")
    options.add_argument("--blink-settings=imagesEnabled=false")  # Disable images
    options.add_experimental_option("excludeSwitches", ["enable-logging"])

    prefs = {
        "download.default_directory": abs_worker_download_dir,
        "download.prompt_for_download": False,
        "download.directory_upgrade": True,
        "plugins.always_open_pdf_externally": True,
        "safebrowsing.enabled": True,
    }
    options.add_experimental_option("prefs", prefs)

    driver = None
    try:
        app_logger.debug(f"[{thread_name}] Setting up ChromeDriver service...")
        # FIX: Access _debug_enabled via the imported logger module
        os.environ["WDM_LOG_LEVEL"] = "0" if not logger._debug_enabled else "INFO"
        service_log_path = os.path.join(
            selenium_temp_base, f"chromedriver_{worker_id}.log"
        )
        # Ensure the directory for the service log exists
        os.makedirs(selenium_temp_base, exist_ok=True)
        service = ChromeService(
            ChromeDriverManager().install(), log_output=service_log_path
        )
        app_logger.debug(
            f"[{thread_name}] ChromeDriver service created (Logs: {service_log_path})."
        )

        app_logger.info(f"[{thread_name}] Initializing WebDriver instance...")
        driver = webdriver.Chrome(service=service, options=options)

        page_load_timeout = config.getint("Selenium", "page_load_timeout", fallback=90)
        driver.set_page_load_timeout(page_load_timeout)
        app_logger.debug(
            f"[{thread_name}] WebDriver initialized. Page load timeout: {page_load_timeout}s."
        )

        app_logger.info(
            f"[{thread_name}] WebDriver setup complete. Downloads configured for: {abs_worker_download_dir}"
        )
        return driver, abs_worker_download_dir
    except ValueError as ve:
        app_logger.error(
            f"[{thread_name}] ValueError during WebDriver setup: {ve}", exc_info=True
        )
        if driver:
            driver.quit()
        return None, None
    except Exception as e:
        app_logger.error(
            f"[{thread_name}] Exception during WebDriver setup: {e}", exc_info=True
        )
        if driver:
            driver.quit()
        return None, None


if __name__ == "__main__":
    print(
        "This module sets up the Selenium driver and is not meant to be run directly."
    )
