<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <UsingTask TaskName="GetCurrentRuntimeInformation" AssemblyFile="$(CLIBuildDll)" />
  <UsingTask TaskName="GenerateBuildVersionInfo" AssemblyFile="$(CLIBuildDll)" />
  <UsingTask TaskName="CheckPrereqs" AssemblyFile="$(CLIBuildDll)" />
  <UsingTask TaskName="SetEnvVar" AssemblyFile="$(CLIBuildDll)" />
  <UsingTask TaskName="DotNetBuild" AssemblyFile="$(CLIBuildDll)" />
  <UsingTask TaskName="DotNetPack" AssemblyFile="$(CLIBuildDll)" />
  <UsingTask TaskName="DotNetRestore" AssemblyFile="$(CLIBuildDll)" />
  <UsingTask TaskName="DotNetTest" AssemblyFile="$(CLIBuildDll)" />
  <UsingTask TaskName="DownloadFile" AssemblyFile="$(CLIBuildDll)" />
  <UsingTask TaskName="ExtractArchive" AssemblyFile="$(CLIBuildDll)" />
  <UsingTask TaskName="ArchiveDirectory" AssemblyFile="$(CLIBuildDll)" />

  <Target Name="Prepare"
          DependsOnTargets="Init;DownloadHostAndSharedFxArtifacts;RestorePackages;ZipTemplates" />

  <Target Name="Init"
          DependsOnTargets="BuildDotnetCliBuildFramework">
    <!-- Current Runtime Information -->
    <GetCurrentRuntimeInformation>
      <Output TaskParameter="Rid" PropertyName="Rid" />
      <Output TaskParameter="Architecture" PropertyName="Architecture" />
      <Output TaskParameter="OSName" PropertyName="OSName" />
    </GetCurrentRuntimeInformation>

    <!-- Common Properties -->
    <PropertyGroup>
      <IsDesktopAvailable>False</IsDesktopAvailable>
      <IsDesktopAvailable Condition=" '$(OSName)' == 'win' ">True</IsDesktopAvailable>
      <DotNetPath>$(Stage0Path)</DotNetPath>

      <BaseOutputDirectory>$(RepoRoot)/artifacts/$(Rid)</BaseOutputDirectory>
      <ToolsOutputDirectory>$(BaseOutputDirectory)/tools</ToolsOutputDirectory>
      <Stage1Directory>$(BaseOutputDirectory)/stage1</Stage1Directory>
      <Stage1SymbolsDirectory>$(BaseOutputDirectory)/stage1symbols</Stage1SymbolsDirectory>
      <DotnetStage1>$(Stage1Directory)/dotnet$(ExeExtension)</DotnetStage1>
      <Stage2Directory>$(BaseOutputDirectory)/stage2</Stage2Directory>
      <Stage2SymbolsDirectory>$(BaseOutputDirectory)/stage2symbols</Stage2SymbolsDirectory>
      <DotnetStage2>$(Stage2Directory)/dotnet$(ExeExtension)</DotnetStage2>
      <OutputDirectory>$(Stage2Directory)/</OutputDirectory>
      <Stage2CompilationDirectory>$(BaseOutputDirectory)/stage2compilation</Stage2CompilationDirectory>
      <IntermediateDirectory>$(BaseOutputDirectory)/intermediate</IntermediateDirectory>
      <PackagesDirectory>$(BaseOutputDirectory)/packages</PackagesDirectory>      
      <SharedFrameworkPublishDirectory>$(IntermediateDirectory)/sharedFrameworkPublish</SharedFrameworkPublishDirectory>
    </PropertyGroup>

    <GenerateBuildVersionInfo RepoRoot="$(RepoRoot)">
      <Output TaskParameter="VersionMajor" PropertyName="VersionMajor" />
      <Output TaskParameter="VersionMinor" PropertyName="VersionMinor" />
      <Output TaskParameter="VersionPatch" PropertyName="VersionPatch" />
      <Output TaskParameter="CommitHash" PropertyName="CommitHash" />
      <Output TaskParameter="CommitCount" PropertyName="CommitCount" />
      <Output TaskParameter="ReleaseSuffix" PropertyName="ReleaseSuffix" />
      <Output TaskParameter="VersionSuffix" PropertyName="VersionSuffix" />
      <Output TaskParameter="SimpleVersion" PropertyName="SimpleVersion" />
      <Output TaskParameter="NugetVersion" PropertyName="NugetVersion" />
      <Output TaskParameter="MsiVersion" PropertyName="MsiVersion" />
      <Output TaskParameter="VersionBadgeMoniker" PropertyName="VersionBadgeMoniker" />
      <Output TaskParameter="Channel" PropertyName="Channel" />
      <Output TaskParameter="BranchName" PropertyName="BranchName" />
    </GenerateBuildVersionInfo>

    <PropertyGroup>
      <VersionBadge>$(BaseOutputDirectory)/$(VersionBadgeMoniker)_$(Configuration)_version_badge.svg</VersionBadge>
      <SdkVersion>$(NugetVersion)</SdkVersion>
      
      <SdkNugetVersion>$(VersionMajor).$(VersionMinor).$(VersionPatch)-preview3-$(CommitCount)</SdkNugetVersion>
      <ProjectModelNugetVersion>$(VersionMajor).$(VersionMinor).$(VersionPatch)-rc4-$(CommitCount)</ProjectModelNugetVersion>
      <DependencyModelAndInternalAbstractionsNugetVersion>$(VersionMajor).$(VersionMinor).1-beta-$(CommitCount)</DependencyModelAndInternalAbstractionsNugetVersion>

      <ArchiveExtension Condition=" '$(OSName)' == 'win' ">.zip</ArchiveExtension>
      <ArchiveExtension Condition=" '$(OSName)' != 'win' ">.tar.gz</ArchiveExtension>

      <InstallerExtension Condition=" '$(OSName)' == 'win' ">.msi</InstallerExtension>
      <InstallerExtension Condition=" '$(OSName)' == 'osx' ">.pkg</InstallerExtension>
      <InstallerExtension Condition=" '$(OSName)' == 'ubuntu' ">.deb</InstallerExtension>

      <BundleExtension Condition=" '$(OSName)' == 'win' ">.exe</BundleExtension>
      <BundleExtension Condition=" '$(OSName)' == 'osx' ">$(InstallerExtension)</BundleExtension>
      <BundleExtension Condition=" '$(OSName)' == 'ubuntu' ">$(InstallerExtension)</BundleExtension>

      <ProductMonikerRid Condition=" '$(Rid)' == 'ubuntu.16.04-x64' Or '$(Rid)' == 'fedora.23-x64' Or '$(Rid)' == 'opensuse.13.2-x64' ">$(Rid)</ProductMonikerRid>
      <ProductMonikerRid Condition=" '$(ProductMonikerRid)' == '' ">$(OSName)-$(Architecture)</ProductMonikerRid>

      <ArtifactNameSdk>dotnet-sdk</ArtifactNameSdk>
      <ArtifactNameSdkDebug>dotnet-sdk-debug</ArtifactNameSdkDebug>
      <ArtifactNameCombinedHostHostFxrFrameworkSdk>dotnet-dev</ArtifactNameCombinedHostHostFxrFrameworkSdk>
      <ArtifactNameCombinedFrameworkSdk>dotnet-sharedframework-sdk</ArtifactNameCombinedFrameworkSdk>

      <ArtifactNameWithVersionSdk>$(ArtifactNameSdk)-$(ProductMonikerRid).$(SdkVersion)</ArtifactNameWithVersionSdk>
      <ArtifactNameWithVersionSdkDebug>$(ArtifactNameSdkDebug)-$(ProductMonikerRid).$(SdkVersion)</ArtifactNameWithVersionSdkDebug>
      <ArtifactNameWithVersionCombinedHostHostFxrFrameworkSdk>$(ArtifactNameCombinedHostHostFxrFrameworkSdk)-$(ProductMonikerRid).$(SdkVersion)</ArtifactNameWithVersionCombinedHostHostFxrFrameworkSdk>
      <ArtifactNameWithVersionCombinedFrameworkSdk>$(ArtifactNameCombinedFrameworkSdk)-$(ProductMonikerRid).$(SdkVersion)</ArtifactNameWithVersionCombinedFrameworkSdk>

      <!-- Downloaded Installers + Archives -->
      <DownloadedSharedHostInstallerFileName Condition=" '$(InstallerExtension)' != '' ">dotnet-host-$(ProductMonikerRid).$(SharedHostVersion)$(InstallerExtension)</DownloadedSharedHostInstallerFileName>
      <DownloadedSharedHostInstallerFile Condition=" '$(InstallerExtension)' != '' ">$(PackagesDirectory)/$(DownloadedSharedHostInstallerFileName)</DownloadedSharedHostInstallerFile>

      <DownloadedHostFxrInstallerFileName Condition=" '$(InstallerExtension)' != '' ">dotnet-hostfxr-$(ProductMonikerRid).$(HostFxrVersion)$(InstallerExtension)</DownloadedHostFxrInstallerFileName>
      <DownloadedHostFxrInstallerFile Condition=" '$(InstallerExtension)' != '' ">$(PackagesDirectory)/$(DownloadedHostFxrInstallerFileName)</DownloadedHostFxrInstallerFile>

      <DownloadedSharedFrameworkInstallerFileName Condition=" '$(InstallerExtension)' != '' ">dotnet-sharedframework-$(ProductMonikerRid).$(SharedFrameworkVersion)$(InstallerExtension)</DownloadedSharedFrameworkInstallerFileName>
      <DownloadedSharedFrameworkInstallerFile Condition=" '$(InstallerExtension)' != '' ">$(PackagesDirectory)/$(DownloadedSharedFrameworkInstallerFileName)</DownloadedSharedFrameworkInstallerFile>

      <CombinedFrameworkHostCompressedFileName>dotnet-$(ProductMonikerRid).$(SharedFrameworkVersion)$(ArchiveExtension)</CombinedFrameworkHostCompressedFileName>
    </PropertyGroup>

    <CheckPrereqs />

    <!-- SetTelemetryProfile -->
    <SetEnvVar Name="DOTNET_CLI_TELEMETRY_PROFILE" Value="$(DOTNET_CLI_TELEMETRY_PROFILE);https://github.com/dotnet/cli;$(CommitHash)" />
  </Target>

  <Target Name="SetupDownloadHostAndSharedFxInputsOutputs" DependsOnTargets="Init">
    <PropertyGroup>
      <CoreSetupBlobRootUrl>https://dotnetcli.blob.core.windows.net/dotnet/$(CoreSetupChannel)</CoreSetupBlobRootUrl>
      <SharedFrameworkArchiveBlobRootUrl>$(CoreSetupBlobRootUrl)/Binaries/$(SharedFrameworkVersion)</SharedFrameworkArchiveBlobRootUrl>
      <CoreSetupInstallerBlobRootUrl>$(CoreSetupBlobRootUrl)/Installers</CoreSetupInstallerBlobRootUrl>

      <CoreSetupDownloadDirectory>$(IntermediateDirectory)/coreSetupDownload/$(SharedFrameworkVersion)</CoreSetupDownloadDirectory>
      <CombinedSharedHostAndFrameworkArchive>$(CoreSetupDownloadDirectory)/combinedSharedHostAndFrameworkArchive</CombinedSharedHostAndFrameworkArchive>
    </PropertyGroup>

    <ItemGroup>
      <_DownloadAndExtractItem Include="CombinedSharedHostAndFrameworkArchive"
                               Condition="!Exists('$(CombinedSharedHostAndFrameworkArchive)')">
        <Url>$(SharedFrameworkArchiveBlobRootUrl)/$(CombinedFrameworkHostCompressedFileName)</Url>
        <DownloadFileName>$(CombinedSharedHostAndFrameworkArchive)</DownloadFileName>
        <ExtractDestintation>$(SharedFrameworkPublishDirectory)</ExtractDestintation>
      </_DownloadAndExtractItem>

      <_DownloadAndExtractItem Include="DownloadedSharedFrameworkInstallerFile"
                               Condition="!Exists('$(DownloadedSharedFrameworkInstallerFile)') And '$(InstallerExtension)' != ''">
        <Url>$(CoreSetupInstallerBlobRootUrl)/$(SharedFrameworkVersion)/$(DownloadedSharedFrameworkInstallerFileName)</Url>
        <DownloadFileName>$(DownloadedSharedFrameworkInstallerFile)</DownloadFileName>
        <ExtractDestintation></ExtractDestintation>
      </_DownloadAndExtractItem>

      <_DownloadAndExtractItem Include="DownloadedSharedHostInstallerFile"
                               Condition="!Exists('$(DownloadedSharedHostInstallerFile)') And '$(InstallerExtension)' != ''">
        <Url>$(CoreSetupInstallerBlobRootUrl)/$(SharedHostVersion)/$(DownloadedSharedHostInstallerFileName)</Url>
        <DownloadFileName>$(DownloadedSharedHostInstallerFile)</DownloadFileName>
        <ExtractDestintation></ExtractDestintation>
      </_DownloadAndExtractItem>

      <_DownloadAndExtractItem Include="DownloadedHostFxrInstallerFile"
                               Condition="!Exists('$(DownloadedHostFxrInstallerFile)') And '$(InstallerExtension)' != ''">
        <Url>$(CoreSetupInstallerBlobRootUrl)/$(HostFxrVersion)/$(DownloadedHostFxrInstallerFileName)</Url>
        <DownloadFileName>$(DownloadedHostFxrInstallerFile)</DownloadFileName>
        <ExtractDestintation></ExtractDestintation>
      </_DownloadAndExtractItem>
    </ItemGroup>
  </Target>

  <Target Name="DownloadHostAndSharedFxArtifacts"
          DependsOnTargets="SetupDownloadHostAndSharedFxInputsOutputs">

    <DownloadFile Condition=" '@(_DownloadAndExtractItem)' != '' "
                  Uri="%(_DownloadAndExtractItem.Url)"
                  DestinationPath="%(_DownloadAndExtractItem.DownloadFileName)" />

    <ExtractArchive Condition=" '%(_DownloadAndExtractItem.ExtractDestintation)' != '' "
                    InputFile="%(_DownloadAndExtractItem.DownloadFileName)"
                    DestinationDirectory="%(_DownloadAndExtractItem.ExtractDestintation)" />
  </Target>
  
  <Target Name="RestorePackages"
          DependsOnTargets="SetupRestorePackagesInputsOutputs;Init"
          Inputs="@(RestorePackagesInput)"
          Outputs="@(RestorePackagesInput->'%(RelativeDir)/project.lock.json')">

    <CallTarget Targets="CleanSrcToolsLockFiles" />
    <DotNetRestore WorkingDirectory="$(RepoRoot)/src" ToolPath="$(DotNetPath)" />
    <DotNetRestore WorkingDirectory="$(RepoRoot)/tools" ToolPath="$(DotNetPath)" />

  </Target>

  <Target Name="CleanSrcToolsLockFiles" >
    <ItemGroup>
      <SrcToolsLockFiles Include="$(RepoRoot)/src/**/project.lock.json;$(RepoRoot)/tools/**/project.lock.json" />
    </ItemGroup>
    <Delete Files="@(SrcToolsLockFiles)" /> 
  </Target>

  <Target Name="SetupRestorePackagesInputsOutputs">
    <ItemGroup>
      <RestorePackagesInput Include="$(RepoRoot)/src/**/project.json" />
      <RestorePackagesInput Include="$(RepoRoot)/tools/**/project.json" />
    </ItemGroup>
  </Target>

  <Target Name="SetupZipTemplatesInputsOutputs">
    <PropertyGroup>
      <_DotNetNewFolder>$(RepoRoot)/src/dotnet/commands/dotnet-new</_DotNetNewFolder>
    </PropertyGroup>
    <ItemGroup>
      <DotNetNewArchive Include="$([System.IO.Directory]::GetDirectories($(_DotNetNewFolder)))" />
      
      <ZipTemplatesInput Include="$(_DotNetNewFolder)/**" Exclude="$(_DotNetNewFolder)/*.zip" />
      <ZipTemplatesOutput Include="@(DotNetNewArchive->'%(RelativeDir)/$([System.IO.Path]::GetFileName('%(DotNetNewArchive.FullPath)')).zip')" />
    </ItemGroup>
  </Target>

  <Target Name="ZipTemplates"
          DependsOnTargets="SetupZipTemplatesInputsOutputs"
          Inputs="@(ZipTemplatesInput)"
          Outputs="@(ZipTemplatesOutput)">
    
    <ArchiveDirectory InputDirectory="%(DotNetNewArchive.FullPath)"
                      FileName="$([System.IO.Path]::GetFileName(%(DotNetNewArchive.FullPath)))"
                      OutputDirectory="%(DotNetNewArchive.RelativeDir)"
                      ForceZipArchive="true" />
  </Target>

</Project>