# Copyright 2014 The Flutter Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.


# ---------------------------------- NOTE ---------------------------------- #
#
# Please keep the logic in this file consistent with the logic in the
# `update_dart_sdk.sh` script in the same directory to ensure that Flutter
# continues to work across all platforms!
#
# -------------------------------------------------------------------------- #

$ErrorActionPreference = "Stop"

$progName = Split-Path -parent $MyInvocation.MyCommand.Definition
$flutterRoot = (Get-Item $progName).parent.parent.FullName

$cachePath = "$flutterRoot\bin\cache"
$dartSdkPath = "$cachePath\dart-sdk"
$dartSdkLicense = "$cachePath\LICENSE.dart_sdk_archive.md"
$engineStamp = "$cachePath\engine-dart-sdk.stamp"
$engineVersion = (Get-Content "$flutterRoot\bin\cache\engine.stamp")
$engineRealm = (Get-Content "$flutterRoot\bin\cache\engine.realm")

$oldDartSdkPrefix = "dart-sdk.old"

# Make sure that PowerShell has expected version.
$psMajorVersionRequired = 5
$psMajorVersionLocal = $PSVersionTable.PSVersion.Major
if ($psMajorVersionLocal -lt $psMajorVersionRequired) {
    Write-Host "Flutter requires PowerShell $psMajorVersionRequired.0 or newer."
    Write-Host "Current version is $psMajorVersionLocal."
    # Use exit code 2 to signal that shared.bat should exit immediately instead of retrying.
    exit 2
}

if ((Test-Path $engineStamp) -and ($engineVersion -eq (Get-Content $engineStamp))) {
    return
}

$dartSdkBaseUrl = $Env:FLUTTER_STORAGE_BASE_URL
if (-not $dartSdkBaseUrl) {
    $dartSdkBaseUrl = "https://storage.googleapis.com"
}
if ($engineRealm) {
    $dartSdkBaseUrl = "$dartSdkBaseUrl/$engineRealm"
}

# It's important to use the native Dart SDK as the default target architecture
# for Flutter Windows builds depend on the Dart executable's architecture.
# FLUTTER_HOST_ARCH can be set as an override to force download for the specified architecture.
# PROCESSOR_ARCHITECTURE is a standard Windows env var indicating host CPU architecture.
$dartZipNameX64 = "dart-sdk-windows-x64.zip"
$dartZipNameArm64 = "dart-sdk-windows-arm64.zip"
$dartZipName = $dartZipNameX64
if ($env:FLUTTER_HOST_ARCH -eq "arm64") {
    $dartZipName = $dartZipNameArm64
} elseif ($env:FLUTTER_HOST_ARCH -eq "x64") {
    $dartZipName = $dartZipNameX64
} elseif ($env:PROCESSOR_ARCHITECTURE -eq "ARM64") {
    $dartSdkArm64Url = "$dartSdkBaseUrl/flutter_infra_release/flutter/$engineVersion/$dartZipNameArm64"
    Try {
        Invoke-WebRequest -Uri $dartSdkArm64Url -UseBasicParsing -Method Head | Out-Null
        $dartZipName = $dartZipNameArm64
    }
    Catch {
        Write-Host "The current channel's Dart SDK does not support Windows Arm64, falling back to Windows x64..."
    }
}
$dartSdkUrl = "$dartSdkBaseUrl/flutter_infra_release/flutter/$engineVersion/$dartZipName"

$dartSdkPathTemp = "$cachePath\dart-sdk.tmp"
if (Test-Path $dartSdkPathTemp) {
    Remove-Item $dartSdkPathTemp -Recurse -Force
}
New-Item $dartSdkPathTemp -force -type directory | Out-Null
$dartSdkZip = "$cachePath\$dartZipName"

Try {
    Import-Module BitsTransfer
    $ProgressPreference = 'SilentlyContinue'
    Start-BitsTransfer -Source $dartSdkUrl -Destination $dartSdkZip -ErrorAction Stop
}
Catch {
    Write-Host "Downloading the Dart SDK using the BITS service failed, retrying with WebRequest..."
    # Invoke-WebRequest is very slow when the progress bar is visible - a 28
    # second download can become a 33 minute download. Disable it with
    # $ProgressPreference and then restore the original value afterwards.
    # https://github.com/flutter/flutter/issues/37789
    $OriginalProgressPreference = $ProgressPreference
    $ProgressPreference = 'SilentlyContinue'
    Invoke-WebRequest -Uri $dartSdkUrl -OutFile $dartSdkZip
    $ProgressPreference = $OriginalProgressPreference
}

If (Get-Command 7z -errorAction SilentlyContinue) {
    Write-Host "Expanding downloaded archive with 7z..."
    # The built-in unzippers are painfully slow. Use 7-Zip, if available.
    & 7z x $dartSdkZip "-o$dartSdkPathTemp" -bd | Out-Null
} ElseIf (Get-Command 7za -errorAction SilentlyContinue) {
    Write-Host "Expanding downloaded archive with 7za..."
    # Use 7-Zip's standalone version 7za.exe, if available.
    & 7za x $dartSdkZip "-o$dartSdkPathTemp" -bd | Out-Null
} ElseIf (Get-Command Microsoft.PowerShell.Archive\Expand-Archive -errorAction SilentlyContinue) {
    Write-Host "Expanding downloaded archive with PowerShell..."
    # Use PowerShell's built-in unzipper, if available (requires PowerShell 5+).
    $global:ProgressPreference='SilentlyContinue'
    Microsoft.PowerShell.Archive\Expand-Archive $dartSdkZip -DestinationPath $dartSdkPathTemp
} Else {
    Write-Host "Expanding downloaded archive with Windows..."
    # As last resort: fall back to the Windows GUI.
    $shell = New-Object -com shell.application
    $zip = $shell.NameSpace($dartSdkZip)
    foreach($item in $zip.items()) {
        $shell.Namespace($dartSdkPathTemp).copyhere($item)
    }
}

Remove-Item $dartSdkZip

if (-not (Test-Path "$dartSdkPathTemp\dart-sdk")) {
    Remove-Item $dartSdkPathTemp -Recurse -Force -ErrorAction SilentlyContinue
    Write-Error "Dart SDK extraction failed: '$dartSdkPathTemp\dart-sdk' not found."
    exit 1
}

# Move old SDK to a new location instead of deleting it in case it is still in use (e.g. by IntelliJ).
if ((Test-Path $dartSdkPath) -or (Test-Path $dartSdkLicense)) {
    $oldDartSdkSuffix = 1
    while (Test-Path "$cachePath\$oldDartSdkPrefix$oldDartSdkSuffix") { $oldDartSdkSuffix++ }

    if (Test-Path $dartSdkPath) {
        Rename-Item $dartSdkPath "$oldDartSdkPrefix$oldDartSdkSuffix" -ErrorAction Stop
    }

    if (Test-Path $dartSdkLicense) {
        Rename-Item $dartSdkLicense "$oldDartSdkPrefix$oldDartSdkSuffix.LICENSE.md" -ErrorAction Stop
    }
}

# The unzip might have extracted LICENSE.dart_sdk_archive.md to the temp dir
$tempLicense = "$dartSdkPathTemp\LICENSE.dart_sdk_archive.md"
if (Test-Path $tempLicense) {
    if (Test-Path $dartSdkLicense) {
        Remove-Item $dartSdkLicense -Force -ErrorAction Stop
    }
    Move-Item $tempLicense $dartSdkLicense -ErrorAction Stop
}

# Move the extracted SDK to the final location
try {
    Move-Item "$dartSdkPathTemp\dart-sdk" $dartSdkPath -ErrorAction Stop
} finally {
    Remove-Item $dartSdkPathTemp -Recurse -Force -ErrorAction SilentlyContinue
}
$engineVersion | Out-File $engineStamp -Encoding ASCII

# Try to delete all old SDKs and license files.
Get-ChildItem -Path $cachePath | Where {$_.BaseName.StartsWith($oldDartSdkPrefix)} | Remove-Item -Recurse -ErrorAction SilentlyContinue
