using Autofac;
using PlanTempus.Core.Database;
using PlanTempus.Core.Database.ConnectionFactory;

namespace PlanTempus.Database.ModuleRegistry
{

    public class DbPostgreSqlModule : Module
    {
        public required string ConnectionString { get; set; }

        protected override void Load(ContainerBuilder builder)
        {
            Insight.Database.Providers.PostgreSQL.PostgreSQLInsightDbProvider.RegisterProvider();
            Insight.Database.ColumnMapping.Tables.AddMapper(new SnakeCaseToPascalCaseMapper());
            builder.RegisterType<PostgresConnectionFactory>()
             .As<IDbConnectionFactory>()
             .WithParameter(new TypedParameter(typeof(string), ConnectionString))
             .SingleInstance();

            builder.RegisterType<SqlOperations>()
                .As<IDatabaseOperations>();
        }
    }

    public class SnakeCaseToPascalCaseMapper : Insight.Database.Mapping.IColumnMapper
    {
        public string MapColumn(Type type, System.Data.IDataReader reader, int column)
        {
            string databaseName = reader.GetName(column);

            var parts = databaseName.Split(['_'], StringSplitOptions.RemoveEmptyEntries);
            var pascalName = string.Concat(parts.Select(p =>
                p.Substring(0, 1).ToUpper() + p.Substring(1).ToLower()
            ));

            return pascalName;
        }
    }
}
