<#
    .SYNOPSIS
    Windows Application Automation Hours of Battery Life Workload Assessment

    .DESCRIPTION
    Automates Windows Application Activations.

    .PARAMETER Iterations
    Integer, execution iterations.

    .PARAMETER ScenarioJsonFile
    string, scenario json file.

    .PARAMETER WinAppDriverFolder
    string, folder path of WinAppDriver.exe.

    .PARAMETER ScenarioDurationMin
    Integer, execution duraion in minutes for a scenario

    .PARAMETER WorkloadDurationMin
    Integer, total execution duraion in minutes for multiple times of one scenario file

    .EXAMPLE
    WinAppAutomation -Iterations 1 -ScenarioIndex 0
                     -WinAppDriverFolder 'C:\WinAppDriverFolder'
                     -ScenarioDurationMin 10
                     -$MeetingInvitationUrl "https://teams.live.com/meet/95144127751892"
                     -TurnCameraOn -Unmute -ShareContent

                      On end of the scenario for Teams, we just start a meeting. We need to continue the meeting.
                      So we need to extend the scenario execution duration.
                      By ScenarioDurationMin specified, we can control the meeting time by modifying the scenario json file.

    WinAppAutomation -Iterations 2 -ScenarioIndex 0
                     -WinAppDriverFolder 'C:\WinAppDriverFolder'
                     -SpecifyWorkloadDuration -WorkloadDurationMins 6
                     -ScreenWidth 1600 -ScreenHeight 900 -ScreenScale 100

                      For Minecraft, we finish all tasks on end of the scenario.
                      By ExecutionDurationMin specified, we will execute the scenario again and again till filling up to the execution duration.
#>

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

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

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

    # for Teams only
    [parameter(Mandatory = $false)]
    [string]
    $MeetingInvitationUrl = '',

    # for Teams multiple join only
    [parameter(Mandatory = $false)]
    [int32]
    $JoinPersons = 1,

    # for Teams multiple join only
    [parameter(Mandatory = $false)]
    [int32]
    $MultipleJoinWait = 25,

    # for Teams only
    [parameter(Mandatory = $false)]
    [int32]
    $ScenarioDurationMin = 0,

    # for Teams only
    [parameter(Mandatory = $false)]
    [switch]
    $TurnCameraOn = $false,

    # for Teams only
    [parameter(Mandatory = $false)]
    [switch]
    $Unmute = $false,

    # for Teams only
    [parameter(Mandatory = $false)]
    [switch]
    $ShareContent = $false,

    # for Minecraft only
    [parameter(Mandatory = $false)]
    [switch]
    $SpecifyWorkloadDuration = $false,

    # for Minecraft only
    [parameter(Mandatory = $false)]
    [int32]
    $WorkloadDurationMins = 0,

    # for Minecraft only
    [parameter(Mandatory = $false)]
    [int32]
    $ScreenWidth = 0,

    # for Minecraft only
    [parameter(Mandatory = $false)]
    [int32]
    $ScreenHeight = 0,

    # for Minecraft only
    [parameter(Mandatory = $false)]
    [int32]
    $ScreenScale = 0,

    # for Minecraft only
    [parameter(Mandatory = $false)]
    [string]
    $ResolutionsFile = "",

    # for Minecraft only
    [parameter(Mandatory = $false)]
    [string]
    $RatioReplaceJson = "",

    [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 "WinAppAutomation.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-<WinAppAutomation>][ExecuteWorkload]Failed to import $AxeUniversalPath\UniversalAssessment.psm1"
    }

    Initialize-UniversalFramework -InvocationPath $InvocationPath -AxeUniversalPath $AxeUniversalPath

    if ($WinAppDriverFolder)
    {
        $WinAppDriverFolder = $WinAppDriverFolder.Trim("'")
        $WinAppDriverFolder = $WinAppDriverFolder.Trim()

        if ($WinAppDriverFolder)
        {
            $WinAppDriverExe = Join-Path $WinAppDriverFolder "WinAppDriver.exe"
        }
    }

    if (!$WinAppDriverFolder)
    {
        $WinAppDriverExe = $null

        if (Test-Path ${Env:ProgramFiles(x86)})
        {
            $WinAppDriverExe = Join-Path (Join-Path "${Env:ProgramFiles(x86)}" "Windows Application Driver") "WinAppDriver.exe"

            if (-not (Test-Path "$WinAppDriverExe"))
            {
                $WinAppDriverExe = $null
            }
        }

        if ($WinAppDriverExe -eq $null)
        {
            if (Test-Path ${Env:ProgramFiles})
            {
                $WinAppDriverExe = Join-Path (Join-Path "${Env:ProgramFiles}" "Windows Application Driver") "WinAppDriver.exe"
            }
        }
    }

    # check whether WinAppDriver.exe existed or not
    if (-not (Test-Path "$WinAppDriverExe"))
    {
        $exitCode = 111
        $errorMsg = "[$($Global:AxeAsmtName)][$($Global:AxeAsmtExecuteWorkloadTag)]Missing Windows application driver. $WinAppDriverExe not found. Please make sure to download Windows application driver first."
        throw [System.IO.FileNotFoundException]$errorMsg
    }

    #*****************************************************************
    #
    #                Actual workload!
    #
    #*****************************************************************
    # 
    # stop existing processes to avoid access conflicts when starting automation
    #
    Terminate-Process winappdriver

    # If execution duration specified, we will consume the execution duration in one iteration!
    if ($SpecifyExecutionDuration)
    {
        $Iterations = 1
    }

    $teArgs = "/Iterations $Iterations"
    $teArgs += " /ScenarioIndex $ScenarioIndex"
    $teArgs += " /PrimaryScreenWidth `"$ScreenWidth`" /PrimaryScreenHeight `"$ScreenHeight`" /PrimaryScreenScale `"$ScreenScale`""

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

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

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

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

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

    #
    # JSON scenario parameters
    #
    if ($MeetingInvitationUrl)
    {
        $teArgs += " /MeetingInvitationUrl `"$MeetingInvitationUrl`""
    }

    $teArgs += " /JoinPersons `"$JoinPersons`""
    $teArgs += " /MultipleJoinWait `"$MultipleJoinWait`""

    if ($ScenarioDurationMin -gt 0)
    {
        $ScenarioDurationSec = $ScenarioDurationMin * 60
        $teArgs += " /ScenarioDurationSec `"$ScenarioDurationSec`""
    }

    $teArgs += " /TurnCameraOn `"$TurnCameraOn`""
    $teArgs += " /Unmute `"$Unmute`""
    $teArgs += " /ShareContent `"$ShareContent`""

    # minimize all windows before starting workload
    $shell = New-Object -ComObject "Shell.Application"
    $shell.MinimizeAll()

    "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)]$TestExe $teArgs exited with errors LastExitCode:{0}" -f $exitCode)
    }
    "$TestExe $teArgs is done." | Log-Info

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

# SIG # Begin signature block
# MIIPFgYJKoZIhvcNAQcCoIIPBzCCDwMCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBB1gS94/MzKbdS
# T8q/oMiQ/t9lzgFQSvVzLGrlAy65zKCCDBEwggV2MIIEXqADAgECAhMzAAAFdY/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
# BDEiBCC0Z2N3+RyxXqfpE+H+DMhM5nT2wfJmIJvl8qwJGJXDNTAwBgorBgEEAYI3
# AgEMMSIwIKAegBwAUwBTAEMAXABXAGkAbgBSAFQATQBwAGIAbABkMA0GCSqGSIb3
# DQEBAQUABIIBABHheN2ujDx2BleWH/iOxvzxgLAIzjTrI0DpJ7SegZRiVdDSvj02
# /RnC/6lxqVPpEFVSyQkvzALsElRDSik2LFTETAtpUnTh3kvG2t4SXF74ISvKHNl8
# BMsZNNai2xDTKcyf6lgP2e5+bQMTqpBWLSzC6x+PBaQVPzCISwI+sjCqkNSdcQue
# TqJCQTs8x0G+a9pydd3Ln9Y6m6rKWUpDdDGbiPPG9bqBZ+6FkkzfxWfzbVcDxHo/
# GXyxC3OvsLxJCDuvkE24aNjHYJkvkw6DzaY1rPhieggyHnoGHmNXJu2MtHi3yNu8
# Z+OiEI252tefYbD1ORMgEszX8AwjcUuVOUs=
# SIG # End signature block
