package com.agile611.testng.webdriver;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.UUID;

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.MatcherAssert.assertThat;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxOptions;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.safari.SafariDriver;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

public class DownloadTest extends BaseTest {
    File folder;

        void moureUltimFitxerDescarregat(String rutaDestiFinal) {
        String rutaDownloadsGeneral = System.getProperty("user.home") + "/Downloads";
        File directori = new File(rutaDownloadsGeneral);
        File ultimFitxer = null;
        
        // 1. Espera dinàmica (màxim 15 intents, 1 intent per segon)
        for (int i = 0; i < 15; i++) {
            File[] fitxers = directori.listFiles();
            
            if (fitxers != null && fitxers.length > 0) {
                ultimFitxer = Arrays.stream(fitxers)
                    .filter(File::isFile) // GARANTEIX QUE ÉS UN FITXER (NO UNA FOLDER)
                    .filter(f -> !f.getName().startsWith(".")) // Ignora fitxers ocults (.DS_Store)
                    .filter(f -> !f.getName().endsWith(".download")) // Ignora temporals de Safari
                    .max(Comparator.comparingLong(f -> {
                        try {
                            // Llegeix la data exacta de CREACIÓ del fitxer al Mac
                            BasicFileAttributes attr = Files.readAttributes(f.toPath(), BasicFileAttributes.class);
                            return attr.creationTime().toMillis();
                        } catch (IOException e) {
                            return 0L; // Si falla, el posa a la cua
                        }
                    }))
                    .orElse(null);
            }
            
            // Si hem trobat un fitxer real, sortim del bucle d'espera
            if (ultimFitxer != null) {
                break;
            }
            
            // Si no el troba o Safari encara el descarrega, espera 1 segon i torna-ho a intentar
            try { Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); }
        }

        // 2. Gestionar el fitxer trobat
        if (ultimFitxer == null) {
            System.err.println("Error: No s'ha detectat cap fitxer nou creat a la carpeta Downloads.");
            return;
        }

        // 3. Moure el fitxer a la teva destinació final
        try {
            Path origen = ultimFitxer.toPath();
            Path desti = Paths.get(rutaDestiFinal);
            
            if (Files.isDirectory(desti)) {
                desti = desti.resolve(ultimFitxer.getName());
            }

            Files.move(origen, desti, StandardCopyOption.REPLACE_EXISTING);
            System.out.println("L'últim fitxer CREAT s'ha mogut correctament a: " + desti.toString());
        } catch (IOException e) {
            System.err.println("Error en moure el fitxer: " + e.getMessage());
        }
    }
    @BeforeMethod
    public void setUp() {

        folder = new File("src" + File.separator + "test" 
                + File.separator + "resources" 
                + File.separator + UUID.randomUUID().toString());
        
        String downloadFilepath = folder.getAbsolutePath();

        if (System.getProperty("browser").equalsIgnoreCase("safari")) {
            driver = new SafariDriver();
        } 
        else if(System.getProperty("browser").equalsIgnoreCase("firefox")){
        //Firefox
        // 1. Configurar el perfil de Firefox
            FirefoxProfile profile = new FirefoxProfile();
            profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/octet-stream;application/csv;text/csv;application/vnd.ms-excel;");
            profile.setPreference("browser.helperApps.alwaysAsk.force", false);
            profile.setPreference("browser.download.manager.showWhenStarting", false);
            profile.setPreference("browser.download.folderList", 2);
            profile.setPreference("browser.download.dir", downloadFilepath);

            // 2. Usar FirefoxOptions en lugar de DesiredCapabilities
            FirefoxOptions options = new FirefoxOptions();
            options.setProfile(profile);

            // Opcional: Si necesitas ejecutarlo en modo incógnito o sin interfaz gráfica (headless)
            //options.addArguments("-headless");

            // 3. Inicializar el driver
            // NOTA: Ya no necesitas System.setProperty para el geckodriver.
            driver = new FirefoxDriver(options);
        } else {
            //Chrome
            HashMap<String, Object> chromePrefs = new HashMap<String, Object>();
            chromePrefs.put("profile.default_content_settings.popups", 0);
            chromePrefs.put("download.default_directory", downloadFilepath);
            ChromeOptions options = new ChromeOptions();
            options.setExperimentalOption("prefs", chromePrefs);
            options.setAcceptInsecureCerts(true);
            //options.addArguments("--headless");
            driver = new ChromeDriver(options);
        }
    }

    @AfterMethod
    public void tearDown() {
        driver.quit();
    }

    @Test
    public void download() throws Exception {
        folder.mkdir();
        driver.get("http://the-internet.herokuapp.com/download");
        Thread.sleep(2000);
        Actions actions = new Actions(driver);
        WebElement link = driver.findElement(By.xpath("/html[1]/body[1]/div[2]/div[1]/div[1]/a[1]"));
        actions.dragAndDrop(link, link).build().perform();
        // Wait 2 seconds to download file
        Thread.sleep(2000);

        // A Safari no podem tocar les Options i hem de fer aquest "hack" per moure el fitxer descarregat a la carpeta que volem
        if (System.getProperty("browser").equalsIgnoreCase("safari")) {
            moureUltimFitxerDescarregat(folder.getAbsolutePath());
        } 

        File[] listOfFiles = folder.listFiles();
        // Make sure the directory is not empty
        assertThat(listOfFiles.length, is(not(0)));
        for (File file : listOfFiles) {
            // Make sure the downloaded file(s) is(are) not empty
            assertThat(file.length(), is(not((long) 0)));
        }

        String[] entries = folder.list();
        for (String s : entries) {
            File currentFile = new File(folder.getPath(), s);
            currentFile.delete();
        }
        folder.delete();
    }
}