// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using System.IO;
using Microsoft.DotNet.Cli.Utils;
using Microsoft.DotNet.TestFramework;
using Microsoft.DotNet.Tools.Test.Utilities;
using NuGet.Frameworks;

namespace Microsoft.DotNet.BindingRedirects.Tests
{
    public class TestSetupFixture : TestBase
    {
        private readonly NuGetFramework Framework = NuGet.Frameworks.FrameworkConstants.CommonFrameworks.Net46;
        private const string Config = "Debug";
        private const string AppWithConfig = "AppWithRedirectsAndConfig";
        private const string AppWithoutConfig = "AppWithRedirectsNoConfig";

        private string _Runtime = RuntimeEnvironmentRidExtensions.GetLegacyRestoreRuntimeIdentifier();
        private string _appWithConfigProjectRoot;
        private string _appWithoutConfigProjectRoot;
        private TestAssetInstance _testInstance;

        public string AppWithConfigProjectRoot { get { return _appWithConfigProjectRoot; } }
        public string AppWithoutConfigProjectRoot { get { return _appWithoutConfigProjectRoot; } }

        public TestSetupFixture()
        {
            _testInstance = TestAssets.Get("DesktopTestProjects", "BindingRedirectSample")
                .CreateInstance()
                .WithSourceFiles()
                .WithNuGetConfig(new RepoDirectoriesProvider().TestPackages);

            _appWithConfigProjectRoot = Setup(AppWithConfig);
            _appWithoutConfigProjectRoot = Setup(AppWithoutConfig);
        }

        private string Setup(string project)
        {
            string projectDir = Path.Combine(_testInstance.Root.FullName, project);
            string publishDir = Path.Combine(projectDir, "publish");

            new RestoreCommand()
                .WithWorkingDirectory(projectDir)
                .WithRuntime(_Runtime)
                .ExecuteWithCapturedOutput()
                .Should().Pass();

            new BuildCommand()
                .WithWorkingDirectory(projectDir)
                .WithFramework(Framework)
                .WithRuntime(_Runtime)
                .Execute()
                .Should().Pass();

            new PublishCommand()
                .WithWorkingDirectory(projectDir)
                .WithOutput(publishDir)
                .WithFramework(Framework)
                .WithRuntime(_Runtime)
                .Execute()
                .Should().Pass();

            return projectDir;
        }
    }
}