using System;
using Jellyfin.Server.Implementations.ValueConverters;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;

namespace Jellyfin.Server.Implementations
{
    /// <summary>
    /// Model builder extensions.
    /// </summary>
    public static class ModelBuilderExtensions
    {
        /// <summary>
        /// Specify value converter for the object type.
        /// </summary>
        /// <param name="modelBuilder">The model builder.</param>
        /// <param name="converter">The <see cref="ValueConverter{TModel,TProvider}"/>.</param>
        /// <typeparam name="T">The type to convert.</typeparam>
        /// <returns>The modified <see cref="ModelBuilder"/>.</returns>
        public static ModelBuilder UseValueConverterForType<T>(this ModelBuilder modelBuilder, ValueConverter converter)
        {
            var type = typeof(T);
            foreach (var entityType in modelBuilder.Model.GetEntityTypes())
            {
                foreach (var property in entityType.GetProperties())
                {
                    if (property.ClrType == type)
                    {
                        property.SetValueConverter(converter);
                    }
                }
            }

            return modelBuilder;
        }

        /// <summary>
        /// Specify the default <see cref="DateTimeKind"/>.
        /// </summary>
        /// <param name="modelBuilder">The model builder to extend.</param>
        /// <param name="kind">The <see cref="DateTimeKind"/> to specify.</param>
        public static void SetDefaultDateTimeKind(this ModelBuilder modelBuilder, DateTimeKind kind)
        {
            modelBuilder.UseValueConverterForType<DateTime>(new DateTimeKindValueConverter(kind));
            modelBuilder.UseValueConverterForType<DateTime?>(new DateTimeKindValueConverter(kind));
        }
    }
}