<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the MIT license. See License.txt in the project root for full license information. -->
<Project>
  <PropertyGroup>
    <PublishingVersion>3</PublishingVersion>
  </PropertyGroup>

  <PropertyGroup>
    <Product>Sdk</Product>
    <BlobStoragePartialRelativePath>$(Product)</BlobStoragePartialRelativePath>

    <PublishBinariesAndBadge Condition=" '$(PublishBinariesAndBadge)' == '' ">true</PublishBinariesAndBadge>
  </PropertyGroup>

  <!-- Pulled from arcade's publish.proj see https://github.com/dotnet/arcade/issues/5790 for
       issue on making this common in arcade so it doesn't have to be duplicated here -->
  <PropertyGroup>
    <CollectionUri>$(SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)</CollectionUri>

    <!-- When we have dev.azure.com/<account>/ -->
    <AzureDevOpsAccount Condition="$(CollectionUri.IndexOf('dev.azure.com')) >= 0">$(CollectionUri.Split('/')[3])</AzureDevOpsAccount>

    <!-- When we have <account>.visualstudio.com -->
    <AzureDevOpsAccount Condition="$(CollectionUri.IndexOf('visualstudio.com')) >= 0">$(CollectionUri.Split('.')[0].Split('/')[2])</AzureDevOpsAccount>
  </PropertyGroup>

  <!--
    The new Maestro/BAR build model keeps separate Azure DevOps and GitHub build information.
    The GitHub information will be extracted based on the Azure DevOps repository.
  -->
  <ItemGroup>
    <ManifestBuildData Include="InitialAssetsLocation=$(SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)$(SYSTEM_TEAMPROJECT)/_apis/build/builds/$(BUILD_BUILDID)/artifacts" />
    <ManifestBuildData Include="AzureDevOpsBuildId=$(BUILD_BUILDID)" />
    <ManifestBuildData Include="AzureDevOpsBuildDefinitionId=$(SYSTEM_DEFINITIONID)" />
    <ManifestBuildData Include="AzureDevOpsAccount=$(AzureDevOpsAccount)" />
    <ManifestBuildData Include="AzureDevOpsProject=$(SYSTEM_TEAMPROJECT)" />
    <ManifestBuildData Include="AzureDevOpsBuildNumber=$(BUILD_BUILDNUMBER)" />
    <ManifestBuildData Include="AzureDevOpsRepository=$(BUILD_REPOSITORY_URI)" />
    <ManifestBuildData Include="AzureDevOpsBranch=$(BUILD_SOURCEBRANCH)" />
  </ItemGroup>

  <PropertyGroup>
      <!-- Because we may be building in a container, we should use an asset manifest file path
           that exists in the container. Disambiguate the manifests via available properties.
           AGENT_OS and AGENT_JOBNAME are present on Azure DevOps agents. AssetManifestOS will also
           be used by arcade to generate the name of the manifest file name for the built in publishing. -->
      <AssetManifestOS Condition="'$(AGENT_OS)' != ''">$(AGENT_OS)</AssetManifestOS>
      <AssetManifestOS Condition="'$(AGENT_OS)' == ''">$(OS)</AssetManifestOS>
      <AssetManifestOS Condition="'$(AGENT_JOBNAME)' != ''">$(AssetManifestOS)-$(AGENT_JOBNAME)</AssetManifestOS>
      <BaseAssetManifestFileName>$(AssetManifestOS)</BaseAssetManifestFileName>
      <BaseAssetManifestFileName Condition="'$(AGENT_JOBNAME)' == '' and '$(Architecture)' != ''">$(AssetManifestOS)-$(Architecture)</BaseAssetManifestFileName>
      <InstallersAssetManifestFileName>$(BaseAssetManifestFileName)-installers</InstallersAssetManifestFileName>
      <!-- Property AssetManifestFilePath would be reassigned by the Arcade SDK, so use a different name (InstallersAssetManifestFilePath) -->
      <InstallersAssetManifestFilePath>$(ArtifactsLogDir)AssetManifest\$(InstallersAssetManifestFileName).xml</InstallersAssetManifestFilePath>

      <DotnetTempWorkingDirectory>$(ArtifactsDir)..\DotnetAssetsTmpDir\$([System.Guid]::NewGuid())</DotnetTempWorkingDirectory>
      <ChecksumTempWorkingDirectory>$(ArtifactsDir)..\ChecksumAssetsTmpDir\$([System.Guid]::NewGuid())</ChecksumTempWorkingDirectory>
  </PropertyGroup>

  <ItemGroup>
    <SdkAssetsToPublish Include="$(ArtifactsShippingPackagesDir)*.zip" Condition=" '$(PublishBinariesAndBadge)' == 'true' " />
    <SdkAssetsToPublish Include="$(ArtifactsShippingPackagesDir)*.tar.gz" Condition=" '$(PublishBinariesAndBadge)' == 'true' " />
    <SdkAssetsToPublish Include="$(ArtifactsShippingPackagesDir)*.pkg" />
    <SdkAssetsToPublish Include="$(ArtifactsShippingPackagesDir)*.exe" />
    <SdkAssetsToPublish Include="$(ArtifactsShippingPackagesDir)*.deb" />
    <SdkAssetsToPublish Include="$(ArtifactsShippingPackagesDir)*.rpm" />
    <SdkAssetsToPublish Include="$(ArtifactsShippingPackagesDir)*.msi" />
    <SdkAssetsToPublish Include="$(ArtifactsShippingPackagesDir)*.cab" />
    <SdkAssetsToPublish Include="$(ArtifactsShippingPackagesDir)*.svg" Condition=" '$(PublishBinariesAndBadge)' == 'true' " />
    <!-- Only publish this file from windows x64 so that we don't end up with duplicates -->
    <SdkAssetsToPublish Include="$(ArtifactsShippingPackagesDir)productVersion.txt"
        Condition=" '$(PublishBinariesAndBadge)' == 'true' and '$(OS)' == 'Windows_NT' and '$(Architecture)' == 'x64' and '$(PgoInstrument)' != 'true'" />
    <SdkAssetsToPublish Include="$(ArtifactsShippingPackagesDir)sdk-productVersion.txt"
        Condition=" '$(PublishBinariesAndBadge)' == 'true' and '$(OS)' == 'Windows_NT' and '$(Architecture)' == 'x64' and '$(PgoInstrument)' != 'true'" />
    <SdkAssetsToPublish Include="$(ArtifactsShippingPackagesDir)productCommit-*.txt" Condition=" '$(PublishBinariesAndBadge)' == 'true' " />
    <SdkNonShippingAssetsToPublish Include="$(ArtifactsNonShippingPackagesDir)*.swr" />
    <SdkNonShippingAssetsToPublish Include="$(ArtifactsNonShippingPackagesDir)*.msi" />
    <SdkNonShippingAssetsToPublish Condition="'$(PublishBinariesAndBadge)' != 'false'" Include="$(ArtifactsNonShippingPackagesDir)*.tar.gz" />
    <SdkNonShippingAssetsToPublish Condition="'$(PublishBinariesAndBadge)' != 'false'" Include="$(ArtifactsNonShippingPackagesDir)*.zip" />
    <SdkNonShippingAssetsToPublish Include="$(ArtifactsNonShippingPackagesDir)*.pkg" />
    <CheckSumsToPublish Include="$(ArtifactsShippingPackagesDir)*.sha512" />
    <CheckSumsToPublish Remove="$(ArtifactsShippingPackagesDir)productCommit-*.txt.sha512" Condition=" '$(PublishBinariesAndBadge)' == 'false'" />
    <CheckSumsToPublish Remove="$(ArtifactsShippingPackagesDir)productVersion.txt.sha512" Condition=" '$(OS)' != 'Windows_NT' or '$(Architecture)' != 'x64'" />
    <CheckSumsToPublish Remove="$(ArtifactsShippingPackagesDir)sdk-productVersion.txt.sha512" Condition=" '$(OS)' != 'Windows_NT' or '$(Architecture)' != 'x64'" />
    <CheckSumsToPublish Remove="$(ArtifactsShippingPackagesDir)*.zip.sha512" Condition=" '$(PublishBinariesAndBadge)' == 'false' "/>
    <CheckSumsToPublish Remove="$(ArtifactsShippingPackagesDir)*.tar.gz.sha512" Condition=" '$(PublishBinariesAndBadge)' == 'false' "/>
  </ItemGroup>

  <Target Name="PublishSdkAssetsAndChecksums"
          BeforeTargets="Publish"
          Condition="$(DotNetPublishUsingPipelines)">

    <ReadLinesFromFile File="$(ArtifactsTmpDir)FullNugetVersion.version">
      <Output
          TaskParameter="Lines"
          PropertyName="FullNugetVersion"/>
    </ReadLinesFromFile>

    <ItemGroup>
      <!-- Always publish blobs to a suffixed directory. -->
      <SdkAssetsToPushToBlobFeed Include="@(SdkAssetsToPublish)">
        <RelativeBlobPath>$(BlobStoragePartialRelativePath)/$(FullNugetVersion)/$([System.String]::Copy('%(Filename)%(Extension)'))</RelativeBlobPath>
      </SdkAssetsToPushToBlobFeed>

      <SdkAssetsToPushToBlobFeed Include="@(SdkNonShippingAssetsToPublish)">
        <RelativeBlobPath>$(BlobStoragePartialRelativePath)/$(FullNugetVersion)/$([System.String]::Copy('%(Filename)%(Extension)'))</RelativeBlobPath>
        <ManifestArtifactData>NonShipping=true</ManifestArtifactData>
      </SdkAssetsToPushToBlobFeed>

      <ChecksumsToPushToBlobFeed Include="@(CheckSumsToPublish)">
        <RelativeBlobPath>$(BlobStoragePartialRelativePath)/$(FullNugetVersion)/$([System.String]::Copy('%(Filename)%(Extension)'))</RelativeBlobPath>
      </ChecksumsToPushToBlobFeed>
    </ItemGroup>

    <ItemGroup Condition="'$(PostBuildSign)' == 'true'">
      <ItemsToSignPostBuildWithPaths Include="$(ArtifactsShippingPackagesDir)*.zip" Condition=" '$(PublishBinariesAndBadge)' == 'true' " />
      <ItemsToSignPostBuildWithPaths Include="$(ArtifactsShippingPackagesDir)*.exe" />
      <ItemsToSignPostBuildWithPaths Include="$(ArtifactsShippingPackagesDir)*.msi" />
      <ItemsToSignPostBuildWithPaths Include="$(ArtifactsNonShippingPackagesDir)*.msi" />
      <ItemsToSignPostBuildWithPaths Include="$(ArtifactsNonShippingPackagesDir)*.zip" Condition=" '$(PublishBinariesAndBadge)' == 'true' " />
      <ItemsToSignPostBuild Remove="@(ItemsToSignPostBuild)" />
      <ItemsToSignPostBuild Include="@(ItemsToSignPostBuildWithPaths->'%(Filename)%(Extension)')" />
    </ItemGroup>

    <PropertyGroup>
      <IsStableBuild>false</IsStableBuild>
      <IsStableBuild Condition="'$(DotNetFinalVersionKind)' == 'release'">true</IsStableBuild>
    </PropertyGroup>

    <PushToAzureDevOpsArtifacts
      AzureDevOpsCollectionUri="$(SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)"
      AzureDevOpsProject="$(SYSTEM_TEAMPROJECT)"
      AzureDevOpsBuildId="$(BUILD_BUILDID)"
      ItemsToPush="@(SdkAssetsToPushToBlobFeed);@(ChecksumsToPushToBlobFeed)"
      ItemsToSign="@(ItemsToSignPostBuild)"
      CertificatesSignInfo="@(CertificatesSignInfo)"
      StrongNameSignInfo="@(StrongNameSignInfo)"
      FileSignInfo="@(FileSignInfo)"
      FileExtensionSignInfo="@(FileExtensionSignInfo)"
      ManifestBuildData="@(ManifestBuildData)"
      ManifestRepoName="$(BUILD_REPOSITORY_NAME)"
      ManifestBranch="$(BUILD_SOURCEBRANCH)"
      ManifestBuildId="$(BUILD_BUILDNUMBER)"
      ManifestCommit="$(BUILD_SOURCEVERSION)"
      AssetManifestPath="$(InstallersAssetManifestFilePath)"
      PublishFlatContainer="true"
      IsStableBuild="$(IsStableBuild)"
      PublishingVersion="3" />
  </Target>
</Project>