package com.agile611.testng.webdriver;

import java.util.List;

import org.openqa.selenium.Proxy;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxOptions;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

import net.lightbody.bmp.BrowserMobProxy;
import net.lightbody.bmp.BrowserMobProxyServer;
import net.lightbody.bmp.client.ClientUtil;
import net.lightbody.bmp.core.har.Har;
import net.lightbody.bmp.core.har.HarEntry;

public class BrokenImages {
    WebDriver driver;
    BrowserMobProxy proxy;

    @BeforeMethod
    public void setUp() throws Exception {
        // 1. Iniciar el servidor Proxy localmente
        proxy = new BrowserMobProxyServer();
        proxy.start(0); // El puerto 0 le dice que busque cualquier puerto libre

        // 2. Crear el objeto Proxy de Selenium a partir del BrowserMob
        Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy);

        // 3. Inyectar el proxy en las opciones de Firefox
        FirefoxOptions options = new FirefoxOptions();
        options.setProxy(seleniumProxy);                        
        driver = new FirefoxDriver(options);
    }

    @AfterMethod
    public void tearDown() {
        // Es crucial apagar ambos servicios para no dejar procesos huérfanos
        if (driver != null) {
            driver.quit();
        }
        if (proxy != null) {
            proxy.stop();
        }
    }

    @Test
    public void allImagesLoaded() {
        // 4. Iniciar la captura de un nuevo archivo HAR
        proxy.newHar("captura_imagenes");

        // 5. Navegar a la página (el proxy registrará todo el tráfico)
        driver.navigate().to("http://the-internet.herokuapp.com/broken_images");

        // 6. Extraer el HAR generado
        Har har = proxy.getHar();

        // 7. Analizar las entradas de red
        boolean hasBrokenImages = false;
        List<HarEntry> entries = har.getLog().getEntries();
        
        for (HarEntry entry : entries) {
            String url = entry.getRequest().getUrl();
            int statusCode = entry.getResponse().getStatus();
            
            // Filtramos para evaluar solo los recursos que son imágenes
            if (url.endsWith(".jpg") || url.endsWith(".png") || url.endsWith(".gif")) {
                if (statusCode == 404) {
                    System.err.println("❌ Imagen rota detectada (404): " + url);
                    hasBrokenImages = true;
                } else {
                    System.out.println("✅ Imagen cargada correctamente (" + statusCode + "): " + url);
                }
            }
        }
        // 8. El test fallará si al menos una imagen devolvió 404
        Assert.assertFalse(hasBrokenImages, "Se encontraron imágenes con error 404 en la página.");
    }
}