#nullable enable
using IPA.Config;
using IPA.Logging;
using System;

namespace IPA.AntiMalware
{
    /// <summary>
    /// Provides a way to access BSIPA's Anti-Malware engine.
    /// </summary>
    /// <see cref="Engine"/>
    /// <see cref="IAntiMalware"/>
    public static class AntiMalwareEngine
    {
        private static IAntiMalware? engine;

        /// <summary>
        /// Gets the current Anti-Malware engine. 
        /// </summary>
        public static IAntiMalware Engine => engine ?? throw new InvalidOperationException();

        internal static bool IsInitialized => engine != null;

        internal static void Initialize()
        {
            engine = CreateEngine();
        }

        private static IAntiMalware CreateEngine()
        {
            IAntiMalware? engine = null;
            if (SelfConfig.AntiMalware_.UseIfAvailable_)
            {
#if !NET35
                engine = WindowsCOMAntiMalware.TryInitialize();
#endif
                engine ??= WindowsWin32AntiMalware.TryInitialize();
            }
            engine ??= new NoopAntiMalware();

            Logger.AntiMalware.Debug($"Antimalware engine initialized with {engine.GetType()}");

            return engine;
        }
    }
}
