using Admin.Core.Common;
using Admin.Core.Extensions;
using Admin.Core.IRepository;
using Admin.Core.IService;
using Admin.Core.IService.ISys;
using Admin.Core.Model;
using Admin.Core.Repository;
using Admin.Core.Service;
using Admin.Core.Tasks;
using Aucma.Core.RunPlc;
using Aucma.Core.Scanner;
using Aucma.Core.ScannerGun;
using Autofac;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System.Text;

namespace Aucma.Core.CodeBinding
{
    /// <summary>
    /// Startup
    /// </summary>
    public class Startup
    {
        /// <summary>
        /// Startup
        /// </summary>
        /// <param name="configuration"></param>
        public Startup(IConfiguration configuration, IWebHostEnvironment env)
        {
            Configuration = configuration;
            Env = env;
        }

        /// <summary>
        /// IConfiguration
        /// </summary>
        public IConfiguration Configuration { get; }
        /// <summary>
        /// ������Ϣ������/����
        /// </summary>
        public IWebHostEnvironment Env { get; }

        /// <summary>
        /// This method gets called by the runtime. Use this method to add services to the container.
        /// </summary>
        /// <param name="services"></param>
        public void ConfigureServices(IServiceCollection services)
        {
            //Appsettings
            services.AddSingleton(new Appsettings(Configuration));
            //��־�ļ�Ŀ¼
            services.AddSingleton(new LogLock(Env.ContentRootPath));
            //Memory����
            services.AddMemoryCacheSetup();
            //Sqlsugar���ݿ�ģ�Ͳ�ѯ
            services.AddSqlsugarSetup();
            //AutoMapper
            services.AddAutoMapperSetup();

            //ע��ҵ�����
            AddServices(services);

            //ɨ����
            services.AddScannerSetup();
            // ɨ��ǹ
          //  services.AddScannerGunSetup();

            //�������
            services.AddJobSetup();
            //PLC
            services.AddPlcSetup();
            //֧�ֱ����ȫ ����:֧�� System.Text.Encoding.GetEncoding("GB2312")  System.Text.Encoding.GetEncoding("GB18030") 
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
        }


        /// <summary>
        /// ע����Program.CreateHostBuilder������Autofac���񹤳�
        /// </summary>
        /// <param name="builder"></param>
        public void ConfigureContainer(ContainerBuilder builder)
        {
            builder.RegisterModule(new AutofacModuleRegister());
            builder.RegisterModule<AutofacPropertityModuleReg>();
        }

        /// <summary>
        /// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        /// </summary>
        /// <param name="app"></param>
        /// <param name="env"></param>
        public void Configure(IApplicationBuilder app, IScannerService scannerService,  IRunPlcService runPlcService, ISysTasksQzService tasksQzService, ISchedulerCenter schedulerCenter)    // ISysTasksQzService tasksQzService, ISchedulerCenter schedulerCenter
        {
            // ʹ�þ�̬�ļ�
            app.UseStaticFiles();
            // Ȼ������Ȩ�м��
            //app.UseAuthorization();
            //����ɨ�����
            app.UseScannerMildd(scannerService);
            //����ɨ��ǹ����
        //    app.UseScannerGunMildd(scannerGunService);

            // ����QuartzNetJob���ȷ���
            app.UseQuartzJobMildd(tasksQzService, schedulerCenter);
            //PLC
            app.UsePlcMildd(runPlcService);
           
        }

        #region ע�����
        /// <summary>
        /// ע�����
        /// </summary>
        /// <param name="services"></param>
        private static void AddServices(IServiceCollection services)
        {
            #region ע�����
            //services.AddScoped<IEEquipmentCategoryServices, EEquipmentCategoryServices>();
            //services.AddScoped<IEEquipmentCategoryRepository, EEquipmentCategoryRepository>();
            //services.AddScoped<IBaseRepository<EEquipmentCategory>, BaseRepository<EEquipmentCategory>>();
            //services.AddSingleton<IBaseService<EEquipmentCategory>, BaseService<EEquipmentCategory>>();          
            #endregion

        }
        #endregion
    }
}