using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using EmitMapper;
using EmitMapper.MappingConfiguration;
namespace BLL
{
    public static class APITrainingPlanService
    {
        #region 根据projectId、trainTypeId、TrainStates获取培训计划列表
        /// 
        /// 根据projectId、trainTypeId、TrainStates获取培训计划列表
        /// 
        /// 
        /// 
        public static List getTrainingPlanListByProjectIdTrainTypeIdTrainStates(string projectId, string trainTypeId, string states)
        {
            using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
            {
                var getDataLists = (from x in db.Training_Plan
                                    where x.ProjectId == projectId && (x.States == states || states == null) && x.TrainTypeId == trainTypeId
                                    orderby x.TrainStartDate descending
                                    select new Model.TrainingPlanItem
                                    {
                                        PlanId = x.PlanId,
                                        PlanCode = x.PlanCode,
                                        PlanName = x.PlanName,
                                        ProjectId = x.ProjectId,
                                        TrainTypeId = x.TrainTypeId,
                                        TrainTypeName = db.Base_TrainType.First(y => y.TrainTypeId == x.TrainTypeId).TrainTypeName,
                                        TrainLevelId = x.TrainLevelId,
                                        TrainLevelName = db.Base_TrainLevel.First(y => y.TrainLevelId == x.TrainLevelId).TrainLevelName,
                                        DesignerName = db.Sys_User.First(y => y.UserId == x.DesignerId).UserName,
                                        DesignerId = x.DesignerId,
                                        DesignerDate = string.Format("{0:yyyy-MM-dd HH:mm}", x.DesignerDate),
                                        TeachHour = x.TeachHour ?? 0,
                                        TeachAddress = x.TeachAddress,
                                        TeachMan = x.TeachMan,
                                        TrainStartDate = string.Format("{0:yyyy-MM-dd HH:mm}", x.TrainStartDate),
                                        States = x.States,
                                        QRCodeUrl = x.QRCodeUrl.Replace('\\', '/'),
                                    }).ToList();
                return getDataLists;
            }
        }
        #endregion
        #region 根据培训ID获取培训计划详细
        /// 
        /// 根据培训ID获取培训计划详细
        /// 
        /// 
        /// 
        public static Model.TrainingPlanItem getTrainingPlanByTrainingId(string planId)
        {
            using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
            {
                var getDataLists = from x in db.Training_Plan
                                   where x.PlanId == planId
                                   select new Model.TrainingPlanItem
                                   {
                                       PlanId = x.PlanId,
                                       PlanCode = x.PlanCode,
                                       PlanName = x.PlanName,
                                       ProjectId = x.ProjectId,
                                       TrainTypeId = x.TrainTypeId,
                                       TrainTypeName = db.Base_TrainType.First(y => y.TrainTypeId == x.TrainTypeId).TrainTypeName,
                                       TrainLevelId = x.TrainLevelId,
                                       TrainLevelName = db.Base_TrainLevel.First(y => y.TrainLevelId == x.TrainLevelId).TrainLevelName,
                                       TeachHour = x.TeachHour ?? 0,
                                       TeachAddress = x.TeachAddress,
                                       TrainStartDate = string.Format("{0:yyyy-MM-dd HH:mm}", x.TrainStartDate),
                                       TeachMan = x.TeachMan,
                                       UnitIds = x.UnitIds,
                                       WorkPostId = x.WorkPostId,
                                       TrainContent = x.TrainContent,
                                       UnitNames = UnitService.getUnitNamesUnitIds(x.UnitIds),
                                       WorkPostNames = WorkPostService.getWorkPostNamesWorkPostIds(x.WorkPostId),
                                       DesignerId = x.DesignerId,
                                       DesignerName = db.Sys_User.First(y => y.UserId == x.DesignerId).UserName,
                                       DesignerDate = string.Format("{0:yyyy-MM-dd HH:mm}", x.TrainStartDate),
                                       States = x.States,
                                       QRCodeUrl = x.QRCodeUrl.Replace('\\', '/'),
                                   };
                return getDataLists.FirstOrDefault();
            }
        }
        #endregion
        #region 根据TrainingPlanId获取培训教材类型列表
        /// 
        /// 根据TrainingPlanId获取培训教材类型列表
        /// 
        /// 
        /// 培训计划人员
        public static List getTrainingPlanItemListByTrainingPlanId(string trainingPlanId)
        {
            using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
            {
                var getDataLists = (from x in db.Training_PlanItem
                                    join y in db.Training_CompanyTraining on x.CompanyTrainingId equals y.CompanyTrainingId
                                    join z in db.Training_CompanyTrainingItem on x.CompanyTrainingItemId equals z.CompanyTrainingItemId
                                    where x.PlanId == trainingPlanId
                                    orderby y.CompanyTrainingCode
                                    select new Model.TrainingPlanItemItem
                                    {
                                        PlanItemId = x.PlanItemId,
                                        PlanId = x.PlanId,
                                        CompanyTrainingId = x.CompanyTrainingId,
                                        CompanyTrainingName = y.CompanyTrainingName,
                                        CompanyTrainingCode = y.CompanyTrainingCode,
                                        CompanyTrainingItemId = x.CompanyTrainingItemId,
                                        CompanyTrainingItemCode = z.CompanyTrainingItemCode,
                                        CompanyTrainingItemName = z.CompanyTrainingItemName,
                                    }).ToList();
                return getDataLists;
            }
        }
        #endregion
        #region 保存培训计划
        /// 
        /// 保存TrainingPlan
        /// 
        /// 培训计划记录
        /// 培训人员list
        /// 培训教材类型list
        public static void SaveTrainingPlan(Model.TrainingPlanItem trainingPlan)
        {
            using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
            {
                Model.Training_Plan newTrainingPlan = new Model.Training_Plan
                {
                    PlanId = trainingPlan.PlanId,
                    PlanCode = trainingPlan.PlanCode,
                    ProjectId = trainingPlan.ProjectId,
                    DesignerId = trainingPlan.DesignerId,
                    PlanName = trainingPlan.PlanName,
                    TrainContent = trainingPlan.TrainContent,
                    TrainStartDate = Funs.GetNewDateTime(trainingPlan.TrainStartDate),
                    TeachHour = trainingPlan.TeachHour,
                    TeachMan = trainingPlan.TeachMan,
                    TeachAddress = trainingPlan.TeachAddress,
                    TrainTypeId = trainingPlan.TrainTypeId,
                    UnitIds = trainingPlan.UnitIds,
                    WorkPostId = trainingPlan.WorkPostId,
                    States = trainingPlan.States,
                };
                if (!string.IsNullOrEmpty(trainingPlan.TrainLevelId))
                {
                    newTrainingPlan.TrainLevelId = trainingPlan.TrainLevelId;
                }
                if (newTrainingPlan.TrainStartDate.HasValue && newTrainingPlan.TeachHour.HasValue)
                {
                    double dd = (double)((decimal)newTrainingPlan.TeachHour.Value);
                    newTrainingPlan.TrainEndDate = newTrainingPlan.TrainStartDate.Value.AddHours(dd);
                }
                List trainingTasks = trainingPlan.TrainingTasks;
                List trainingPlanItems = trainingPlan.TrainingPlanItems;
                var isUpdate = db.Training_Plan.FirstOrDefault(x => x.PlanId == newTrainingPlan.PlanId);
                if (isUpdate == null)
                {
                    newTrainingPlan.DesignerDate = DateTime.Now;
                    string unitId = string.Empty;
                    var user = UserService.GetUserByUserId(newTrainingPlan.DesignerId);
                    if (user != null)
                    {
                        unitId = user.UnitId;
                    }
                    newTrainingPlan.PlanCode = CodeRecordsService.ReturnCodeByMenuIdProjectId(Const.ProjectTrainingPlanMenuId, newTrainingPlan.ProjectId, unitId);
                    if (string.IsNullOrEmpty(newTrainingPlan.PlanId))
                    {
                        newTrainingPlan.PlanId = SQLHelper.GetNewID();
                    }
                    db.Training_Plan.InsertOnSubmit(newTrainingPlan);
                    db.SubmitChanges();
                    CodeRecordsService.InsertCodeRecordsByMenuIdProjectIdUnitId(Const.ProjectTrainingPlanMenuId, newTrainingPlan.ProjectId, null, newTrainingPlan.PlanId, newTrainingPlan.DesignerDate);
                }
                else
                {
                    if (newTrainingPlan.States == "0" || newTrainingPlan.States == "1")
                    {
                        isUpdate.PlanName = newTrainingPlan.PlanName;
                        isUpdate.TrainContent = newTrainingPlan.TrainContent;
                        isUpdate.TrainStartDate = newTrainingPlan.TrainStartDate;
                        isUpdate.TeachHour = newTrainingPlan.TeachHour;
                        isUpdate.TrainEndDate = newTrainingPlan.TrainEndDate;
                        isUpdate.TeachMan = newTrainingPlan.TeachMan;
                        isUpdate.TeachAddress = newTrainingPlan.TeachAddress;
                        isUpdate.TrainTypeId = newTrainingPlan.TrainTypeId;
                        isUpdate.TrainLevelId = newTrainingPlan.TrainLevelId;
                        isUpdate.UnitIds = newTrainingPlan.UnitIds;
                        isUpdate.WorkPostId = newTrainingPlan.WorkPostId;
                        isUpdate.States = newTrainingPlan.States;
                        db.SubmitChanges();
                    }
                    ////删除培训任务
                    var tasks = from x in db.Training_Task where x.PlanId == newTrainingPlan.PlanId select x;
                    if (tasks.Count() > 0)
                    {
                        var taskItems = from x in db.Training_TaskItem where x.PlanId == newTrainingPlan.PlanId select x;
                        if (tasks.Count() > 0)
                        {
                            db.Training_TaskItem.DeleteAllOnSubmit(taskItems);
                            db.SubmitChanges();
                        }
                        db.Training_Task.DeleteAllOnSubmit(tasks);
                        db.SubmitChanges();
                    }
                    ////删除培训教材类型
                    var planItem = (from x in db.Training_PlanItem where x.PlanId == newTrainingPlan.PlanId select x).ToList();
                    if (planItem.Count() > 0)
                    {
                        db.Training_PlanItem.DeleteAllOnSubmit(planItem);
                        db.SubmitChanges();
                    }
                }
                if (trainingTasks.Count() > 0)
                {
                    ////新增培训人员明细
                    foreach (var item in trainingTasks)
                    {
                        if (!string.IsNullOrEmpty(item.PersonId))
                        {
                            Model.Training_Task newTrainDetail = new Model.Training_Task
                            {
                                TaskId = SQLHelper.GetNewID(),
                                ProjectId = newTrainingPlan.ProjectId,
                                PlanId = newTrainingPlan.PlanId,
                                UserId = item.PersonId,
                                TaskDate = DateTime.Now,
                                States = Const.State_0, ////未生成培训教材明细
                            };
                            db.Training_Task.InsertOnSubmit(newTrainDetail);
                            db.SubmitChanges();
                        }
                    }
                }
                if (trainingPlanItems.Count() > 0)
                {
                    ////新增培训教材类型明细
                    foreach (var item in trainingPlanItems)
                    {
                        if (!string.IsNullOrEmpty(item.CompanyTrainingId) || !string.IsNullOrEmpty(item.CompanyTrainingItemId))
                        {
                            Model.Training_PlanItem newPlanItem = new Model.Training_PlanItem
                            {
                                PlanItemId = SQLHelper.GetNewID(),
                                PlanId = newTrainingPlan.PlanId,
                            };
                            if (!string.IsNullOrEmpty(item.CompanyTrainingId))
                            {
                                newPlanItem.CompanyTrainingId = item.CompanyTrainingId;
                            }
                            if (!string.IsNullOrEmpty(item.CompanyTrainingItemId))
                            {
                                newPlanItem.CompanyTrainingItemId = item.CompanyTrainingItemId;
                            }
                            db.Training_PlanItem.InsertOnSubmit(newPlanItem);
                            db.SubmitChanges();
                        }
                    }
                }
            }
        }
        /// 
        ///  新增 培训人员明细
        /// 
        public static void AddTraining_Task(List trainingTasks, string planId, string projectId)
        {
            using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
            {
                foreach (var item in trainingTasks)
                {
                    if (!string.IsNullOrEmpty(item.PersonId))
                    {
                        Model.Training_Task newTrainDetail = new Model.Training_Task
                        {
                            TaskId = SQLHelper.GetNewID(),
                            ProjectId = projectId,
                            PlanId = planId,
                            UserId = item.PersonId,
                            TaskDate = DateTime.Now,
                            States = Const.State_0, ////未生成培训教材明细
                        };
                        db.Training_Task.InsertOnSubmit(newTrainDetail);
                        db.SubmitChanges();
                    }
                }
            }
        }
        /// 
        ///  新增 培训教材类型 明细
        /// 
        public static void AddTraining_PlanItem(List trainingPlanItems, string planId)
        {
            using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
            {
                foreach (var item in trainingPlanItems)
            {
                    if (!string.IsNullOrEmpty(item.CompanyTrainingId) || !string.IsNullOrEmpty(item.CompanyTrainingItemId))
                    {
                        Model.Training_PlanItem newPlanItem = new Model.Training_PlanItem
                        {
                            PlanItemId = SQLHelper.GetNewID(),
                            PlanId = planId,
                        };
                        if (!string.IsNullOrEmpty(item.CompanyTrainingId))
                        {
                            newPlanItem.CompanyTrainingId = item.CompanyTrainingId;
                        }
                        if (!string.IsNullOrEmpty(item.CompanyTrainingItemId))
                        {
                            newPlanItem.CompanyTrainingItemId = item.CompanyTrainingItemId;
                        }
                        db.Training_PlanItem.InsertOnSubmit(newPlanItem);
                        db.SubmitChanges();
                    }
                }
            }
        }
        #endregion
    }
}