#!/bin/bash
. "$PSScriptRoot/Context.ps1";

if (-not ("OpenQA.Selenium.Firefox.FirefoxDriver" -as [type])) {
    $zipFile = [System.IO.Compression.ZipFile]::OpenRead((Get-Package Selenium.WebDriver).Source);
    $stream = [System.IO.MemoryStream]::new();
    $reader = [System.IO.StreamReader]($zipFile.Entries[2]).Open();
    $reader.BaseStream.CopyTo($stream);
    [byte[]]$bytes = $stream.ToArray();
    $reader.Close();
    $zipFile.Dispose();
    [System.Reflection.Assembly]::Load($bytes);
}

function Start-AutomatedDownload() {
    param(
        [Context] $context,
        [string] $url,
        [string] $buttonSelector
    )

    $tempDir = $context.GetTempDirectory();
    $options = [OpenQA.Selenium.Firefox.FirefoxOptions]::new();
    $options.SetPreference("browser.download.folderList", 2);
    $options.SetPreference("browser.download.dir", $tempDir);
    # $options.AddArgument("--headless");

    $downloadChecker = {
        param()

        foreach ($file in Get-ChildItem $tempDir) {
            try {
                $stream = [System.IO.File]::Open($file.FullName, [System.IO.FileMode]::Open, [System.IO.FileAccess]::ReadWrite, [System.IO.FileShare]::None);

                if ($stream) {
                    $stream.Close();
                }

                return $false;
            }
            catch  {
                return $true;
            }
        }
    }

    $browser = [OpenQA.Selenium.Firefox.FirefoxDriver]::new($options);
    $browser.Navigate().GoToUrl($url);
    $browser.FindElement([OpenQA.Selenium.By]::CssSelector("$buttonSelector")).Click();

    while ($downloadChecker.Invoke()) {
        Write-Information "Waiting for download to finish...";
        Start-Sleep 1;
    }
}