package org.example;

import java.io.File;
import java.nio.file.Paths;
import java.util.Random;
import java.util.logging.Logger;

import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

/**
 * Test xxx on LOCAL Chrome Browser
 * 
 * This test runs on your local machine (not Selenium Grid) to verify:
 * 1. If CAPTCHA appears on local Chrome
 * 2. If the extension works locally
 * 3. To compare local vs Grid behavior
 * 
 * Prerequisites:
 * - Chrome browser installed locally
 * - ChromeDriver matching your Chrome version
 */
public class TestxxxLocal {

    private static final Logger logger = Logger.getLogger(TestxxxLocal.class.getName());

    public static void main(String[] args) {
        WebDriver driver = null;

        try {
            logger.info("==== xxx Test on LOCAL Chrome Browser ====\n");

            // Get extension path (unpacked extension directory)
            String extensionPath = Paths.get("src/main/resources/modify-headers-extension").toAbsolutePath().toString();
            logger.info("📦 Extension path: " + extensionPath);
            
            // Verify extension files exist
            File manifestFile = new File(extensionPath, "manifest.json");
            if (!manifestFile.exists()) {
                logger.severe("❌ Extension manifest.json not found at: " + manifestFile.getAbsolutePath());
                return;
            }
            logger.info("✅ Extension files verified\n");

            // Configure ChromeOptions for LOCAL Chrome
            ChromeOptions options = new ChromeOptions();
            
            // Load unpacked extension (works for local Chrome)
            options.addArguments("--load-extension=" + extensionPath);
            
            // Essential arguments
            // Set window size to show more content (larger resolution = smaller elements)
            options.addArguments("--window-size=1920,1080");
            options.addArguments("--disable-blink-features=AutomationControlled");
            options.addArguments("--remote-allow-origins=*");
            
            // Chrome 147 specific arguments
            options.addArguments("--enable-features=NetworkService,NetworkServiceInProcess");
            options.addArguments("--disable-features=IsolateOrigins,site-per-process");
            options.addArguments("--disable-site-isolation-trials");
            options.addArguments("--disable-web-security");
            options.addArguments("--allow-running-insecure-content");
            
            // Remove automation flags
            options.setExperimentalOption("excludeSwitches", new String[]{"enable-automation"});
            options.setExperimentalOption("useAutomationExtension", false);

            logger.info("✅ ChromeOptions configured for LOCAL Chrome\n");
            logger.info("🚀 Starting LOCAL Chrome browser...");
            
            // Create local ChromeDriver
            driver = new ChromeDriver(options);
            
            logger.info("✅ LOCAL Chrome started");
            logger.info("Browser Version: " + ((ChromeDriver) driver).getCapabilities().getBrowserVersion());
            logger.info("✅ Extension loaded\n");
            
            logger.info("⚠️ IMPORTANT: Check browser console for extension logs:");
            logger.info("   1. Press F12 to open DevTools");
            logger.info("   2. Go to Console tab");
            logger.info("   3. Look for: 🚀 CAPTCHA Bypass Extension");
            logger.info("   4. Look for: ✅ CAPTCHA header PRESENT\n");

            // Execute test steps
            logger.info("==== Executing xxx Test Steps ====\n");
            executeSteps(driver);

            logger.info("\n✅ Test completed!");
            logger.info("\n⚠️ Browser will stay open for 60 seconds for manual inspection");
            logger.info("   - Check if CAPTCHA appeared");
            logger.info("   - Check browser console for extension logs");
            logger.info("   - Check Network tab for headers");
            
            Thread.sleep(64000); // Keep browser open for inspection

        } catch (Exception e) {
            logger.severe("❌ Error: " + e.getMessage());
            e.printStackTrace();
        } finally {
            if (driver != null) {
                try {
                    logger.info("\n🔄 Closing browser in 5 seconds...");
                    Thread.sleep(9000);
                    driver.quit();
                    logger.info("✅ Browser closed");
                } catch (Exception e) {
                    logger.severe("❌ Error closing browser: " + e.getMessage());
                }
            }
        }
    }

    /**
     * Execute xxx test steps
     */
    private static void executeSteps(WebDriver driver) throws Exception {
        
        // Navigate to xxx
        logger.info("📍 Step 1: Navigating to e2e1.xxx.com...");
        driver.get("https://e2e1.xxx.com/shop/xxxi/choice-package");
        logger.info("Current URL: " + driver.getCurrentUrl());
        logger.info("Page Title: " + driver.getTitle());
        
        // Set browser zoom to 67% to make elements smaller and fit more on screen
        JavascriptExecutor js = (JavascriptExecutor) driver;
        js.executeScript("document.body.style.zoom='0.67'");
        logger.info("✅ Browser zoom set to 67% (elements appear smaller)");
        
        Thread.sleep(11000);
        
        scrollToBottom(driver);
        
        // Click Continue
        logger.info("\n📍 Step 2: Clicking Continue button...");
        try {
            driver.findElement(By.xpath("//button[@title='Continue']")).click();
            logger.info("✅ Continue button clicked");
        } catch (Exception e) {
            logger.warning("⚠️ Continue button not found: " + e.getMessage());
        }
        Thread.sleep(9000);
        
        scrollToBottom(driver);
        logger.info("Current URL: " + driver.getCurrentUrl());
        
        // Click Secure checkout
        logger.info("\n📍 Step 3: Clicking Secure checkout...");
        String[] selectors = {
            "//button[contains(text(),'Secure checkout')]",
            "//button[contains(@class,'checkout')]",
            "//a[contains(text(),'Secure checkout')]"
        };
        
        for (String selector : selectors) {
            try {
                driver.findElement(By.xpath(selector)).click();
                logger.info("✅ Secure checkout clicked");
                break;
            } catch (Exception e) {
                // Try next selector
            }
        }
        
        Thread.sleep(20000); // Increased wait for account page to load
        
        // Fill personal information
        logger.info("\n📍 Step 4: Filling personal information...");
        logger.info("Waiting for firstName field to be available...");
        driver.findElement(By.xpath("//input[@name='firstName']")).sendKeys("xxx");
        driver.findElement(By.xpath("//input[@name='lastName']")).sendKeys("XlowS");
        
        Random random = new Random();
        String emailId = "qay_automation" + random.nextInt(500) + "@yopmail.com";
        logger.info("Using email: " + emailId);
        
        driver.findElement(By.xpath(".//input[contains(@id,'email-address-new-user')]")).sendKeys(emailId);
        Thread.sleep(12000);
        
        driver.findElement(By.xpath(".//input[contains(@id,'create-password')]")).sendKeys("Regression$1");
        Thread.sleep(2000);
        
        driver.findElement(By.xpath(".//input[contains(@id,'confirm-password')]")).sendKeys("Regression$1");
        Thread.sleep(2000);
        
        // Scroll to agreeTerms checkbox and click
        logger.info("Scrolling to Terms & Conditions checkbox...");
        js.executeScript("window.scrollTo(0, document.body.scrollHeight);");
        Thread.sleep(3000);
        
        try {
            driver.findElement(By.xpath(".//input[contains(@name,'agreeTerms')]")).click();
            logger.info("✅ Terms checkbox clicked");
        } catch (Exception e) {
            logger.warning("⚠️ First attempt failed, trying alternative selector...");
            // Try alternative selectors
            String[] checkboxSelectors = {
                "//input[@type='checkbox' and contains(@name,'agree')]",
                "//input[@type='checkbox' and contains(@id,'agree')]",
                "//label[contains(text(),'agree')]//input",
                "//input[@type='checkbox']"
            };
            
            for (String selector : checkboxSelectors) {
                try {
                    driver.findElement(By.xpath(selector)).click();
                    logger.info("✅ Terms checkbox clicked using: " + selector);
                    break;
                } catch (Exception ex) {
                    // Try next selector
                }
            }
        }
        
        // Continue to delivery
        logger.info("\n📍 Step 5: Proceeding to delivery page...");
        driver.findElement(By.xpath("//*//a[@name='checkoutCTA']")).click();
        Thread.sleep(16000);

        // Fill address
        logger.info("\n📍 Step 6: Filling address information...");
        driver.findElement(By.xpath("//input[@aria-label='Address']")).sendKeys("42 1/2 15th St NW");
        driver.findElement(By.xpath(".//input[contains(@id,'city')]")).sendKeys("Barberton");
        driver.findElement(By.xpath("//select[@aria-label='State']")).sendKeys("OH");
        driver.findElement(By.xpath(".//input[contains(@id,'zipcode')]")).sendKeys("44203");
        driver.findElement(By.xpath(".//input[contains(@id,'phNumber')]")).sendKeys("8762234015");
        Thread.sleep(11000);
        
        // Continue to payment - WHERE CAPTCHA APPEARS
        logger.info("\n📍 Step 7: Proceeding to PAYMENT page...");
        logger.info("⚠️ CRITICAL: This is where CAPTCHA usually appears");
        logger.info("⚠️ Watch the browser carefully!");
        
        driver.findElement(By.xpath("//a[@name='checkoutCTA']")).click();
        Thread.sleep(16000);
        
        // Check for CAPTCHA
        logger.info("\n🔍 Checking for CAPTCHA on payment page...");
        Thread.sleep(16000);
        String pageSource = driver.getPageSource().toLowerCase();
        
        if (pageSource.contains("recaptcha") || pageSource.contains("i'm not a robot") || 
            pageSource.contains("captcha")) {
            logger.severe("\n❌❌❌ CAPTCHA DETECTED ON PAYMENT PAGE!");
            logger.severe("Current URL: " + driver.getCurrentUrl());
            logger.severe("\nThis means:");
            logger.severe("1. Extension is NOT working on local Chrome, OR");
            logger.severe("2. xxx server doesn't recognize the header, OR");
            logger.severe("3. Chrome 147 blocks header modification");
        } else {
            logger.info("\n✅✅✅ NO CAPTCHA DETECTED!");
            logger.info("Current URL: " + driver.getCurrentUrl());
            logger.info("\nThis means:");
            logger.info("1. Extension IS working on local Chrome");
            logger.info("2. Headers are being sent correctly");
            logger.info("3. The issue is specific to Selenium Grid");
        }
        
        logger.info("\n📋 Manual Verification Steps:");
        logger.info("1. Look at the browser - do you see CAPTCHA?");
        logger.info("2. Open DevTools (F12) → Console tab");
        logger.info("3. Look for extension logs");
        logger.info("4. Open Network tab → Find payment request");
        logger.info("5. Check if 'disable-xxxi-captcha: true' header is present");
    }

    /**
     * Scroll to bottom of page
     */
    private static void scrollToBottom(WebDriver driver) {
        try {
            JavascriptExecutor js = (JavascriptExecutor) driver;
            js.executeScript("window.scrollTo(0, document.body.scrollHeight)");
            Thread.sleep(4800);
            logger.info("✅ Scrolled to bottom");
        } catch (Exception e) {
            logger.warning("⚠️ Scroll failed: " + e.getMessage());
        }
    }
}

// Made with Bob