<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project='Installer.RPM.props'/>

  <UsingTask TaskName="ReplaceFileContents" AssemblyFile="$(CLIBuildDll)"/>
  <UsingTask TaskName="BuildFPMToolPreReqs" AssemblyFile="$(CLIBuildDll)"/>

  <PropertyGroup>
    <BuildRpmPackage Condition=" '$(IsRPMBasedDistro)' == 'True' ">True</BuildRpmPackage>
  </PropertyGroup>

  <!-- Re-enable "TestSdkRpm" when the following issue is resolved: https://github.com/dotnet/cli/issues/9672 -->
  <Target Name="GenerateRpms"
          DependsOnTargets="TestFPMTool;BuildRpms"
          Condition=" '$(BuildRpmPackage)' == 'True' "
          Outputs="@(GeneratedInstallers)"/>

  <Target Name="BuildRpms"
          DependsOnTargets="GenerateSdkRpm"
          Condition=" '$(BuildRpmPackage)' == 'True' and '$(FPMPresent)' == 'True' "/>

  <Target Name="GenerateSdkRpm"
          DependsOnTargets="SetupRpmProps">

    <RemoveDir Condition="Exists('$(RpmIntermediatesDir)')" Directories="$(RpmIntermediatesDir)"/>
    <MakeDir Directories="$(RpmIntermediatesDir)"/>

    <!-- Create empty rpm layout -->
    <RemoveDir Condition="Exists('$(RpmLayoutDirectory)')" Directories="$(RpmLayoutDirectory)"/>
    <MakeDir Directories="$(RpmLayoutDirectory)"/>
    <MakeDir Directories="$(RpmLayoutPackageRoot)"/>
    <MakeDir Directories="$(RpmLayoutSDK)"/>
    <MakeDir Directories="$(RpmLayoutDocs)"/>
    <MakeDir Directories="$(RpmLayoutTemplates)"/>
    <MakeDir Directories="$(RpmLayoutScripts)"/>

    <!-- Copy files to rpm layout -->
    <ItemGroup>
      <SDKFiles Include="$(InputRoot)/**/*"/>
      <SDKManpages Include="$(ManPagesDir)/**/*"/>
      <SDKTemplatesFiles Include="$(TemplatesDir)/**/*"/>
      <SDKScriptsFiles Include="$(ScriptsDir)/after_remove_host.sh"/>
    </ItemGroup>

    <Copy SourceFiles="@(SDKFiles)"
          DestinationFiles="@(SDKFiles->'$(RpmLayoutSDK)/%(RecursiveDir)%(Filename)%(Extension)')"
          OverwriteReadOnlyFiles="True"
          SkipUnchangedFiles="False"
          UseHardlinksIfPossible="False"/>

    <Copy SourceFiles="@(SDKManpages)"
          DestinationFiles="@(SDKManpages->'$(RpmLayoutDocs)/%(RecursiveDir)%(Filename)%(Extension)')"
          OverwriteReadOnlyFiles="True"
          SkipUnchangedFiles="False"
          UseHardlinksIfPossible="False"/>

    <Copy SourceFiles="@(SDKTemplatesFiles)"
          DestinationFiles="@(SDKTemplatesFiles->'$(RpmLayoutTemplates)/%(RecursiveDir)%(Filename)%(Extension)')"
          OverwriteReadOnlyFiles="True"
          SkipUnchangedFiles="False"
          UseHardlinksIfPossible="False"/>

    <Copy SourceFiles="@(SDKScriptsFiles)"
          DestinationFiles="@(SDKScriptsFiles->'$(RpmLayoutScripts)/%(RecursiveDir)%(Filename)%(Extension)')"
          OverwriteReadOnlyFiles="True"
          SkipUnchangedFiles="False"
          UseHardlinksIfPossible="False"/>

    <!-- Replace config json variables -->
    <ItemGroup>
      <SDKTokenValue Include="%SHARED_HOST_RPM_VERSION%">
        <ReplacementString>$(MicrosoftNETCoreAppMajorMinorPatchVersion)</ReplacementString>
      </SDKTokenValue>
      <SDKTokenValue Include="%ASPNETCORE_SHAREDFX_RPM_PACKAGE_NAME%">
        <ReplacementString>$(AspNetCoreSharedFxRpmPackageName)</ReplacementString>
      </SDKTokenValue>
      <SDKTokenValue Include="%ASPNETCORE_SHAREDFX_RPM_PACKAGE_VERSION%">
        <ReplacementString>$(AspNetCoreMajorMinorPatchVersion)</ReplacementString>
      </SDKTokenValue>
      <SDKTokenValue Include="%SHARED_HOST_RPM_NAME%">
        <ReplacementString>$(SharedFxRpmPackageName)</ReplacementString>
      </SDKTokenValue>
      <SDKTokenValue Include="%SDK_NUGET_VERSION%">
        <ReplacementString>$(SdkVersion)</ReplacementString>
      </SDKTokenValue>
      <SDKTokenValue Include="%CLI_SDK_BRAND_NAME%">
        <ReplacementString>$(SdkBrandName)</ReplacementString>
      </SDKTokenValue>
      <SDKTokenValue Include="%SDK_RPM_PACKAGE_NAME%">
        <ReplacementString>$(SdkRpmPackageName)</ReplacementString>
      </SDKTokenValue>

      <AfterInstallHostTokenValue  Include="%SDK_VERSION%">
        <ReplacementString>$(SdkVersion)</ReplacementString>
      </AfterInstallHostTokenValue>
    </ItemGroup>

    <ItemGroup>
      <TestSdkRpmTaskEnvironmentVariables Include="PATH=$(RpmInstalledDirectory)$(PathListSeparator)$(PATH)" />
      <TestSdkRpmTaskEnvironmentVariables Include="TEST_ARTIFACTS=$(TestArtifactsDir)" />
      <TestSdkRpmTaskEnvironmentVariables Include="TEST_PACKAGES=$(TestPackagesDir)" />
      <TestSdkRpmTaskEnvironmentVariables Include="PreviousStageProps=$(NextStagePropsPath)" />

      <!-- Consumed By Publish -->
      <GeneratedInstallers Include="$(SdkInstallerFile)" />
    </ItemGroup>

    <ReplaceFileContents InputFiles="$(AfterInstallHostScriptTemplateFile)"
                         DestinationFiles="$(AfterInstallHostScriptDestinationFile)"
                         ReplacementItems="@(AfterInstallHostTokenValue)"/>

    <Chmod
        Glob="$(AfterInstallHostScriptDestinationFile)"
        Mode="ugo+x" />

    <ReplaceFileContents InputFiles="$(ConfigJsonFile)"
                         DestinationFiles="$(RpmLayoutDirectory)$(RpmConfigJsonName)"
                         ReplacementItems="@(SDKTokenValue)"/>

    <!-- Call the task to build the pre-reqs (parameters, copyright, changelog) for calling the FPM tool -->
    <BuildFPMToolPreReqs InputDir="$(RpmLayoutDirectory)"
                         OutputDir="$(RpmIntermediatesDir)"
                         PackageVersion="$(RpmPackageVersion)"
                         ConfigJsonFile="$(RpmLayoutDirectory)$(RpmConfigJsonName)">
      <Output TaskParameter="FPMParameters" PropertyName="FPMCmdParameters"/>
    </BuildFPMToolPreReqs>

    <!-- Build the RPM package by calling the FPM tool and passing the parameter list -->
    <Exec Command="fpm $(FPMCmdParameters)" WorkingDirectory="$(RpmIntermediatesDir)"/>

    <!-- Copy package to output -->
    <ItemGroup>
      <GeneratedRpmFiles Remove="@(GeneratedRpmFiles)"/>
      <GeneratedRpmFiles Include="$(RpmIntermediatesDir)/*.rpm"/>
    </ItemGroup>

    <Error Text="@(GeneratedRpmFiles->Count()) .rpm files generated." Condition="'@(GeneratedRpmFiles->Count())' != 1"/>

    <Copy SourceFiles="@(GeneratedRpmFiles)"
          DestinationFiles="$(RpmFile)"
          OverwriteReadOnlyFiles="True"
          SkipUnchangedFiles="False"
          UseHardlinksIfPossible="False"/>

  </Target>

  <Target Name="SetupRpmProps" DependsOnTargets="CalculateLinuxNativeInstallerDependencyVersions">
    <PropertyGroup>
      <RuntimeDepsPackageVersion>$(MicrosoftNETCoreAppPackageVersion)</RuntimeDepsPackageVersion>
      <RuntimeDepsPackageFileName>dotnet-runtime-deps-$(RuntimeDepsPackageVersion)</RuntimeDepsPackageFileName>
      <RpmPackageVersion>$(SdkVersion)</RpmPackageVersion>
      <InputRoot>$(OutputDirectory)/sdk</InputRoot>
      <SdkInstallerFile>$(InstallerOutputDirectory)/$(DistroSpecificArtifactNameWithVersionCombinedHostHostFxrFrameworkSdk)$(InstallerExtension)</SdkInstallerFile>
      <RpmFile>$(SdkInstallerFile)</RpmFile>
      <ManPagesDir>$(RepoRoot)/Documentation/manpages</ManPagesDir>
      <ConfigJsonFile>$(RepoRoot)/packaging/rpm/dotnet-config.json</ConfigJsonFile>
      <RpmIntermediatesDir>$(IntermediateDirectory)/$(RpmPackageName)/$(RpmPackageVersion)</RpmIntermediatesDir>
      <RpmTestResultsXmlFile>$(RpmIntermediatesDir)/debian-testResults.xml</RpmTestResultsXmlFile>
      <RpmInstalledDirectory>/usr/share/dotnet</RpmInstalledDirectory>
    </PropertyGroup>

    <PropertyGroup>
      <RpmLayoutDirectory>$(RpmIntermediatesDir)/RpmLayoutDirectory/</RpmLayoutDirectory>
      <RpmLayoutPackageRoot>$(RpmLayoutDirectory)package_root</RpmLayoutPackageRoot>
      <RpmLayoutSDK>$(RpmLayoutPackageRoot)/sdk</RpmLayoutSDK>
      <RpmLayoutDocs>$(RpmLayoutDirectory)docs</RpmLayoutDocs>                <!-- Man Pages -->
      <RpmLayoutTemplates>$(RpmLayoutDirectory)templates</RpmLayoutTemplates> <!-- Copyright, Changelog -->
      <RpmLayoutScripts>$(RpmLayoutDirectory)scripts</RpmLayoutScripts>
    </PropertyGroup>

    <PropertyGroup>
      <SdkRpmPackageVersion>$(MajorMinorVersion)</SdkRpmPackageVersion>
      <SdkRpmPackageName>$(ArtifactNameCombinedHostHostFxrFrameworkSdk)-$(SdkRpmPackageVersion)</SdkRpmPackageName>
      <SharedFxRpmPackageVersion>$(MicrosoftNETCoreAppMajorMinorVersion)</SharedFxRpmPackageVersion>
      <SharedFxRpmPackageFileVersion>$(MicrosoftNETCoreAppPackageVersion)</SharedFxRpmPackageFileVersion>
      <SharedFxRpmPackageName>dotnet-runtime-$(SharedFxRpmPackageVersion)</SharedFxRpmPackageName>
      <SharedFxRpmPackageName>$(SharedFxRpmPackageName.ToLower())</SharedFxRpmPackageName>
      <SharedFxRpmPackageFileName>dotnet-runtime-$(SharedFxRpmPackageFileVersion)</SharedFxRpmPackageFileName>
      <SharedFxRpmPackageFileName>$(SharedFxRpmPackageFileName.ToLower())</SharedFxRpmPackageFileName>
      <HostFxrRpmPackageVersion>$(HostFxrVersion)</HostFxrRpmPackageVersion>
      <HostFxrRpmPackageName>dotnet-hostfxr-$(HostFxrRpmPackageVersion)</HostFxrRpmPackageName>
      <HostFxrRpmPackageName>$(HostFxrRpmPackageName.ToLower())</HostFxrRpmPackageName>
      <HostRpmPackageName>dotnet-host</HostRpmPackageName>
      <AspNetCoreSharedFxRpmPackageName>aspnetcore-runtime-$(AspNetCoreMajorMinorVersion)</AspNetCoreSharedFxRpmPackageName>
      <AspNetCoreSharedFxRpmPackageName>$(AspNetCoreSharedFxRpmPackageName.ToLower())</AspNetCoreSharedFxRpmPackageName>
      <AspNetCoreSharedFxRpmPackageFileName>aspnetcore-runtime-$(AspNetCoreVersion)</AspNetCoreSharedFxRpmPackageFileName>
      <AspNetCoreSharedFxRpmPackageFileName>$(AspNetCoreSharedFxRpmPackageFileName.ToLower())</AspNetCoreSharedFxRpmPackageFileName>
      <AfterInstallHostScriptTemplateFile>$(ScriptsDir)/$(AfterInstallHostScriptName)</AfterInstallHostScriptTemplateFile>
      <AfterInstallHostScriptDestinationFile>$(RpmLayoutScripts)/$(AfterInstallHostScriptName)</AfterInstallHostScriptDestinationFile>
    </PropertyGroup>

    <PropertyGroup>
      <EndToEndTestProject>$(RepoRoot)/test/EndToEnd/EndToEnd.csproj</EndToEndTestProject>
    </PropertyGroup>
  </Target>

  <Target Name="TestFPMTool">

    <!-- run FPM  -->
    <!-- NB: IgnoreExitCode prevents Exec from failing, but does not prevent us from retrieving the exit code. -->
    <Exec Command="fpm --help > /dev/null 2>&amp;1" IgnoreExitCode="True">
      <Output TaskParameter="ExitCode" PropertyName="FPMExitCode"/>
    </Exec>

    <!-- Check if it returned 0 -->
    <PropertyGroup>
      <FPMPresent>false</FPMPresent>
      <FPMPresent Condition=" '$(FPMExitCode)' == '0' ">True</FPMPresent>
    </PropertyGroup>

    <!-- Workaround for Jenkins machines that don't have the necessary packages https://github.com/dotnet/core-setup/issues/2260 -->
    <Message Condition=" '$(FPMPresent)' != 'True' "
             Text="FPM tool Not found, RPM packages will not be built."
             Importance="High"/>
  </Target>

  <Target Name="TestSdkRpm"
          DependsOnTargets="RestoreTests"
          Condition="  '$(CLIBUILD_SKIP_TESTS)' != 'true' and '$(IsRPMBasedDistro)' == 'True' and '$(FPMPresent)' == 'True' "
          Inputs="$(DownloadedSharedHostInstallerFile);
              $(DownloadedHostFxrInstallerFile);
              $(DownloadedSharedFrameworkInstallerFile);
              $(DownloadedAspNetCoreSharedFxInstallerFile);
              $(RpmTestResultsXmlFile);"
          Outputs="$(RpmTestResultsXmlFile)" >

    <!-- Install Dependencies and SDK Packages -->
    <Exec Command="sudo yum -y install $(DownloadedRuntimeDepsInstallerFile)" />
    <Exec Command="sudo yum -y install $(DownloadedSharedHostInstallerFile)" />
    <Exec Command="sudo yum -y install $(DownloadedHostFxrInstallerFile)" />
    <Exec Command="sudo yum -y install $(DownloadedSharedFrameworkInstallerFile)" />
    <!-- Ignore dependencies, which may have an incoherent dependency on dotnet-runtime -->
    <Exec Command="sudo rpm --install --nodeps $(DownloadedAspNetCoreSharedFxInstallerFile)" />

    <Exec Command="sudo yum -y install $(SdkInstallerFile)" />

    <!-- Run Tests -->
    <DotNetRestore ProjectPath="$(EndToEndTestProject)"
                   ToolPath="$(RpmInstalledDirectory)" />

    <DotNetTest ProjectPath="$(EndToEndTestProject)"
                EnvironmentVariables="@(TestSdkRpmTaskEnvironmentVariables)"
                ToolPath="$(RpmInstalledDirectory)" />

    <!-- Clean up Packages -->
    <Exec Command="sudo yum remove -y $(SdkRpmPackageName)" />
    <Exec Command="sudo yum remove -y $(AspNetCoreSharedFxRpmPackageFileName)" />
    <Exec Command="sudo yum remove -y $(SharedFxRpmPackageFileName)" />
    <Exec Command="sudo yum remove -y $(HostFxrRpmPackageName)" />
    <Exec Command="sudo yum remove -y $(HostRpmPackageName)" />
    <Exec Command="sudo yum remove -y $(RuntimeDepsPackageFileName)" />
  </Target>
</Project>
