#Requires -Version 7.0
<#
.SYNOPSIS
  End-to-end CLI test for the TwinCAT (Beckhoff ADS) driver.

.DESCRIPTION
  Requires a reachable AMS router (local TwinCAT XAR, Beckhoff.TwinCAT.Ads.
  TcpRouter NuGet, or an authorised remote AMS route) + a live TwinCAT
  runtime on -AmsNetId. Without one the driver surfaces a transport error
  on InitializeAsync + the script's probe fails.

  Set TWINCAT_TRUST_WIRE=1 to promise the endpoint is live. Without it the
  script skips (task #221 tracks the 7-day-trial CI fixture — until that
  lands, TwinCAT testing is a manual operator task).

.PARAMETER AmsNetId
  AMS Net ID of the target (e.g. 127.0.0.1.1.1 for local XAR,
  192.168.1.40.1.1 for a remote PLC).

.PARAMETER AmsPort
  AMS port. Default 851 (TC3 PLC runtime). TC2 uses 801.

.PARAMETER SymbolPath
  TwinCAT symbol to exercise. Default 'MAIN.iCounter' — substitute with
  whatever your project actually declares.

.PARAMETER OpcUaUrl
  OtOpcUa server endpoint.

.PARAMETER BridgeNodeId
  NodeId at which the server publishes the Symbol.
#>

param(
    [string]$AmsNetId = "127.0.0.1.1.1",
    [int]$AmsPort = 851,
    [string]$SymbolPath = "MAIN.iCounter",
    [string]$OpcUaUrl = "opc.tcp://localhost:4840",
    [Parameter(Mandatory)] [string]$BridgeNodeId
)

$ErrorActionPreference = "Stop"
. "$PSScriptRoot/_common.ps1"

if (-not ($env:TWINCAT_TRUST_WIRE -eq "1" -or $env:TWINCAT_TRUST_WIRE -eq "true")) {
    Write-Skip "TWINCAT_TRUST_WIRE not set — requires reachable AMS router + live TC runtime (task #221 tracks the CI fixture). Set =1 once the router is up."
    exit 0
}

$twinCatCli = Get-CliInvocation `
    -ProjectFolder "src/Drivers/Cli/ZB.MOM.WW.OtOpcUa.Driver.TwinCAT.Cli" `
    -ExeName "otopcua-twincat-cli"
$opcUaCli = Get-CliInvocation `
    -ProjectFolder "src/Client/ZB.MOM.WW.OtOpcUa.Client.CLI" `
    -ExeName "otopcua-cli"

$commonTc = @("-n", $AmsNetId, "-p", $AmsPort)
$results = @()

$results += Test-Probe `
    -Cli $twinCatCli `
    -ProbeArgs (@("probe") + $commonTc + @("-s", $SymbolPath, "--type", "DInt"))

$writeValue = Get-Random -Minimum 1 -Maximum 9999
$results += Test-DriverLoopback `
    -Cli $twinCatCli `
    -WriteArgs (@("write") + $commonTc + @("-s", $SymbolPath, "-t", "DInt", "-v", $writeValue)) `
    -ReadArgs  (@("read")  + $commonTc + @("-s", $SymbolPath, "-t", "DInt")) `
    -ExpectedValue "$writeValue"

$bridgeValue = Get-Random -Minimum 10000 -Maximum 19999
$results += Test-ServerBridge `
    -DriverCli $twinCatCli `
    -DriverWriteArgs (@("write") + $commonTc + @("-s", $SymbolPath, "-t", "DInt", "-v", $bridgeValue)) `
    -OpcUaCli $opcUaCli `
    -OpcUaUrl $OpcUaUrl `
    -OpcUaNodeId $BridgeNodeId `
    -ExpectedValue "$bridgeValue"

$reverseValue = Get-Random -Minimum 20000 -Maximum 29999
$results += Test-OpcUaWriteBridge `
    -OpcUaCli $opcUaCli `
    -OpcUaUrl $OpcUaUrl `
    -OpcUaNodeId $BridgeNodeId `
    -DriverCli $twinCatCli `
    -DriverReadArgs (@("read") + $commonTc + @("-s", $SymbolPath, "-t", "DInt")) `
    -ExpectedValue "$reverseValue"

$subValue = Get-Random -Minimum 30000 -Maximum 39999
$results += Test-SubscribeSeesChange `
    -OpcUaCli $opcUaCli `
    -OpcUaUrl $OpcUaUrl `
    -OpcUaNodeId $BridgeNodeId `
    -DriverCli $twinCatCli `
    -DriverWriteArgs (@("write") + $commonTc + @("-s", $SymbolPath, "-t", "DInt", "-v", $subValue)) `
    -ExpectedValue "$subValue"

Write-Summary -Title "TwinCAT e2e" -Results $results
if ($results | Where-Object { -not $_.Passed }) { exit 1 }
