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.Socket;
using Admin.Core.Tasks;
using Aucma.Core.RunPlc;
using Aucma.Core.Scanner;
using Autofac;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System.Net.Sockets;
using System.Text;

namespace Aucma.Core.Palletiz
{
    /// <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.AddJobSetup();
            //ɨ����
           // services.AddScannerSetup();
            //PLC
            services.AddPlcSetup();
            //֧�ֱ����ȫ ����:֧�� System.Text.Encoding.GetEncoding("GB2312")  System.Text.Encoding.GetEncoding("GB18030") 
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

            //socket����ɨ����
            services.AddTouchSocketSetup();
        }


        /// <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, IRunPlcService runPlcService,ITouchSocketService socket)
        {
            // ʹ�þ�̬�ļ�
            app.UseStaticFiles();
            // Ȼ������Ȩ�м��
            //app.UseAuthorization();

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


            // Socket����ɨ����
            app.UseTouchSocketMildd(socket);
        }

        #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
    }
}