using AbstractShopBusinessLogic.BusinessLogics;
using AbstractShopBusinessLogic.OfficePackage;
using AbstractShopBusinessLogic.OfficePackage.Implements;
using AbstractShopContracts.BusinessLogicsContracts;
using AbstractShopContracts.StoragesContracts;
using AbstractShopDatabaseImplement.Implements;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using NLog.Extensions.Logging;

namespace AbstractShopView
{
    internal static class Program
    {
        private static ServiceProvider? _serviceProvider;
        public static ServiceProvider? ServiceProvider => _serviceProvider;

        /// <summary>
        ///  The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            // To customize application configuration such as set high DPI settings or default font,
            // see https://aka.ms/applicationconfiguration.
            ApplicationConfiguration.Initialize();
           // Application.Run(new Form1());
        }

		private static void ConfigureServices(ServiceCollection services)
		{
			services.AddLogging(option =>
			{
				option.SetMinimumLevel(LogLevel.Information);
				option.AddNLog("nlog.config");
			});
			services.AddTransient<IClientStorage, ClientStorage>();
			services.AddTransient<IComponentStorage, ComponentStorage>();
			services.AddTransient<IOrderStorage, OrderStorage>();
			services.AddTransient<IProductStorage, ProductStorage>();

			services.AddTransient<IClientLogic, ClientLogic>();
			services.AddTransient<IComponentLogic, ComponentLogic>();
			services.AddTransient<IOrderLogic, OrderLogic>();
			services.AddTransient<IProductLogic, ProductLogic>();
			services.AddTransient<IReportLogic, ReportLogic>();

			services.AddTransient<AbstractSaveToExcel, SaveToExcel>();
			services.AddTransient<AbstractSaveToWord, SaveToWord>();
			services.AddTransient<AbstractSaveToPdf, SaveToPdf>();

			services.AddTransient<FormMain>();
			services.AddTransient<FormClients>();
			services.AddTransient<FormComponent>();
			services.AddTransient<FormComponents>();
			services.AddTransient<FormCreateOrder>();
			services.AddTransient<FormProduct>();
			services.AddTransient<FormProductComponent>();
			services.AddTransient<FormReportProductComponents>();
			services.AddTransient<FormReportOrders>();
		}
	}
}