// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Build.BackEnd;
using Microsoft.Build.Shared;

namespace Microsoft.Build.Experimental.ProjectCache
{
    /// <summary>
    ///     A cache hit can use this to instruct MSBuild to build the cheaper version of the targets that the plugin avoided
    ///     running.
    ///     For example, GetTargetPath is the cheaper version of Build.
    ///
    ///     MSBuild will build the proxy targets and assign their target results to the real targets the mapping points to.
    ///     The proxy targets are left in the build result (i.e., both GetTargetPath and Build will appear in the build result).
    ///     Real targets can be committed in which case msbuild only keeps the proxy target in the build result.
    /// </summary>
    [Obsolete("This class was moved to Microsoft.Build.ProjectCache namespace")]
    public class ProxyTargets : ITranslatable
    {
        private Dictionary<string, string> _proxyTargetToRealTargetMap = null!;

        /// <summary>
        /// Mapping from proxy targets to real targets. Case insensitive.
        /// </summary>
        public IReadOnlyDictionary<string, string> ProxyTargetToRealTargetMap => _proxyTargetToRealTargetMap;

        private ProxyTargets()
        {
        }

        public ProxyTargets(IReadOnlyDictionary<string, string> proxyTargetToRealTargetMap)
        {
            ErrorUtilities.VerifyThrowArgumentLength(proxyTargetToRealTargetMap);

            _proxyTargetToRealTargetMap = proxyTargetToRealTargetMap.ToDictionary(kvp => kvp.Key, kvp => kvp.Value, StringComparer.OrdinalIgnoreCase);
        }

        void ITranslatable.Translate(ITranslator translator)
        {
            translator.TranslateDictionary(ref _proxyTargetToRealTargetMap, StringComparer.OrdinalIgnoreCase);
        }

        internal static ProxyTargets FactoryForDeserialization(ITranslator translator)
        {
            var instance = new ProxyTargets();
            ((ITranslatable)instance).Translate(translator);

            return instance;
        }
    }
}
