<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <!-- AcquireWix Properties -->
    <PropertyGroup>
      <WixVersion>3.10.4</WixVersion>
      <WixDownloadUrl>https://dotnetcli.azureedge.net/build/wix/wix.$(WixVersion).zip</WixDownloadUrl>
      <WixRoot>$(IntermediateDirectory)/WixTools/$(WixVersion)</WixRoot>
      <WixDestinationPath>$(WixRoot)/WixTools.$(WixVersion).zip</WixDestinationPath>
      <WixDownloadSentinel>$(WixRoot)/WixDownload.$(WixVersion).sentinel</WixDownloadSentinel>
    </PropertyGroup>

    <!-- Generate MSI/Bundle Properties -->
    <PropertyGroup>
      <CombinedFrameworkSdkHostBundleEngineName>$(InstallerOutputDirectory)/$(ArtifactNameWithVersionCombinedHostHostFxrFrameworkSdk)-engine.exe</CombinedFrameworkSdkHostBundleEngineName>

      <SdkGenerateMsiPowershellScript>$(RepoRoot)/packaging/windows/clisdk/generatemsi.ps1</SdkGenerateMsiPowershellScript>
      <SdkStableFileIdForApphostTransform>$(RepoRoot)/packaging/windows/clisdk/stablefileidforapphosttransform.xslt</SdkStableFileIdForApphostTransform>
      <SdkGenerateBundlePowershellScript>$(RepoRoot)/packaging/windows/clisdk/generatebundle.ps1</SdkGenerateBundlePowershellScript>
      <SdkGenerateNupkgPowershellScript>$(RepoRoot)/packaging/windows/clisdk/generatenupkg.ps1</SdkGenerateNupkgPowershellScript>

      <MSBuildExtensionsGenerateMsiPowershellScript>$(RepoRoot)/packaging/windows/msbuildextensions/generatemsi.ps1</MSBuildExtensionsGenerateMsiPowershellScript>

      <SdkInstallerNuspecFile>$(RepoRoot)/packaging/windows/clisdk/VS.Redist.Common.Net.Core.SDK.$(Architecture).nuspec</SdkInstallerNuspecFile>
      <SdkInstallerNupkgFile>$(InstallerOutputDirectory)/VS.Redist.Common.Net.Core.SDK.$(Architecture).$(FullNugetVersion).nupkg</SdkInstallerNupkgFile>

      <SdkMSBuildExtensionsNuspecFile>$(RepoRoot)/packaging/windows/clisdk/VS.Redist.Common.Net.Core.SDK.MSBuildExtensions.nuspec</SdkMSBuildExtensionsNuspecFile>
      <SdkMSBuildExtensionsNupkgFile>$(InstallerOutputDirectory)/VS.Redist.Common.Net.Core.SDK.MSBuildExtensions.$(FullNugetVersion).nupkg</SdkMSBuildExtensionsNupkgFile>
      <SdkMSBuildExtensionsSwrFile>$(InstallerOutputDirectory)/VS.Redist.Common.Net.Core.SDK.MSBuildExtensions.swr</SdkMSBuildExtensionsSwrFile>
    </PropertyGroup>

    <!-- Test Sdk MSI Properties -->
    <PropertyGroup>
      <SdkTestMsiPowershellScript>$(RepoRoot)/test/Installer/testmsi.ps1</SdkTestMsiPowershellScript>
      <SdkMsiTestedSentinel>$(InstallerOutputDirectory)/$(ArtifactNameWithVersionSdk).MsiTested.sentinel</SdkMsiTestedSentinel>
    </PropertyGroup>

    <Target Name="MsiTargetsSetupInputOutputs" DependsOnTargets="Init">
      <!-- Generate SDK MSI Inputs -->
      <ItemGroup>
        <GenerateSdkMsiInputs Include="$(SdkLayoutOutputDirectory)/**/*;
                                       $(SdkGenerateMsiPowershellScript)" />
        <GenerateMSBuildExtensionsMsiInputs Include="$(MSBuildExtensionsOutputDirectory)/**/*;
                                                     $(MSBuildExtensionsGenerateMsiPowershellScript)" />
      </ItemGroup>
      
      <!-- Consumed By Publish -->
      <ItemGroup>
        <GeneratedInstallers Include="$(SdkInstallerFile);$(CombinedFrameworkSdkHostInstallerFile)" />
        <GeneratedInstallers Condition=" '$(Architecture)' == 'x86' " Include="$(MSBuildExtensionsInstallerFile)" />
      </ItemGroup>

      <GenerateMsiVersion CommitCount="$(CommitCount)"
                          VersionMajor="$(VersionMajor)"
                          VersionMinor="$(VersionMinor)"
                          VersionPatch="$(VersionPatch)">
        <Output TaskParameter="MsiVersion" PropertyName="MsiVersion" />
      </GenerateMsiVersion>

      <GenerateGuidFromName Name="$(SdkInstallerFile)">
        <Output TaskParameter="OutputGuid"
            PropertyName="SdkInstallerUpgradeCode" />
      </GenerateGuidFromName>

      <GenerateGuidFromName Name="$(MSBuildExtensionsInstallerFile)">
        <Output TaskParameter="OutputGuid"
            PropertyName="MSBuildExtensionsInstallerUpgradeCode" />
      </GenerateGuidFromName>

      <GenerateGuidFromName Name="$(CombinedFrameworkSdkHostInstallerFile)">
        <Output TaskParameter="OutputGuid"
            PropertyName="CombinedFrameworkSDKHostInstallerUpgradeCode" />
      </GenerateGuidFromName>
    </Target>

    <Target Name="AcquireWix"
            DependsOnTargets="Init;MsiTargetsSetupInputOutputs"
            Inputs="$(WixDownloadSentinel)"
            Outputs="$(WixDestinationPath)">

      <!-- Setup sentinel to take advantage of incrementality -->
      <MakeDir Directories="$(WixRoot)" />
      <WriteLinesToFile
          File="$(WixDownloadSentinel)"
          Lines="$(WixVersion)"
          Overwrite="true"
          Encoding="Unicode"/>

      <DownloadFile
          Uri="$(WixDownloadUrl)"
          DestinationPath="$(WixDestinationPath)"
          Overwrite="false" />

      <ZipFileExtractToDirectory
          SourceArchive="$(WixDestinationPath)"
          DestinationDirectory="$(WixRoot)" />

    </Target>

    <Target Name="GenerateSdkMsi"
            DependsOnTargets="Init;Layout;AcquireWix;MsiTargetsSetupInputOutputs"
            Condition=" '$(OS)' == 'Windows_NT'"
            Inputs="@(GenerateSdkMsiInputs)"
            Outputs="$(SdkInstallerFile)">

      <Exec Command="powershell -NoProfile -NoLogo $(SdkGenerateMsiPowershellScript) ^
                      '$(SdkLayoutOutputDirectory)' ^
                      '$(SdkInstallerFile)' ^
                      '$(WixRoot)' ^
                      '$(SdkBrandName)' ^
                      '$(MsiVersion)' ^
                      '$(SimpleVersion)' ^
                      '$(NugetVersion)' ^
                      '$(SdkInstallerUpgradeCode)' ^
                      '$(Architecture)' ^
                      '$(SdkStableFileIdForApphostTransform)' ^
                      " />
    </Target>

    <Target Name="GenerateMSBuildExtensionsMsi"
            DependsOnTargets="Init;Layout;AcquireWix;MsiTargetsSetupInputOutputs"
            Condition=" '$(OS)' == 'Windows_NT' And '$(Architecture)' == 'x86' "
            Inputs="@(GenerateMSBuildExtensionsMsiInputs)"
            Outputs="$(MSBuildExtensionsInstallerFile)">

      <Exec Command="powershell -NoProfile -NoLogo $(MSBuildExtensionsGenerateMsiPowershellScript) ^
                      '$(MSBuildExtensionsOutputDirectory)' ^
                      '$(MSBuildExtensionsInstallerFile)' ^
                      '$(WixRoot)' ^
                      '$(MSBuildExtensionsBrandName)' ^
                      '$(SimpleVersion)' ^
                      '$(SimpleVersion)' ^
                      '$(NugetVersion)' ^
                      '$(MSBuildExtensionsInstallerUpgradeCode)' ^
                      '$(Architecture)'" />
    </Target>

    <Target Name="GenerateSdkBundle"
            DependsOnTargets="Init;Layout;AcquireWix;MsiTargetsSetupInputOutputs;GenerateSdkMsi"
            Condition=" '$(OS)' == 'Windows_NT'"
            Inputs="$(SdkInstallerFile);
                    $(DownloadedSharedFrameworkInstallerFile);
                    $(DownloadedHostFxrInstallerFile);
                    $(DownloadedSharedHostInstallerFile);
                    $(SdkGenerateBundlePowershellScript)"
            Outputs="$(CombinedFrameworkSdkHostInstallerFile)">

      <Exec Command="powershell -NoProfile -NoLogo $(SdkGenerateBundlePowershellScript) ^
                      '$(SdkInstallerFile)' ^
                      '$(DownloadedAspNetCoreSharedFxInstallerFile)' ^
                      '$(DownloadedSharedFrameworkInstallerFile)' ^
                      '$(DownloadedHostFxrInstallerFile)' ^
                      '$(DownloadedSharedHostInstallerFile)' ^
                      '$(CombinedFrameworkSdkHostInstallerFile)' ^
                      '$(WixRoot)' ^
                      '$(SdkBrandName)' ^
                      '$(MsiVersion)' ^
                      '$(SimpleVersion)' ^
                      '$(NugetVersion)' ^
                      '$(CombinedFrameworkSDKHostInstallerUpgradeCode)' ^
                      '$(Architecture)' ^
                      '$(MicrosoftNETCoreAppPackageVersion)' ^
                      '$(AspNetCoreVersion)'" />
    </Target>

    <Target Name="GenerateSdkNupkg"
            DependsOnTargets="Init;Layout;MsiTargetsSetupInputOutputs;GenerateSdkBundle"
            Condition=" '$(OS)' == 'Windows_NT'"
            Inputs="$(CombinedFrameworkSdkHostInstallerFile);
                    $(SdkInstallerNuspecFile);
                    $(SdkGenerateNupkgPowershellScript)"
            Outputs="$(SdkInstallerNupkgFile)">

      <Exec Command="powershell -NoProfile -NoLogo $(SdkGenerateNupkgPowershellScript) ^
                      '$(CombinedFrameworkSdkHostInstallerFile)' ^
                      '$(FullNugetVersion)' ^
                      '$(SdkInstallerNuspecFile)' ^
                      '$(SdkInstallerNupkgFile)'" />
    </Target>

    <Target Name="GenerateSdkMSBuildExtensionsNupkg"
            DependsOnTargets="Init;Layout;MsiTargetsSetupInputOutputs;GenerateSdkBundle"
            Condition=" '$(OS)' == 'Windows_NT' And '$(Architecture)' == 'x64' "
            Inputs="$(MSBuildExtensionsLayoutDirectory)/**/*;
                    $(SdkInstallerNuspecFile);
                    $(SdkGenerateNupkgPowershellScript)"
            Outputs="$(SdkMSBuildExtensionsNupkgFile);$(SdkMSBuildExtensionsSwrFile)">

      <Exec Command="powershell -NoProfile -NoLogo $(SdkGenerateNupkgPowershellScript) ^
                      '$(MSBuildExtensionsLayoutDirectory)' ^
                      '$(FullNugetVersion)' ^
                      '$(SdkMSBuildExtensionsNuspecFile)' ^
                      '$(SdkMSBuildExtensionsNupkgFile)'" />
      
      <GenerateMSBuildExtensionsSWR MSBuildExtensionsLayoutDirectory="$(MSBuildExtensionsLayoutDirectory)"
                                    OutputFile="$(SdkMSBuildExtensionsSwrFile)"/>

    </Target>

    <Target Name="TestSdkMsi"
            Inputs="$(SdkInstallerFile)"
            Outputs="$(SdkMsiTestedSentinel)"
            DependsOnTargets="Init;MsiTargetsSetupInputOutputs;GenerateSdkMsi"
            Condition=" '$(OS)' == 'Windows_NT'" >

      <Exec Command ="powershell -NoProfile -NoLogo $(SdkTestMsiPowershellScript) ^
                      -InputMsi '$(SdkInstallerFile)' ^
                      -DotnetDir '$(PreviousStageDirectory)' ^
                      -TestDir '$(TestOutputDir)'" />

      <WriteLinesToFile
          File="$(SdkMsiTestedSentinel)"
          Lines="$(SdkVersion)"
          Overwrite="true"
          Encoding="Unicode"/>
    </Target>

    <Target Name="GenerateMsis"
          DependsOnTargets="Init;
                            Layout;
                            MsiTargetsSetupInputOutputs;
                            AcquireWix;
                            GenerateSdkMsi;
                            GenerateMSBuildExtensionsMsi;
                            GenerateSdkBundle;
                            GenerateSdkNupkg;
                            GenerateSdkMSBuildExtensionsNupkg;
                            TestSdkMsi"
          Condition=" '$(OS)' == 'Windows_NT'" />

    <!-- These targets are used in signing, don't remove them! -->
    <Target Name="ExtractEngineFromSdkBundle"
            DependsOnTargets="MsiTargetsSetupInputOutputs">
      <Exec Command="$(WixRoot)/insignia.exe -ib $(CombinedFrameworkSdkHostInstallerFile) -o $(CombinedFrameworkSdkHostBundleEngineName)" />
    </Target>

    <Target Name="ReattachEngineToSdkBundle"
            DependsOnTargets="MsiTargetsSetupInputOutputs">
      <Exec Command="$(WixRoot)/insignia.exe -ab $(CombinedFrameworkSdkHostBundleEngineName) $(CombinedFrameworkSdkHostInstallerFile) -o $(CombinedFrameworkSdkHostInstallerFile)" />
    </Target>
</Project>
