using System;
using System.Collections.Generic;
using Kyoo.Controllers;
using Microsoft.AspNetCore.Hosting;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
namespace Kyoo.Postgresql
{
	/// 
	/// A module to add postgresql capacity to the app.
	/// 
	public class PostgresModule : IPlugin
	{
		/// 
		public string Slug => "postgresql";
		/// 
		public string Name => "Postgresql";
		/// 
		public string Description => "A database context for postgresql.";
		/// 
		public ICollection Provides => new[]
		{
			typeof(DatabaseContext)
		};
		/// 
		public ICollection ConditionalProvides => ArraySegment.Empty;
		/// 
		public ICollection Requires => ArraySegment.Empty;
		/// 
		/// The configuration to use. The database connection string is pulled from it.
		/// 
		private readonly IConfiguration _configuration;
		/// 
		/// The host environment to check if the app is in debug mode.
		/// 
		private readonly IWebHostEnvironment _environment;
		/// 
		/// Create a new postgres module instance and use the given configuration and environment.
		/// 
		/// The configuration to use
		/// The environment that will be used (if the env is in development mode, more information will be displayed on errors.
		public PostgresModule(IConfiguration configuration, IWebHostEnvironment env)
		{
			_configuration = configuration;
			_environment = env;
		}
		
		/// 
		public void Configure(IServiceCollection services, ICollection availableTypes)
		{
			services.AddDbContext(x =>
			{
				x.UseNpgsql(_configuration.GetDatabaseConnection("postgres"));
				if (_environment.IsDevelopment())
					x.EnableDetailedErrors().EnableSensitiveDataLogging();
			});
			// services.AddScoped(_ => new PostgresContext(
			// 	_configuration.GetDatabaseConnection("postgres"), 
			// 	_environment.IsDevelopment()));
			// services.AddScoped(x => x.GetRequiredService());
		}
		/// 
		public void Initialize(IServiceProvider provider)
		{
			DatabaseContext context = provider.GetRequiredService();
			context.Database.Migrate();
		}
	}
}