using MoYu.DependencyInjection;
using SafeCampus.Application.Manager.DeepelephManager;
namespace SafeCampus.Web.Core;

/// <summary>
/// Web启动项配置
/// </summary>
[AppStartup(99)]
public class Startup : AppStartup
{
    public void ConfigureServices(IServiceCollection services)
    {
        //启动LoggingMonitor操作日志写入数据库组件
        services.AddComponent<LoggingMonitorComponent>();

        //认证组件
        services.AddComponent<AuthComponent>();
        //启动Web设置ConfigureServices组件
        services.AddComponent<WebSettingsComponent>();
        //gip压缩
        services.AddComponent<GzipCompressionComponent>();
        //定时任务
        //services.AddSchedule();
        //添加控制器相关
        services.AddControllers().AddNewtonsoftJson(options => //配置json
            {
                options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();// 首字母小写（驼峰样式）
                options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";// 时间格式化
                options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;// 忽略循环引用
            }).AddInjectWithUnifyResult<SafeCampusResultProvider>()//配置统一返回模型
            ;

        //Nginx代理的话获取真实IP
        services.Configure<ForwardedHeadersOptions>(options =>
        {
            options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
            //新增如下两行
            options.KnownNetworks.Clear();
            options.KnownProxies.Clear();
        });
        services.AddRemoteRequest();
        services.AddSignalR();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        //var isDevelopment = App.HostEnvironment.IsDevelopment();
        //var isProduction = App.HostEnvironment.IsProduction();
        if (env.IsProduction())
        {
            //启动执行消息订阅
            Scoped.Create((_, scope) =>
            {
                var deepeleph = scope.ServiceProvider.GetRequiredService<IDeepelephManager>();
                deepeleph.SubscribeAlarm();
                //deepeleph.SubscribersRoomCall();
                deepeleph.SubscriberAttendance();
            });
        }
        //启动Web设置Configure组件
        app.UseComponent<WebSettingsApplicationComponent>(env);

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            //启用gzip压缩
            app.UseResponseCompression();
        }
        // 启用HTTPS
        app.UseHttpsRedirection();

        // 添加状态码拦截中间件
        app.UseUnifyResultStatusCodes();

        app.UseStaticFiles();//静态文件访问配置

        //静态文件访问配置,暂时不开启
        // app.UseStaticFiles(new StaticFileOptions
        // {
        //     ServeUnknownFileTypes = true,
        //     FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "wwwroot")),//wwwroot相当于真实目录
        //     OnPrepareResponse = c =>
        //     {
        //         c.Context.Response.Headers.Add("Access-Control-Allow-Origin", "*");
        //         c.Context.Response.Headers.Append("Cache-Control", "public, max-age=604800");
        //     },
        //     RequestPath = new PathString("/files")//src相当于别名，为了安全
        // });
        app.UseRouting();//路由配置
        app.UseCorsAccessor();//跨域配置
        app.UseWebStatus();//网站开启状态
        app.UseAuthentication();//认证
        app.UseAuthorization();//授权
        app.UseInject(string.Empty);
        app.UseForwardedHeaders();//Nginx代理的话获取真实IP
        app.UseEndpoints(endpoints =>
        {
            // 注册集线器
            endpoints.MapHubs();

            endpoints.MapControllers();
        });
        var path = Path.Combine(Directory.GetCurrentDirectory(), "Files");
        if (!Directory.Exists(path))
        {
            Directory.CreateDirectory(path);
        }
        var alarmImg = Path.Combine(Directory.GetCurrentDirectory(), "Files","alarmImg");
        if (!Directory.Exists(alarmImg))
        {
            Directory.CreateDirectory(alarmImg);
        }
        var personImg = Path.Combine(Directory.GetCurrentDirectory(), "Files", "personImg");
        if (!Directory.Exists(personImg))
        {
            Directory.CreateDirectory(personImg);
        }
        var roomCallImg = Path.Combine(Directory.GetCurrentDirectory(), "Files", "roomCallImg");
        if (!Directory.Exists(roomCallImg))
        {
            Directory.CreateDirectory(roomCallImg);
        } 
        var attendanceImg = Path.Combine(Directory.GetCurrentDirectory(), "Files", "attendanceImg");
        if (!Directory.Exists(attendanceImg))
        {
            Directory.CreateDirectory(attendanceImg);
        }
        var cameraImg = Path.Combine(Directory.GetCurrentDirectory(), "Files", "cameraImg");
        if (!Directory.Exists(cameraImg))
        {
            Directory.CreateDirectory(cameraImg);
        }
        app.UseFileServer(new FileServerOptions()
        {
            FileProvider = new PhysicalFileProvider(path),
            RequestPath = new PathString("/Files"),
            EnableDirectoryBrowsing = true
        });
    }
}
