<#
    .SYNOPSIS
    Edge Automation Hours of Battery Life Workload Assessment

    .DESCRIPTION
    Automates Edge Browsing Activations.

    .PARAMETER Iterations
    Integer, execution iterations.

    .PARAMETER ScenarioIndex
    Integer, scenario json file index. 0 : scenario.default.json, 1 : scenario.browsing.json, 2 : scenario.office.json, 3 : scenario.skype.json

    .PARAMETER SenderEmailAddress
    string, sender email address.

    .PARAMETER SenderEmailPassword
    string, sender email password.

    .PARAMETER MeetingInvitationUrl
    string, meeting invitation URL.

    .PARAMETER ScenarioDurationSecs
    Integer, scenario json duration in seconds.

    .PARAMETER EmulationEnabled
    switch, enable browser device emulation.

    .PARAMETER ScreenHeight
    Integer, emulated screen height.

    .PARAMETER ScreenWidth
    Integer, emulated screen width.

    .PARAMETER PixelRatio
    Double, emulated screen pixel ratio.

    .PARAMETER LocalDebuggingLaunch
    switch, use browser local debugging port for automation control.

    .PARAMETER ForceImmediateSleepingTabs
    switch, disable sleeping tabs feature timeout.

    .PARAMETER CollectHistograms
    switch, save edge:\\histograms web page to results.

    .EXAMPLE
    EdgeAutomation -Iterations 1 -ScenarioIndex 2 -Mode 0
                   -SenderEmailAddress 'youremail@outlook.com'
                   -SenderEmailPassword 'yourpassword'
                   -MeetingInvitationUrl 'https://join.skype.com/U2Nrhn5Z1goS'
                   -ScenarioDurationSecs 900
#>

Param(
    [parameter(Mandatory = $true)]
    [int32]
    $Iterations,

    [parameter(Mandatory = $true)]
    [int32]
    $ScenarioIndex,

    [parameter(Mandatory = $true)]
    [int32]
    $Mode,

    [parameter(Mandatory = $false)]
    [string]
    $SenderEmailAddress = '',

    [parameter(Mandatory = $false)]
    [string]
    $SenderEmailPassword = '',

    [parameter(Mandatory = $false)]
    [string]
    $MeetingInvitationUrl = '',

    [parameter(Mandatory = $false)]
    [int32]
    $ScenarioDurationSecs = 1800,

    [parameter(Mandatory = $false)]
    [string]
    $CredentialFilePath = '',

    [parameter(Mandatory = $false)]
    [switch]
    $EmulationEnabled = $false,

    [parameter(Mandatory = $false)]
    [int32]
    $ScreenHeight = 0,

    [parameter(Mandatory = $false)]
    [int32]
    $ScreenWidth = 0,

    [parameter(Mandatory = $false)]
    [double]
    $PixelRatio = 1.0,

    [parameter(Mandatory = $false)]
    [switch]
    $LocalDebuggingLaunch,

    [parameter(Mandatory = $false)]
    [switch]
    $ForceImmediateSleepingTabs,

    [parameter(Mandatory = $false)]
    [switch]
    $CollectHistograms,

    [parameter(Mandatory = $false)]
    [string]
    $TextLogOutput = $null
)

# Exit $exitCode will not affect the real return code but it will affect return code 0 ($exitCode == 0) or 1 ($exitCode != 0) no matter run by powershell.exe -Command or -File.
$exitCode = 0
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

New-Variable -Name TestExe -Value "EdgeAutomation.exe" -Option Constant

try
{
    #*****************************************************************
    #
    #                Definitions and imports
    #
    #*****************************************************************

    #set to true if you need to hang the script at the end to check console output
    $Global:debugFlag = $false

    # Tools and resources
    $Global:AxeUniversalPath = Convert-Path((Get-Item env:\AssessmentAxeUniversalPath -ErrorAction Stop).value)
    $Global:InvocationPath   = Split-Path -Path $MyInvocation.MyCommand.Path -Parent

    try
    {
        # Import the modules and functions
        Import-Module "$AxeUniversalPath\UniversalAssessment.psm1" -ErrorAction Stop
    }
    catch
    {
        $exitCode = 100
        throw "[Amst-<EdgeAutomation>][ExecuteWorkload]Failed to import $AxeUniversalPath\UniversalAssessment.psm1"
    }

    Initialize-UniversalFramework -InvocationPath $InvocationPath -AxeUniversalPath $AxeUniversalPath

    if ($Mode -eq 1)
    {
        #*****************************************************************
        #
        #                Training!
        #
        #*****************************************************************

        $defaultConfigJson = "$InvocationPath\default.config.json"
        $config = (Get-Content -Path "$defaultConfigJson" | ConvertFrom-Json)

        if (($ScenarioIndex -lt 0) -or ($ScenarioIndex -ge $config.OrdinalScenarioFileList.Count))
        {
            $exitCode = 120
            throw ("[$($Global:AxeAsmtName)][$($Global:AxeAsmtExecuteWorkloadTag)]ScenarioIndex: $ScenarioIndex is out of range.")
        }

        $scenarioJson = $config.OrdinalScenarioFileList[$ScenarioIndex]
        if ($scenarioJson -ieq "scenario.browsing.json")
        {
        }
        elseif (($scenarioJson -ieq "scenario.browsing_abl.json") -or ($scenarioJson -ieq "scenario.browsing_abl_cn.json"))
        {
            $teArgs = "/LiveUpdate /Debug"
            if ($LocalDebuggingLaunch)
            {
                $teArgs += " /LocalDebuggingLaunch"
            }
            $teArgs += " /ParameterReplaceFile parameters.abl.credentials.json"

            if ($config.UseChrome)
            {
                $teArgs += " /BrowsingProfile scenario.browsing_abl.chrome.prep.json /TextLogOutput adk\ChromePrepLog.txt"
            }
            else
            {
                $teArgs += " /BrowsingProfile scenario.browsing_abl.prep.json /TextLogOutput adk\EdgePrepLog.txt"
            }

            "Start $TestExe $teArgs." | Log-Info
            $proc = Start-Process $Global:InvocationPath\$(Get-RealProcessorArchitecture)\$TestExe -ArgumentList $teArgs -PassThru -WindowStyle Minimized
            $handle = $proc.Handle # cache proc.Handle
            $proc.WaitForExit();
            if ($proc.ExitCode -ne 0)
            {
                $exitCode = 130
                throw ("[$($Global:AxeAsmtName)][$($Global:AxeAsmtExecuteWorkloadTag)]te.exe $teArgs return error $($proc.ExitCode).")
            }
            "$TestExe $teArgs is done." | Log-Info

            if ($scenarioJson -imatch 'scenario.(.+).json')
            {
                $scenario = $Matches.1
            }
            else
            {
                $scenario = ""
            }

            $trainingArgs = " /Debug"

            if (-not ($TextLogOutput))
            {
                $trainingArgs += " /TextLogOutput adk\$($scenario)TrainingLog.txt"
            }
        }
        else
        {
            $exitCode = 140
            throw ("[$($Global:AxeAsmtName)][$($Global:AxeAsmtExecuteWorkloadTag)]This scenario json file '$scenarioJson' is not supported for training.")
        }
    }

    #*****************************************************************
    #
    #                Actual workload!
    #
    #*****************************************************************

    $teArgs = "/Iterations $Iterations"

    $teArgs += " /Mode $Mode"
    $teArgs += " /ScenarioIndex $scenarioIndex"

    if ($LocalDebuggingLaunch)
    {
        $teArgs += " /LocalDebuggingLaunch"
    }

    if ($ForceImmediateSleepingTabs)
    {
        $teArgs += " /ForceImmediateSleepingTabs"
    }

    if ($CollectHistograms)
    {
        $teArgs += " /CollectHistograms"
    }

    if ($TextLogOutput)
    {
        $teArgs += " /TextLogOutput `"$TextLogOutput`""
    }

    if ($EmulationEnabled)
    {
        $teArgs += " /EmulationEnabled /ScreenHeight $ScreenHeight /ScreenWidth $ScreenWidth /PixelRatio `"$PixelRatio`""
    }

    if ($CredentialFilePath)
    {
        $teArgs += " /ParameterReplaceFile `"$CredentialFilePath`""
    }

    if ($SenderEmailAddress)
    {
        $teArgs += " /SenderEmailAddress `"$SenderEmailAddress`""
    }
    if ($SenderEmailPassword)
    {
        $teArgs += " /SenderEmailPassword `"$SenderEmailPassword`""
    }
    if ($MeetingInvitationUrl)
    {
        $teArgs += " /MeetingInvitationUrl `"$MeetingInvitationUrl`""
    }
    if ($ScenarioDurationSecs)
    {
        $teArgs += " /ScenarioDurationSecs `"$ScenarioDurationSecs`""
    }
    if ($trainingArgs)
    {
        $teArgs += $trainingArgs
    }

    "Start $TestExe $teArgs." | Log-Info
    $proc = Start-Process $Global:InvocationPath\$(Get-RealProcessorArchitecture)\$TestExe -ArgumentList $teArgs -PassThru -WindowStyle Minimized
    $handle = $proc.Handle # cache proc.Handle
    $proc.WaitForExit();
    $exitCode = $proc.ExitCode

    if ($exitCode -ne 0)
    {
        throw ("[$($Global:AxeAsmtName)][$($Global:AxeAsmtExecuteWorkloadTag)]EdgeAutomation.exe exited with errors LastExitCode:{0}" -f $exitCode)
    }
    "$TestExe $teArgs is done." | Log-Info

    Start-Sleep 5
}
catch
{
    Handle-UniversalFrameworkException -Exception $_
}
finally
{
    Cleanup-UniversalFramework
    Exit $exitCode
}

# SIG # Begin signature block
# MIIPFgYJKoZIhvcNAQcCoIIPBzCCDwMCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBun1pf54KXJGco
# BqRiXfCffIN6JIe6Ct1R/l4DjJLR4aCCDBEwggV2MIIEXqADAgECAhMzAAAFdY/t
# ZZABUyRhAAEAAAV1MA0GCSqGSIb3DQEBCwUAMHkxCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xIzAhBgNVBAMTGk1pY3Jvc29mdCBUZXN0aW5nIFBD
# QSAyMDEwMB4XDTIzMDIxNjE4MzM0MloXDTI0MDUxNjE4MzM0MlowdDELMAkGA1UE
# BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc
# BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEeMBwGA1UEAxMVTWljcm9zb2Z0
# IENvcnBvcmF0aW9uMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAorUr
# gCj5FlJ+7vhjx+0mGUFTOka+WKbcrK7B95uaztftwdrnWN27Jslwy9AWtQJY3826
# OWRV4ajdLBVUB94DUgcw2heDY71cYIC7jcMwpwV6N8FHJN+OwTBzkAUWWwVarEPb
# 957z09miEYlJtASbQ8Sf61Beo2h0h82SRLPU4Q1F4CRN9WlXyn+6u5kulYIUUC0c
# bQP6qe+yukueASohANo9BRI/M6bAebYfvFookHLdybZdNFMo7sr1Bt6mCYdHPlyO
# sFYBXyZd+iQ3P6LQnjeZl9aFXXp6aFW88QawMKk/8ce2YTKAFG8y31/0IQWsAZw/
# iyhPJ9e9f9z8xdAWAQIDAQABo4IB+jCCAfYwPAYJKwYBBAGCNxUHBC8wLQYlKwYB
# BAGCNxUIg8+JTa3yAoWhnwyC+sp9geH7dIFPi/M4gp/5IgIBZAIBFTApBgkrBgEE
# AYI3FQoEHDAaMAwGCisGAQQBgjcKAxUwCgYIKwYBBQUHAwMwDgYDVR0PAQH/BAQD
# AgeAMB8GA1UdJQQYMBYGCCsGAQUFBwMDBgorBgEEAYI3CgMVMB0GA1UdDgQWBBTR
# /PEuPn+0r5mHo7syx14SmaNUSDAfBgNVHSMEGDAWgBS/ZaKrb3WjTkWWVwXPOYf0
# wBUcHDBcBgNVHR8EVTBTMFGgT6BNhktodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20v
# cGtpb3BzL2NybC9NaWNyb3NvZnQlMjBUZXN0aW5nJTIwUENBJTIwMjAxMCgxKS5j
# cmwwaQYIKwYBBQUHAQEEXTBbMFkGCCsGAQUFBzAChk1odHRwOi8vd3d3Lm1pY3Jv
# c29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMFRlc3RpbmclMjBQQ0El
# MjAyMDEwKDEpLmNydDBDBgkrBgEEAYI3FAIENh40AE0AUwBJAFQAVABlAHMAdABD
# AG8AZABlAFMAaQBnAG4AaQBuAGcAUwBoAGEAMgAtAEMAUzAMBgNVHRMBAf8EAjAA
# MA0GCSqGSIb3DQEBCwUAA4IBAQAg7Ej3KuUo0ndCL+pCb2eqn8rz77O2j90YQr2Y
# MhMsinWGq1OTp3LZfPNeI3G2BXFtvjIE++ZXjLRa/bnReVrq2p/PikV7zq0WpWzS
# gb1TBvmg80mt7Pgq/RcuNfBlO5t1wRKnmmoR3zZLHmJrXCKKSL55CyL2ZYvi+ilO
# UgcBn4E7fTGAGr41x2aKt7BhnUbiYaVwGdyYKnJv9q+6AC+fI7xnoX2mbO63zWl8
# Se9LfD7P4S/03jwAafqPiHXgkAmw4cgsK4kX9pTS/sYb336dvlilbmcAhtGf1cQ0
# /5h279IUhQb53WulhCAZ3H42KxtetiyNi8MNLoEWK9wh/hb2MIIGkzCCBHugAwIB
# AgITMwAAAC01ekaIyQdx2AAAAAAALTANBgkqhkiG9w0BAQsFADCBkDELMAkGA1UE
# BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc
# BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjE6MDgGA1UEAxMxTWljcm9zb2Z0
# IFRlc3RpbmcgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAxMDAeFw0yMDEy
# MTAyMDQzMjBaFw0zNTA2MTcyMTA0MTFaMHkxCzAJBgNVBAYTAlVTMRMwEQYDVQQI
# EwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3Nv
# ZnQgQ29ycG9yYXRpb24xIzAhBgNVBAMTGk1pY3Jvc29mdCBUZXN0aW5nIFBDQSAy
# MDEwMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvzxggau+7P/XF2Py
# pkLRE2KcsBfOukYaeyIuVXOaVLnG1NHKmP53Rw2OnfBezPhU7/LPKtRi8ak0CgTX
# xQWG8hD1TdOWCGaF2wJ9GNzieiOnmildrnkYzwxj8Br/gampQz+pC7lR8bNIOvxE
# Ll8RxVY6/8oOzYgIwf3H1fU+7+pOG3KLI71FN54fcMGnybggc+3zbD2LIQXPdxL+
# odwH6Q1beAlsMlUQR9A3yMf3+nP+RjTkVhaoN2RT1jX7w4C2jraGkaEQ1sFK9uN6
# 1BEKst4unhCX4IGuEl2IAV3MpMQoUpxg8ArmiK9L6VeK7KMPNx4p9l0h09faXQ7J
# TtuNbQIDAQABo4IB+jCCAfYwDgYDVR0PAQH/BAQDAgGGMBIGCSsGAQQBgjcVAQQF
# AgMBAAEwIwYJKwYBBAGCNxUCBBYEFOqfXzO20F+erestpsECu0A4y+e1MB0GA1Ud
# DgQWBBS/ZaKrb3WjTkWWVwXPOYf0wBUcHDBUBgNVHSAETTBLMEkGBFUdIAAwQTA/
# BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2Nz
# L1JlcG9zaXRvcnkuaHRtMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMA8GA1Ud
# EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUowEEfjCIM+u5MZzK64V2Z/xltNEwWQYD
# VR0fBFIwUDBOoEygSoZIaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwv
# cHJvZHVjdHMvTWljVGVzUm9vQ2VyQXV0XzIwMTAtMDYtMTcuY3JsMIGNBggrBgEF
# BQcBAQSBgDB+ME0GCCsGAQUFBzAChkFodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20v
# cGtpL2NlcnRzL01pY1Rlc1Jvb0NlckF1dF8yMDEwLTA2LTE3LmNydDAtBggrBgEF
# BQcwAYYhaHR0cDovL29uZW9jc3AubWljcm9zb2Z0LmNvbS9vY3NwMA0GCSqGSIb3
# DQEBCwUAA4ICAQAntNCFsp7MD6QqU3PVbdrXMQDI9v9jyPYBEbUYktrctPmvJuj8
# Snm9wWewiAN5Zc81NQVYjuKDBpb1un4SWVCb4PDVPZ0J87tGzYe9dOJ30EYGeiIa
# aStkLLmLOYAM6oInIqIwVyIk2SE/q2lGt8OvwcZevNmPkVYjk6nyJi5EdvS6ciPR
# mW9bRWRT4pWU8bZIQL938LE4lHOQAixrAQiWes5Szp2U85E0nLdaDr5w/I28J/Z1
# +4zW1Nao1prVCOqrosnoNUfVf1kvswfW3FY2l1PiAYp8sGyO57GaztXdBoEOBcDL
# edfcPra9+NLdEF36NkE0g+9dbokFY7KxhUJ8WpMiCmN4yj9LKFLvQbctGMJJY9Ew
# HFifm2pgaiaafKF1Gyz+NruJzEEgpysMo/f9AVBQ/qCdPQQGEWp3QDIaef4ts9QT
# x+RmDKCBDMTFLgFmmhbtUY0JWjLkKn7soz/LIcDUle/p5TiFD4VhfZnAcvYQHXfu
# slnyp+yuhWzASnAQNnOIO6fc1JFIwkDkcM+k/TspfAajzHooSAwXkrOWrjRDV6wI
# 0YzMVHrEyQ0hZ5NnIXbL3lrTkOPjf3NBu1naSNEaySduStDbFVjV3TXoENEnZiug
# JKYSwmhzoYHM1ngipN5rNdqJiK5ukp6E8LDzi3l5/7XctJQY3+ZgHDJosjGCAlsw
# ggJXAgEBMIGQMHkxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAw
# DgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x
# IzAhBgNVBAMTGk1pY3Jvc29mdCBUZXN0aW5nIFBDQSAyMDEwAhMzAAAFdY/tZZAB
# UyRhAAEAAAV1MA0GCWCGSAFlAwQCAQUAoIGcMBkGCSqGSIb3DQEJAzEMBgorBgEE
# AYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3DQEJ
# BDEiBCDxI219Up7iJ3AwSYRX4PSh5eRDD+BFEniv5f4h3eBmazAwBgorBgEEAYI3
# AgEMMSIwIKAegBwAUwBTAEMAXABXAGkAbgBSAFQATQBwAGIAbABkMA0GCSqGSIb3
# DQEBAQUABIIBAJM54CexA2k8nX6xCTM9Ija6YXdw9VzcZrsFvdvhy17qzMiTQOIr
# lSt4os38M88yjLbuwVpkFOLoj/dfDvzVkpwsJgZPKqsWCBkFYyCPYrSx7Dsr0ZN9
# qp+aCD0TdC2nF7TklDFq/qA+b73AOelPU2ESjql7rUPXQyjqLYj8LIMx6jUFmYeh
# YIsKkipvrdjZsOqVJlE9OA+55IJPSzH+9iiklLDov0L3scOY3noXhiaPa2oYxId3
# U9VO0Bg9YiwgFJ7MGBwra4oNuwcfuLis9kA82iyNtzWPCA9uA7ufyDpqz5Gcs0th
# evo27AaSPmj9/FdsgGNaMVRfbPf10qM3OhA=
# SIG # End signature block
