using FluentValidation;
using MediatR;
using Microsoft.Extensions.DependencyInjection;
using System.Reflection;
using TakeoutSaaS.Application.App.Common.Behaviors;
using TakeoutSaaS.Application.App.Members.MessageReach.Services;
using TakeoutSaaS.Application.App.Personal.Services;
using TakeoutSaaS.Application.App.Personal.Validators;
using TakeoutSaaS.Application.App.Stores.Services;

namespace TakeoutSaaS.Application.App.Extensions;

/// <summary>
/// 业务应用层服务注册。
/// </summary>
public static class AppApplicationServiceCollectionExtensions
{
    /// <summary>
    /// 注册业务应用层（MediatR 处理器等）。
    /// </summary>
    /// <param name="services">服务集合。</param>
    /// <returns>服务集合。</returns>
    public static IServiceCollection AddAppApplication(this IServiceCollection services)
    {
        services.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly()));
        services.AddValidatorsFromAssembly(Assembly.GetExecutingAssembly());
        services.AddTransient(typeof(IPipelineBehavior<,>), typeof(ValidationBehavior<,>));

        // 1. 注册个人中心基础服务
        services.AddScoped<PersonalContextService>();
        services.AddSingleton<PersonalMaskingService>();
        services.AddSingleton<PersonalDateRangeValidator>();
        services.AddScoped<PersonalModuleStatusService>();
        services.AddScoped<PersonalAuditService>();

        // 2. 注册门店模块上下文服务
        services.AddScoped<StoreContextService>();

        // 3. (空行后) 注册会员消息触达服务
        services.AddScoped<IMemberMessageReachAppService, MemberMessageReachAppService>();

        return services;
    }
}
