using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SQLite.CodeFirst;
using System.Data.Entity.ModelConfiguration.Conventions;
using System.Data.Entity.Infrastructure.Interception;
using XdCxRhDW.Repostory.Model;
using System.IO;
using System.Data.Common;
using System.Data.Entity.Infrastructure;
using System.Reflection;
using System.Data.SQLite.EF6;
using System.Data.SQLite;
using System.Data.Entity.Core.Common;
using System.Data.Entity.Core.EntityClient;
using static System.Net.WebRequestMethods;
namespace XdCxRhDW.Repostory.EFContext
{
    /// 
    /// 基础表上下文(id为int)
    /// 
    public class RHDWContext: DbContext
    {
        public RHDWContext() : base("DbCon") //配置使用的连接名
        {
        }
       
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            this.Database.Log = msg =>
            {
            };
            modelBuilder.Conventions.Remove();
            modelBuilder.Configurations.AddFromAssembly(typeof(RHDWContext).Assembly);//自动加载SqliteConfiguration
            var sqliteConnectionInitializer = new SqliteCreateDatabaseIfNotExists(modelBuilder);
            Database.SetInitializer(sqliteConnectionInitializer); 
            DbInterception.Add(new SqliteInterceptor());//拦截器
            base.OnModelCreating(modelBuilder);
        }
        public DbSet TaskInfos { set; get; }
        public DbSet TxInfos { get; set; }
        public DbSet SatInfos { get; set; }
        public DbSet TargetInfos { get; set; }
        //public DbSet StationRes { get; set; }
        //public DbSet CxRes { get; set; }
        //public DbSet CgRes { get; set; }
        //public DbSet PosRes { get; set; }
        public DbSet SysSetings { get; set; }
    }
    /// 
    /// 分区表上下文(id为long)
    /// 
    //[DbConfigurationType(typeof(SqliteConfiguration))]
    public class RHDWPartContext : DbContext
    {
        public static RHDWPartContext GetContext(string dbFile)
        {
            var connectionString = $@"Data Source={dbFile}";
            SQLiteConnection con = new SQLiteConnection(connectionString);
            return new RHDWPartContext(con);
        }
        public static RHDWPartContext GetContext(DateTime partTime)
        {
            var connectionString = $@"Data Source=|DataDirectory|\DbPart\{partTime.Year}\{partTime:MMdd}.db";
            SQLiteConnection con = new SQLiteConnection(connectionString);
            return new RHDWPartContext(con);
        }
        private RHDWPartContext(DbConnection con)
        :base(con,true)
        { 
        }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            this.Database.Log = msg =>
            {
            };
            modelBuilder.Conventions.Remove();
            modelBuilder.Configurations.AddFromAssembly(typeof(RHDWPartContext).Assembly);
            var sqliteConnectionInitializer = new SqliteCreateDatabaseIfNotExists(modelBuilder);
            Database.SetInitializer(sqliteConnectionInitializer);
            DbInterception.Add(new SqliteInterceptor());//拦截器
            base.OnModelCreating(modelBuilder);
        }
        public DbSet XlInfos { set; get; }
        public DbSet StationRes { get; set; }
        public DbSet CxRes { get; set; }
        public DbSet CgRes { get; set; }
        public DbSet CgXgfRes { get; set; }
        public DbSet PosRes { get; set; }
    }
    public class SqliteConfiguration : DbConfiguration
    {
        public SqliteConfiguration()
        {
            SetProviderFactory("System.Data.SQLite", SQLiteFactory.Instance);
            SetProviderFactory("System.Data.SQLite.EF6", SQLiteProviderFactory.Instance);
            SetProviderServices("System.Data.SQLite", (DbProviderServices)SQLiteProviderFactory.Instance.GetService(typeof(DbProviderServices)));
        }
    }
}