using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Learun.Application.AppMagager;
using Learun.Application.Base.SystemModule;
using Learun.Application.Excel;
using Learun.Application.TwoDevelopment.EducationalAdministration;
using Learun.Application.TwoDevelopment.LR_Desktop;
using Learun.Application.WorkFlow;
using Learun.DataBase;
using Learun.DataBase.Repository;
using Learun.Util;

namespace Quanjiang.DigitalScholl.DataSync
{
    public class MainService : RepositoryFactory
    {
        public async Task<(bool result, string errormessage)> CheckConnection(string connstring)
        {
            (bool result, string errormessage) objValueTuple = (false, "");
            try
            {
                var db = BaseRepository(connstring, DatabaseType.SqlServer);
                db.getDbConnection().Open();
                objValueTuple.result = true;
            }
            catch (Exception e)
            {
                objValueTuple.result = false;
                objValueTuple.errormessage = e.Message;
            }
            return objValueTuple;
        }

        public string BeginSync(List<FileInfo> list)
        {

            StringBuilder str = new StringBuilder();
            var stuList = this.BaseRepository("target").FindList<StuEnrollEntity>().ToList();

            foreach (var fileInfo in list)
            {
                foreach (var stuenroll in stuList)
                {
                    if (fileInfo.Name.Contains(stuenroll.IDCard) && fileInfo.Name.Contains(stuenroll.StuName))
                    {
                        stuenroll.Photo = Guid.NewGuid().ToString();
                        string filepath = $"D:/智慧校园系统/Publish20191031/Resource/System/{DateTime.Now.ToString("yyyyMMdd")}/{stuenroll.Photo}.jpg";
                        FileInfo fi = new FileInfo(fileInfo.FullName); //xx/xx/aa.rar
                        fi.MoveTo(filepath);
                        AnnexesFileEntity entity = new AnnexesFileEntity
                        {
                            F_Id = stuenroll.Photo,
                            F_FolderId = stuenroll.Photo,
                            F_FileName = stuenroll.Photo + ".jpg",
                            F_FilePath = filepath,
                            F_FileExtensions = ".jpg",
                            F_FileType = "jpg",

                        };
                        entity.Create();
                        this.BaseRepository("source").Insert(entity);
                        this.BaseRepository("target").Update(stuenroll);
                    }

                }

            }
            return str.ToString();
        }

        public string BeginSyncXiChang(List<FileInfo> list)
        {

            StringBuilder str = new StringBuilder();
            var stuList = this.BaseRepository("target").FindList<StuInfoFreshEntity>().ToList();

            foreach (var fileInfo in list)
            {
                foreach (var stuenroll in stuList)
                {
                    if (fileInfo.Name.Substring(0, 14).Equals(stuenroll.ksh))
                    {
                        stuenroll.Photo = Guid.NewGuid().ToString();
                        string filepath = $"D:/智慧校园系统/Publish1/Resource/System/{DateTime.Now.ToString("yyyyMMdd")}/{stuenroll.Photo}.jpg";
                        FileInfo fi = new FileInfo(fileInfo.FullName); //xx/xx/aa.rar
                        fi.MoveTo(filepath);
                        AnnexesFileEntity entity = new AnnexesFileEntity
                        {
                            F_Id = stuenroll.Photo,
                            F_FolderId = stuenroll.Photo,
                            F_FileName = stuenroll.Photo + ".jpg",
                            F_FilePath = filepath,
                            F_FileExtensions = ".jpg",
                            F_FileType = "jpg",

                        };
                        entity.Create();
                        this.BaseRepository("source").Insert(entity);
                        this.BaseRepository("target").Update(stuenroll);
                    }

                }

            }
            return str.ToString();

        }



        public async Task<bool> BeginSync(CheckedListBox.CheckedItemCollection ciItemCollection)
        {
            var sourcedb = BaseRepository("source").BeginTrans();
            var targetdb = BaseRepository("target").BeginTrans();
            try
            {
                if (ciItemCollection.Contains("数据字典"))
                {
                    //字典
                    var sourcedic = sourcedb.FindList<DataItemEntity>();
                    var targetdic = targetdb.FindList<DataItemEntity>();
                    foreach (var tItemEntity in sourcedic)
                    {
                        if (!targetdic.Any(m => m.F_ItemId == tItemEntity.F_ItemId))
                        {
                            targetdb.Insert<DataItemEntity>(tItemEntity);
                        }
                    }
                    //字典项
                    var sourcedicitem = sourcedb.FindList<DataItemDetailEntity>();
                    var targetdicitem = targetdb.FindList<DataItemDetailEntity>();
                    foreach (var tItemEntity in sourcedicitem)
                    {
                        if (!targetdicitem.Any(m => m.F_ItemDetailId == tItemEntity.F_ItemDetailId))
                        {
                            targetdb.Insert<DataItemDetailEntity>(tItemEntity);
                        }
                    }
                }
                if (ciItemCollection.Contains("数据源"))
                {
                    //数据源
                    var sourceds = sourcedb.FindList<DataSourceEntity>();
                    var targetds = targetdb.FindList<DataSourceEntity>();
                    foreach (var tItemEntity in sourceds)
                    {
                        if (!targetds.Any(m => m.F_Id == tItemEntity.F_Id))
                        {
                            targetdb.Insert<DataSourceEntity>(tItemEntity);
                        }
                    }
                }
                if (ciItemCollection.Contains("菜单"))
                {
                    //菜单
                    var sourcemenu = sourcedb.FindList<ModuleEntity>();
                    var targetmenu = targetdb.FindList<ModuleEntity>();
                    foreach (var tItemEntity in sourcemenu)
                    {
                        if (!targetmenu.Any(m => m.F_ModuleId == tItemEntity.F_ModuleId))
                        {
                            targetdb.Insert<ModuleEntity>(tItemEntity);
                        }
                    }
                    //按钮
                    var sourcebutton = sourcedb.FindList<ModuleButtonEntity>();
                    var targetbutton = targetdb.FindList<ModuleButtonEntity>();
                    foreach (var tItemEntity in sourcebutton)
                    {
                        if (!targetbutton.Any(m => m.F_ModuleButtonId == tItemEntity.F_ModuleButtonId))
                        {
                            targetdb.Insert<ModuleButtonEntity>(tItemEntity);
                        }
                    }
                    //列
                    var sourcecolumn = sourcedb.FindList<ModuleColumnEntity>();
                    var targetcolumn = targetdb.FindList<ModuleColumnEntity>();
                    foreach (var tItemEntity in sourcecolumn)
                    {
                        if (!targetcolumn.Any(m => m.F_ModuleColumnId == tItemEntity.F_ModuleColumnId))
                        {
                            targetdb.Insert<ModuleColumnEntity>(tItemEntity);
                        }
                    }
                    //form字段
                    var sourceform = sourcedb.FindList<ModuleFormEntity>();
                    var targetform = targetdb.FindList<ModuleFormEntity>();
                    foreach (var tItemEntity in sourceform)
                    {
                        if (!targetform.Any(m => m.F_ModuleFormId == tItemEntity.F_ModuleFormId))
                        {
                            targetdb.Insert<ModuleFormEntity>(tItemEntity);
                        }
                    }
                }
                if (ciItemCollection.Contains("工作流"))
                {
                    //工作流
                    var sourceflowinfo = sourcedb.FindList<NWFSchemeInfoEntity>();
                    var targetflowinfo = targetdb.FindList<NWFSchemeInfoEntity>();
                    foreach (var tItemEntity in sourceflowinfo)
                    {
                        if (!targetflowinfo.Any(m => m.F_Id == tItemEntity.F_Id))
                        {
                            targetdb.Insert<NWFSchemeInfoEntity>(tItemEntity);
                        }
                    }
                    var sourceflow = sourcedb.FindList<NWFSchemeEntity>();
                    var targetflow = targetdb.FindList<NWFSchemeEntity>();
                    foreach (var tItemEntity in sourceflow)
                    {
                        if (!targetflow.Any(m => m.F_Id == tItemEntity.F_Id))
                        {
                            targetdb.Insert<NWFSchemeEntity>(tItemEntity);
                        }
                    }
                    var sourceflowauth = sourcedb.FindList<NWFSchemeAuthEntity>();
                    var targetflowauth = targetdb.FindList<NWFSchemeAuthEntity>();
                    foreach (var tItemEntity in sourceflowauth)
                    {
                        if (!targetflowauth.Any(m => m.F_Id == tItemEntity.F_Id))
                        {
                            targetdb.Insert<NWFSchemeAuthEntity>(tItemEntity);
                        }
                    }
                }
                if (ciItemCollection.Contains("数据权限"))
                {
                    //LR_Base_Interface
                    var sourceinter = sourcedb.FindList<InterfaceEntity>();
                    var targetinter = targetdb.FindList<InterfaceEntity>();
                    foreach (var tItemEntity in sourceinter)
                    {
                        if (!targetinter.Any(m => m.F_Id == tItemEntity.F_Id))
                        {
                            targetdb.Insert<InterfaceEntity>(tItemEntity);
                        }
                    }
                }
                if (ciItemCollection.Contains("app菜单"))
                {
                    var sourceinter = sourcedb.FindList<FunctionEntity>();
                    var targetinter = targetdb.FindList<FunctionEntity>();
                    foreach (var tItemEntity in sourceinter)
                    {
                        if (!targetinter.Any(m => m.F_Id == tItemEntity.F_Id))
                        {
                            targetdb.Insert<FunctionEntity>(tItemEntity);
                        }
                    }
                }
                if (ciItemCollection.Contains("桌面主题"))
                {
                    //主题色块
                    var sourceinter = sourcedb.FindList<LR_Base_ThematicManagementEntity>();
                    var targetinter = targetdb.FindList<LR_Base_ThematicManagementEntity>();
                    foreach (var tItemEntity in sourceinter)
                    {
                        if (!targetinter.Any(m => m.ID == tItemEntity.ID))
                        {
                            targetdb.Insert<LR_Base_ThematicManagementEntity>(tItemEntity);
                        }
                    }
                    //登陆页配置
                    var sourceinter2 = sourcedb.FindList<LoginModelEntity>();
                    var targetinter2 = targetdb.FindList<LoginModelEntity>();
                    foreach (var tItemEntity in sourceinter2)
                    {
                        if (!targetinter2.Any(m => m.ID == tItemEntity.ID))
                        {
                            targetdb.Insert<LoginModelEntity>(tItemEntity);
                        }
                    }
                }
                if (ciItemCollection.Contains("开关显示控制"))
                {
                    var sourceinter = sourcedb.FindList<TeachSwitchEntity>();
                    var targetinter = targetdb.FindList<TeachSwitchEntity>();
                    foreach (var tItemEntity in sourceinter)
                    {
                        if (!targetinter.Any(m => m.ID == tItemEntity.ID))
                        {
                            targetdb.Insert<TeachSwitchEntity>(tItemEntity);
                        }
                    }
                }
                if (ciItemCollection.Contains("导入导出"))
                {
                    var sourceinter = sourcedb.FindList<ExcelExportEntity>();
                    var targetinter = targetdb.FindList<ExcelExportEntity>();
                    foreach (var tItemEntity in sourceinter)
                    {
                        if (!targetinter.Any(m => m.F_Id == tItemEntity.F_Id))
                        {
                            targetdb.Insert<ExcelExportEntity>(tItemEntity);
                        }
                    }
                    var sourceinter1 = sourcedb.FindList<ExcelImportEntity>();
                    var targetinter1 = targetdb.FindList<ExcelImportEntity>();
                    foreach (var tItemEntity in sourceinter1)
                    {
                        if (!targetinter1.Any(m => m.F_Id == tItemEntity.F_Id))
                        {
                            targetdb.Insert<ExcelImportEntity>(tItemEntity);
                        }
                        var sourceinter2 = sourcedb.FindList<ExcelImportFieldEntity>(m => m.F_ImportId == tItemEntity.F_Id);
                        var targetinter2 = targetdb.FindList<ExcelImportFieldEntity>(m => m.F_ImportId == tItemEntity.F_Id);
                        if (targetinter2 != null)
                        {
                            foreach (var sourcEntity in sourceinter2)
                            {
                                if (!targetinter2.Any(m => m.F_Id == sourcEntity.F_Id || m.F_ColName == sourcEntity.F_ColName))
                                {
                                    targetdb.Insert<ExcelImportFieldEntity>(sourcEntity);
                                }
                            }
                        }
                    }
                }
                targetdb.Commit();
                return true;
            }

            catch (Exception e)
            {
                targetdb.Rollback();
                MessageBox.Show(e.Message);
                return false;
            }

        }

        /// <summary>
        ///根据传入的name返回Repository
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public IRepository GetDataRepository(string name)
        {
            return BaseRepository(name);
        }

        /// <summary>
        /// 根据传入的dbstring和sql语句返回DataTable
        /// </summary>
        /// <param name="dbstring"></param>
        /// <param name="sql"></param>
        /// <returns></returns>
        public DataTable GetDataTableResult(string dbstring, string sql)
        {
            try
            {
                var db = BaseRepository(dbstring).BeginTrans();
                return db.FindTable(sql);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        /// <summary>
        /// 根据传入的dbstring和sql执行
        /// </summary>
        /// <param name="dbstring"></param>
        /// <param name="sql"></param>
        /// <returns></returns>
        public int Execute(string dbstring, string sql)
        {
            try
            {
                var db = BaseRepository(dbstring).BeginTrans();
                return db.ExecuteBySql(sql);
            }
            catch (Exception e)
            {
                throw e;
            }
        }
    }
}