<?xml version='1.0'?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <PropertyGroup>
    <_ArtifactsDirectory>$([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)..\..\_artifacts'))</_ArtifactsDirectory>
    <_NuGetPackageOutputPath>$(_ArtifactsDirectory)\NuGetPackages\$(Configuration)</_NuGetPackageOutputPath>
    <_PackageVersionPropsFilePath>$(_NuGetPackageOutputPath)\Lucene.Net.CodeAnalysis.Dev.Version.props</_PackageVersionPropsFilePath>
    <!-- We install the analyzer package in a local directory so we don't pollute the
          .nuget cache on the dev machine with temporary builds -->
    <RestorePackagesPath>obj\LocalNuGetPackages</RestorePackagesPath>
    <_RestorePackagesPath>$(RestorePackagesPath)\lucene.net.codeanalsis.dev</_RestorePackagesPath>
  </PropertyGroup>

  <PropertyGroup Condition="Exists('$(_NuGetPackageOutputPath)')">
    <RestoreSources>$(RestoreSources);$(_NuGetPackageOutputPath)</RestoreSources>
  </PropertyGroup>

  <PropertyGroup>
    <RestoreSources>$(RestoreSources);https://api.nuget.org/v3/index.json</RestoreSources>
  </PropertyGroup>

  <PropertyGroup>
    <!-- Visual Studio blocks MSBuild from being able to check whether files are up-to-date.
          So, we disable that here to gain access to that info. -->
    <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
  </PropertyGroup>

  <Import Project="$(_PackageVersionPropsFilePath)" Condition="Exists('$(_PackageVersionPropsFilePath)')"/>

  <ItemGroup Condition="Exists('$(_PackageVersionPropsFilePath)')">
    <PackageReference Include="Lucene.Net.CodeAnalysis.Dev" VersionOverride="$(_CodeAnalysisPackageVersion)" />
  </ItemGroup>

  <Target Name="EnsureNuGetPackageBuilt" BeforeTargets="PrepareForBuild" Condition="'$(DesignTimeBuild)' != 'true'">

    <Message Importance="high" Text="Running NuGet Package Build..." />

    <!-- Build the project that produces the NuGet package -->
    <MSBuild
      Projects="..\Lucene.Net.CodeAnalysis.Dev.Package\Lucene.Net.CodeAnalysis.Dev.Package.csproj"
      Targets="Restore;PrepareForBuild;Build"
      Properties="Configuration=$(Configuration)"
    />

    <!-- Since we may be continually using the last build number (unless a commit occured),
          we need to clear the project local NuGet cache. -->
    <ForceDeleteDirectory DirectoryPath="$(_RestorePackagesPath)" />

    <!-- Restore again, now that the .nupkg should exist -->
    <MSBuild
      Projects="$(MSBuildProjectFullPath)"
      Targets="Restore"
      Properties="Configuration=$(Configuration)" />
  </Target>

  <Target Name="CleanRestorePackagesPath" AfterTargets="Clean" Condition="'$(DesignTimeBuild)' != 'true'">
    <ForceDeleteDirectory DirectoryPath="$(_RestorePackagesPath)" />
  </Target>

  <UsingTask
    TaskName="ForceDeleteDirectory"
    TaskFactory="RoslynCodeTaskFactory"
    AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll">
    <ParameterGroup>
      <DirectoryPath ParameterType="System.String" Required="true" />
    </ParameterGroup>
    <Task>
      <Using Namespace="System" />
      <Using Namespace="System.IO" />
      <Code Type="Fragment" Language="cs">
        <![CDATA[
        try
        {
            if (Directory.Exists(DirectoryPath))
            {
                Directory.Delete(DirectoryPath, recursive: true);
            }
        }
        catch (Exception ex)
        {
            // Swallow all exceptions unless MSBuild wants you to fail
            Log.LogMessage(MessageImportance.Low, $"Failed to delete directory '{DirectoryPath}': {ex.Message}");
        }
      ]]>
      </Code>
    </Task>
  </UsingTask>

</Project>
