# Requirement: pip3 install setuptools selenium undetected-chromedriver
# xpz3

import undetected_chromedriver as uc
import urllib.parse
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from time import sleep

class GoogleTranslatorWeb:
    """
    Google Translate scraper using headless Chrome by directly parsing the translation page.
    """

    def __init__(self, headless: bool = True, driver_wait: int = 3):
        """
        Initialize the translator.
        :param headless: Run Chrome in headless mode.
        """
        self.headless = headless
        self.driver_wait = driver_wait
        options = uc.ChromeOptions()
        if self.headless:
            options.headless = True
            options.add_argument("--headless=new")
        options.add_argument("--disable-blink-features=AutomationControlled")
        options.add_argument("--window-size=1200,800")

        self.driver = uc.Chrome(options=options)
        self.wait = WebDriverWait(self.driver, self.driver_wait)

    def translate(self, text: str, source_lang: str = "auto", target_lang: str = "en") -> str:
        """
        Translate text using Google Translate by directly loading the translation page.
        :param text: The text to translate.
        :param source_lang: Source language (default: auto-detect).
        :param target_lang: Target language.
        :return: Full translated text.
        """
        if not text.strip():
            return ""

        encoded_text = urllib.parse.quote(text)

        translate_url = f"https://translate.google.com/?hl=en&q={encoded_text}&sl={source_lang}&tl={target_lang}&text={encoded_text}&op=translate"

        self.driver.get(translate_url)
        #sleep(3)

        try:
            output_box_xpath = '//span[@class="ryNqvb"]'
            translated_elements = self.wait.until(EC.presence_of_all_elements_located((By.XPATH, output_box_xpath)))

            translated_text = " ".join([elem.text.strip() for elem in translated_elements if elem.text.strip()])
            return translated_text if translated_text else "Translation not found"

        except Exception:
            return "Translation not found"


    def close(self):
        """Properly close the Selenium browser session."""
        if self.driver:
            try:
                self.driver.quit()
                del self.driver
                self.driver = None
            except Exception as e:
                print(f"Warning: Issue while closing the browser: {e}")