using Mono.Cecil;
using StardewModdingAPI.Framework.ModLoading.Framework;

namespace StardewModdingAPI.Framework.ModLoading.Finders
{
    /// <summary>Detects assembly references which will break in SMAPI 4.0.0.</summary>
    internal class LegacyAssemblyFinder : BaseInstructionHandler
    {
        /*********
        ** Public methods
        *********/
        /// <summary>Construct an instance.</summary>
        public LegacyAssemblyFinder()
            : base(defaultPhrase: "legacy assembly references") { }


        /// <inheritdoc />
        public override bool Handle(ModuleDefinition module)
        {
            foreach (AssemblyNameReference assembly in module.AssemblyReferences)
            {
                InstructionHandleResult flag = this.GetFlag(assembly);
                if (flag is InstructionHandleResult.None)
                    continue;

                this.MarkFlag(flag);
            }

            return false;
        }


        /*********
        ** Private methods
        *********/
        /// <summary>Get the instruction handle flag for the given assembly reference, if any.</summary>
        /// <param name="assemblyRef">The assembly reference.</param>
        private InstructionHandleResult GetFlag(AssemblyNameReference assemblyRef)
        {
            return assemblyRef.Name switch
            {
                "System.Configuration.ConfigurationManager" => InstructionHandleResult.DetectedLegacyConfigurationDll,
                "System.Runtime.Caching" => InstructionHandleResult.DetectedLegacyCachingDll,
                "System.Security.Permission" => InstructionHandleResult.DetectedLegacyPermissionsDll,
                _ => InstructionHandleResult.None
            };
        }
    }
}