. $PSScriptRoot\nodeUtils.ps1
. $PSScriptRoot\_echo.ps1

# Teste manual de acesso ao banco. Exercita a cadeia inteira:
#   nodeUtils.ps1 (acha Node 14, ajusta PATH)
#     -> mu.npm
#       -> testarAcessoAoBanco.js
#         -> mssql / tedious
#           -> SQL Server
#
# Uso:
#   . .\testarAcessoAoBanco.test.ps1
#   mu.testarAcessoAoBanco.test -usuario sa -senha minhasenha -enderecoHost 192.168.0.10 -banco minhabase
#
# Saida esperada:
#   [SUCESSO] Conexao com o banco funcionou.   -> tudo certo
#   [FALHA]   Nao foi possivel conectar...     -> credenciais, host, ou rede
#   [ERRO]    Node nao encontrado / outra coisa
#
# Tambem expoe mu.testarAcessoAoBanco.test.smokeNode que valida so o helper
# (sem precisar de SQL Server), util para confirmar que Node 14 foi achado.

function global:mu.testarAcessoAoBanco.test {
    param(
        [Parameter(Mandatory)] [string] $usuario,
        [Parameter(Mandatory)] [string] $senha,
        [Parameter(Mandatory)] [string] $enderecoHost,
        [Parameter(Mandatory)] [string] $banco
    )

    _echo "Testando acesso ao banco"
    _echo "  usuario: $usuario"
    _echo "  host:    $enderecoHost"
    _echo "  banco:   $banco"
    _echo "  node:    $(& node --version)"
    _echo ""

    # Igual ao que o validador real faz: o host vem do yaml com '\' (instancia
    # nomeada). O mssql exige '/'.
    $hostCorrigido = $enderecoHost -replace '\\', '/'

    $_ErrorActionPreference = $ErrorActionPreference
    $ErrorActionPreference = 'Continue'
    $saida = mu.npm run --silent --prefix $PSScriptRoot testar-acesso-ao-banco -- `
        --user $usuario `
        --password $senha `
        --host $hostCorrigido `
        --database $banco
    $ErrorActionPreference = $_ErrorActionPreference

    _echo ""
    _echo "Saida bruta do script Node:"
    _echo "----"
    $saida | ForEach-Object { _echo "  $_" }
    _echo "----"
    _echo ""

    $saidaConcat = ($saida -join "`n")
    if ($saidaConcat -match 'OK') {
        Write-Host "[SUCESSO] Conexao com o banco funcionou." -ForegroundColor Green
        return $true
    }
    if ($saidaConcat -match 'ERRO') {
        Write-Host "[FALHA] Nao foi possivel conectar ao banco. Verifique credenciais, host e firewall." -ForegroundColor Red
        return $false
    }

    Write-Host "[INDEFINIDO] Saida nao esperada do script. Veja o bloco acima." -ForegroundColor Yellow
    return $false
}

function global:mu.testarAcessoAoBanco.test.smokeNode {
    # Smoke test: so verifica que Node 14 foi achado e o ambiente esta pronto.
    # Nao tenta conectar em banco nenhum.

    _echo "Smoke test do ambiente Node:"
    _echo "  diretorio Node: $($global:mu_diretorioNode)"
    _echo "  node --version: $(& node --version)"
    _echo "  npm --version:  $(& npm --version)"
    _echo ""

    $versaoNode = & node --version
    if ($versaoNode -match "^v$($global:mu_versaoNodeEsperada)\.") {
        Write-Host "[SUCESSO] Node $($global:mu_versaoNodeEsperada).x detectado em '$($global:mu_diretorioNode)'." -ForegroundColor Green
        return $true
    }

    Write-Host "[FALHA] Versao do Node detectada ($versaoNode) nao bate com a esperada ($($global:mu_versaoNodeEsperada).x)." -ForegroundColor Red
    return $false
}
