using ProjectPatientAccounting.Repositories.Implementations;
using ProjectPatientAccounting.Repositories;
using Unity;
using Unity.Lifetime;
using Unity.Microsoft.Logging;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using Serilog;

namespace ProjectPatientAccounting;

internal static class Program
{
    /// <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(CreateContainer().Resolve<FormPolyclinic>());
    }

    private static IUnityContainer CreateContainer()
    {
        var container = new UnityContainer();
        container.AddExtension(new LoggingExtension(CreateLoggerFactory()));

        container.RegisterType<IDoctorRepository, DoctorRepository>();
        container.RegisterType<IMedicamentRepository, MedicamentRepository>();
        container.RegisterType<IPatientDiagnosisRepository, PatientDiagnosisRepository>();
        container.RegisterType<IPatientRepository, PatientRepository>();
        container.RegisterType<IReceptionRepository, ReceptionRepository>();
        container.RegisterType<IConnectionString, ConnectionString>(new SingletonLifetimeManager());

        return container;
    }

    private static LoggerFactory CreateLoggerFactory()
    {
        var loggerFactory = new LoggerFactory();
        loggerFactory.AddSerilog(new LoggerConfiguration()
        .ReadFrom.Configuration(new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json")
        .Build())
        .CreateLogger());
        return loggerFactory;
    }
}