using System;
using System.Text;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using PortingAssistant.Client.Client.Reports;
using PortingAssistant.Client.Model;

namespace PortingAssistant.Client.Client
{
    public class PortingAssistantBuilder
    {

        private ServiceCollection ServiceCollection;
        private readonly IPortingAssistantClient PortingAssistantClient;
        private readonly IReportExporter ReportExporter;
        private readonly PortingAssistantConfiguration Configuration;
        private readonly Action<ILoggingBuilder> LogConfiguration;
        public IPortingAssistantClient GetPortingAssistant()
        {
            return PortingAssistantClient;
        }

        public IReportExporter GetReportExporter()
        {
            return ReportExporter;
        }

        private PortingAssistantBuilder(PortingAssistantConfiguration configuration, Action<ILoggingBuilder> logConfiguration)
        {
            this.LogConfiguration = logConfiguration;
            this.Configuration = configuration;
            ConfigureServices();
            var services = ServiceCollection.BuildServiceProvider();
            this.PortingAssistantClient = services.GetService<IPortingAssistantClient>();
            this.ReportExporter = services.GetService<IReportExporter>();
        }

        public static PortingAssistantBuilder Build(PortingAssistantConfiguration configuration, Action<ILoggingBuilder> logConfiguration = null)
        {
            if (logConfiguration == null)
            {
                logConfiguration = (config) => config.AddConsole();
            }
            return new PortingAssistantBuilder(configuration, logConfiguration);
        }

        private void ConfigureServices()
        {
            ServiceCollection = new ServiceCollection();
            ServiceCollection.AddLogging(LogConfiguration);
            ServiceCollection.AddAssessment(Configuration);
            ServiceCollection.AddSingleton<IReportExporter, ReportExporter>();
            ServiceCollection.AddOptions();
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
        }
    }

}