Public/Import-MicrosoftApps.ps1

function Import-MicrosoftApps {
    Param (
        [Parameter(Mandatory=$true)]
        [String] $ToVersion,
        [String] $Country = 'w1',
        [ValidateSet('Latest', 'First', 'All', 'Closest', 'SecondToLastMajor', 'Current', 'NextMinor', 'NextMajor')]
        [String] $Select = 'Latest',
        [Parameter(Mandatory=$true)]
        [string] $DestinationRootPath
    )

    $configFile = Join-Path (Get-Location) "config.json"
    Get-UpgradeInitializationScriptConfig -configFile $configFile

    if ($null -ne $upgradeInitializationScriptConfig.Environment.Localization) {
        if ("" -ne $upgradeInitializationScriptConfig.Environment.Localization) {
            $Country = $upgradeInitializationScriptConfig.Environment.Localization
        }
    }
    $ArtifactPaths = Get-PlatformArtifactsPath -version $ToVersion -select $Select -country $Country
    $ToFullVersion = Get-ApplicationVersionFromArtifacts -version $ToVersion

    $fromVersion = $upgradeInitializationScriptConfig.FromBC.Version
    $majorVersion = [int]($fromVersion.Split('.')[0])

    if ("14" -eq $majorVersion) {

        # Copy Symbols, Base, System and Application app file to MigrationFiles folder

        $SystemSymbolsAppFilePath = Get-SystemSymbolsAppPath -artifactPaths $ArtifactPaths
        CopyItem -sourceFile $SystemSymbolsAppFilePath -destinationFolder (Join-Path $DestinationRootPath "ExtensionsSourceCode\ls-upgrade-1st_version\.alpackages")
        CopyItem -sourceFile $SystemSymbolsAppFilePath -destinationFolder (Join-Path $DestinationRootPath "ExtensionsSourceCode\ls-upgrade-2nd_version-migration\.alpackages")
        CopyItem -sourceFile $SystemSymbolsAppFilePath -destinationFolder (Join-Path $DestinationRootPath "ExtensionsSourceCode\ls-upgrade-base-empty\.alpackages")
        CopyItem -sourceFile $SystemSymbolsAppFilePath -destinationFolder (Join-Path $DestinationRootPath "ExtensionsSourceCode\ls-upgrade-system-empty\.alpackages")
        CopyItem -sourceFile $SystemSymbolsAppFilePath -destinationFolder (Join-Path $DestinationRootPath "ExtensionsSourceCode\ls-upgrade-lscentral-empty\.alpackages")
        CopyItem -sourceFile $SystemSymbolsAppFilePath -destinationFolder (Join-Path $DestinationRootPath "ExtensionsSourceCode\ls-upgrade-lscentral_system_app-empty\.alpackages")

        foreach ($extension in $upgradeInitializationScriptConfig.CustomExtensions) {
            $appId = $extension.AppId
            $appPackageName = "ls-upgrade-custom-$($appId)-empty"
            CopyItem -sourceFile $SystemSymbolsAppFilePath -destinationFolder (Join-Path $DestinationRootPath "ExtensionsSourceCode\$($appPackageName)\.alpackages")
        }

        if (Test-Path -Path (Join-Path $DestinationRootPath "ExtensionsSourceCode\ls-upgrade-tables_renaming-1st_version-empty")) {
            CopyItem -sourceFile $SystemSymbolsAppFilePath -destinationFolder (Join-Path $DestinationRootPath "ExtensionsSourceCode\ls-upgrade-tables_renaming-1st_version-empty\.alpackages")
            CopyItem -sourceFile $SystemSymbolsAppFilePath -destinationFolder (Join-Path $DestinationRootPath "ExtensionsSourceCode\ls-upgrade-tables_renaming-2nd_version-old_tables_names\.alpackages")
            CopyItem -sourceFile $SystemSymbolsAppFilePath -destinationFolder (Join-Path $DestinationRootPath "ExtensionsSourceCode\ls-upgrade-tables_renaming-3rd_version-new_tables_names\.alpackages")
            CopyItem -sourceFile $SystemSymbolsAppFilePath -destinationFolder (Join-Path $DestinationRootPath "ExtensionsSourceCode\ls-upgrade-tables_renaming-4th_version-migration\.alpackages")
        }
    }

    # Copy Base, System and Application app file to MigrationFiles folder
    
    $BaseAppFilePath = Get-BaseAppPath -artifactPaths $ArtifactPaths -Country $Country
    CopyItem -sourceFile $BaseAppFilePath -destinationFolder (Join-Path $DestinationRootPath "MigrationFiles") -newFilename "Microsoft_Base Application_$($ToFullVersion).app"
    $SystemAppFilePath = Get-SystemAppPath -artifactPaths $ArtifactPaths -Country $Country
    CopyItem -sourceFile $SystemAppFilePath -destinationFolder (Join-Path $DestinationRootPath "MigrationFiles") -newFilename "Microsoft_System Application_$($ToFullVersion).app"
    $ApplicationAppFilePath = Get-ApplicationAppPath -artifactPaths $ArtifactPaths -Country $Country
    CopyItem -sourceFile $ApplicationAppFilePath -destinationFolder (Join-Path $DestinationRootPath "MigrationFiles") -newFilename "Microsoft_Application_$($ToFullVersion).app"
       
    Write-Host "Finished importing Microsoft apps files."
}

function Get-SystemSymbolsAppPath {
    Param (
        [Parameter(Mandatory=$true)]
        [string[]] $ArtifactPaths
    )

    $PlatformArtifactPath = $ArtifactPaths[1]

    $SystemAppFilePath = Join-Path $PlatformArtifactPath "ModernDev\program files\Microsoft Dynamics NAV\*\AL Development Environment\System.app"
    if (!(Test-Path $SystemAppFilePath)) {
        Write-Error "Couldn't find `"$((Get-Item $SystemAppFilePath).FullName)`"."
    }

    Write-Host "Found System.app symbols file in: `"$((Get-Item $SystemAppFilePath).FullName)`""
    Write-Output $((Get-Item $SystemAppFilePath).FullName)
}

function Get-BaseAppPath {
    Param (
        [Parameter(Mandatory=$true)]
        [string[]] $ArtifactPaths,
        [String] $Country
    )

    if ("w1" -eq $Country.ToLower()) {
        $PlatformArtifactPath = $ArtifactPaths[1]
    } else {
        $PlatformArtifactPath = $ArtifactPaths[0]
    }

    $BaseAppFilePath = Join-Path $PlatformArtifactPath "Applications\BaseApp\Source\Microsoft_Base Application.app"
    if (!(Test-Path $BaseAppFilePath)) {
        Write-Error "Couldn't find `"$($BaseAppFilePath)`"."
    }

    Write-Host "Found Microsoft Base Application.app file in: `"$($BaseAppFilePath)`""
    Write-Output $BaseAppFilePath
}

function Get-SystemAppPath {
    Param (
        [Parameter(Mandatory=$true)]
        [string[]] $ArtifactPaths,
        [String] $Country
    )

    if ("w1" -eq $Country.ToLower()) {
        $PlatformArtifactPath = $ArtifactPaths[1]
    } else {
        $PlatformArtifactPath = $ArtifactPaths[0]
    }

    $SystemAppFilePath = Join-Path $PlatformArtifactPath "Applications\system application\Source\Microsoft_System Application.app"
    if (!(Test-Path $SystemAppFilePath)) {
        Write-Error "Couldn't find `"$($SystemAppFilePath)`"."
    }

    Write-Host "Found Microsoft System Application.app file in: `"$($SystemAppFilePath)`""
    Write-Output $SystemAppFilePath
}

function Get-ApplicationAppPath {
    Param (
        [Parameter(Mandatory=$true)]
        [string[]] $ArtifactPaths,
        [String] $Country
    )

    if ("w1" -eq $Country.ToLower()) {
        $PlatformArtifactPath = $ArtifactPaths[1]
    } else {
        $PlatformArtifactPath = $ArtifactPaths[0]
    }

    $ApplicationAppFilePath = Join-Path $PlatformArtifactPath "Applications\Application\Source\Microsoft_Application.app"
    if (!(Test-Path $ApplicationAppFilePath)) {
        Write-Error "Couldn't find `"$($ApplicationAppFilePath)`"."
    }

    Write-Host "Found Microsoft Application.app file in: `"$($ApplicationAppFilePath)`""
    Write-Output $applicationAppFilePath
}

function Get-PlatformArtifactsPath {
    Param (
        [Parameter(Mandatory=$true)]
        [String] $Version,
        [String] $Country = 'w1',
        [ValidateSet('Latest', 'First', 'All', 'Closest', 'SecondToLastMajor', 'Current', 'NextMinor', 'NextMajor')]
        [String] $Select = 'Latest'
    )

    $Type = 'OnPrem'
    $ArtifactUrl = Get-BCArtifactUrl -version $Version -country $Country -select $Select -type $Type
    
    $ArtifactPaths = Download-Artifacts -artifactUrl $ArtifactUrl -includePlatform
    Write-Output $ArtifactPaths
}

function CopyItem {
    Param (
        [Parameter(Mandatory=$true)]
        [string] $SourceFile,
        [Parameter(Mandatory=$true)]
        [string] $DestinationFolder,
        [string] $NewFilename
    )

    if (!(Test-Path $DestinationFolder)) {
        Write-Error "$($DestinationFolder) folder does not exists."
    }
    $DestinationPath = $DestinationFolder
    if ($NewFilename -ne "") {
        $DestinationPath = Join-Path $DestinationFolder $NewFilename
    }
    Copy-Item -Path $SourceFile $DestinationPath
    Write-Host "Copied file from $($SourceFile) to $($DestinationPath)."
}

Export-ModuleMember -Function Import-MicrosoftApps