
package de.roko.genalogy.downloader.tools;

import org.openqa.selenium.*;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.time.Duration;
import java.util.List;

public class ArchionBatchDownloader {

    private final WebDriver driver;
    private final WebDriverWait wait;
    private final BookTileDownloaderLite downloader;

    public ArchionBatchDownloader(WebDriver driver) {
        this.driver = driver;
        this.wait = new WebDriverWait(driver, Duration.ofSeconds(10));
        this.downloader = new BookTileDownloaderLite(driver);
    }

    public void downloadAndStitchPages(String startUrl, String zielVerzeichnis) throws InterruptedException {
        int seitenanzahl = ermittleSeitenAnzahl(startUrl);
        downloadAndStitchPages(startUrl, zielVerzeichnis, seitenanzahl);
    }

    public void downloadAndStitchPages(String startUrl, String zielVerzeichnis, int seitenAnzahl) {
        try {
            driver.get(startUrl);
            Thread.sleep(2000); // initiale Ladezeit

            for (int seite = 1; seite <= seitenAnzahl; seite++) {
                File tileFolder = new File(zielVerzeichnis, String.format("seite-%03d-tiles", seite));
                File outputFile = new File(zielVerzeichnis, String.format("seite-%03d.png", seite));

                if (outputFile.exists()) {
                    System.out.printf("⏭️ Seite %d bereits vorhanden (PNG) – wird übersprungen%n", seite);
                } else {
                    System.out.printf("📄 Verarbeite Seite %d...%n", seite);

                    // Download
                    downloader.downloadVisibleTiles(null, zielVerzeichnis, seite);

                    // Stitch
                    TileStitcherFixedGrid.stitch(tileFolder, outputFile);

                    // Tile-Ordner löschen
                    if (tileFolder.exists()) {
                        deleteDirectoryRecursive(tileFolder.toPath());
                        System.out.printf("🗑️ Tile-Ordner gelöscht: %s%n", tileFolder.getName());
                    }
                }

                // letzte Seite erreicht?
                if (seite == seitenAnzahl) {
                    System.out.println("✅ Alle gewünschten Seiten verarbeitet.");
                    break;
                }

                // Weiterblättern
                List<WebElement> nextBtns = driver.findElements(By.cssSelector("a.next-page"));
                if (nextBtns.isEmpty()) {
                    System.out.println("🛑 Kein 'Nächste Seite'-Button gefunden – Abbruch.");
                    break;
                }

                WebElement dropdown = driver.findElement(By.cssSelector("select.page-select"));
                String currentValue = dropdown.getAttribute("value");

                nextBtns.get(0).click();

                new WebDriverWait(driver, Duration.ofSeconds(10)).until(d ->
                        !dropdown.getAttribute("value").equals(currentValue)
                );
                Thread.sleep(500);
            }

            System.out.println("✅ Batch-Abschluss: Alle Seiten wurden verarbeitet.");

        } catch (Exception e) {
            System.err.println("❌ Fehler im Batch-Prozess: " + e.getMessage());
            e.printStackTrace();
        }
    }

    private void deleteDirectoryRecursive(Path path) {
        try {
            Files.walk(path)
                    .sorted((a, b) -> b.compareTo(a)) // erst Dateien, dann Verzeichnisse
                    .forEach(p -> {
                        try {
                            Files.deleteIfExists(p);
                        } catch (Exception e) {
                            System.err.printf("⚠️ Fehler beim Löschen von %s: %s%n", p, e.getMessage());
                        }
                    });
        } catch (Exception e) {
            System.err.printf("⚠️ Fehler beim Löschen des Verzeichnisses %s: %s%n", path, e.getMessage());
        }
    }

    public int ermittleSeitenAnzahl(String startUrl) throws InterruptedException {
        driver.get(startUrl);
        Thread.sleep(2000); // initiale Ladezeit
        return ermittleSeitenAnzahl();

    }

    /**
     * Ermittelt die Seitenanzahl aus dem Dropdown-Menü im Archion-Viewer.
     */
    public int ermittleSeitenAnzahl() {
        try {
            WebElement dropdown = driver.findElement(By.cssSelector("select.page-select"));
            List<WebElement> options = dropdown.findElements(By.tagName("option"));
            int anzahl = options.size();
            System.out.printf("📄 Seitenanzahl erkannt: %d Seiten%n", anzahl);
            return anzahl;
        } catch (Exception e) {
            System.err.println("❌ Fehler beim Ermitteln der Seitenanzahl: " + e.getMessage());
            return 0;
        }
    }
}
