using Alipay.EasySDK.Factory;
using Alipay.EasySDK.Kernel;
using LifePayment.Application;
using LifePayment.Domain.Shared;
using LifePayment.EntityFrameworkCore;
using LifePayment.Worker.Worker;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Serilog;
using Volo.Abp;
using Volo.Abp.BackgroundWorkers;
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.Identity;
using Volo.Abp.IdentityServer.EntityFrameworkCore;
using Volo.Abp.Modularity;

namespace LifePayment.Worker
{
    [DependsOn(typeof(AbpBaseFrameworkModule))]
    [DependsOn(typeof(LifePaymentServicesApplicationModule),
               typeof(AbpEntityFrameworkCoreModule),
               typeof(AbpIdentityApplicationModule),
               typeof(AbpIdentityServerEntityFrameworkCoreModule),
               typeof(LifePaymentServicesEntityFrameworkCoreModule))]
    public class LifePaymentServicesWorkModule : AbpModule
    {
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            var configuration = context.Services.GetConfiguration();

            //Configure<AliYunSMSSettingOptions>(configuration.GetSection("AliYunSMSSetting"));
            context.Services.AddAutoMapperObjectMapper();
            ConfigurePays(context, configuration);
            Configure<AbpDbContextOptions>(options =>
            {
                options.UseSqlServer();
            });
            context.Services.AddLogging(c =>
            {
                c.AddSerilog();
                c.AddConsole().SetMinimumLevel(LogLevel.Warning);
            });

            this.Configure<OssSettings>(configuration.GetSection("ossSettings"));
            this.Configure<ACOOLYOption>(configuration.GetSection("ACOOLY"));
            this.Configure<Config>("AliPayEcsign", configuration.GetSection("AliPayEcsign"));
            this.Configure<InformationOption>(configuration.GetSection("WeiXinCgi"));
            this.Configure<InitSetting>(configuration.GetSection("InitSetting"));
        }

        public async override Task OnApplicationInitializationAsync(ApplicationInitializationContext context)
        {
            await context.AddBackgroundWorkerAsync<GetStaticsWorker>();
        }

        private void ConfigurePays(ServiceConfigurationContext context, IConfiguration configuration)
        {
            Configure<WxPayOption>(configuration.GetSection("WxPay"));
            context.Services.AddHttpClient(LifePaymentConstant.WxPayHttpClientName, config =>
            {
                config.Timeout = TimeSpan.FromSeconds(120);
                config.DefaultRequestHeaders.Add("Connection", "Keep-Alive");
                config.DefaultRequestHeaders.Add("User-Agent", "Aop4Net");
                config.DefaultRequestHeaders.Add("Accept", "application/json");
            });
            Configure<Config>(configuration.GetSection("AliPay"));
            PostConfigure<Config>(r => { Factory.SetOptions(r); });
        }
    }
}