using System;
using System.Collections.Generic;
using System.Linq;

namespace BLL
{
    public static class APITrainingTaskService
    {
        #region 根据ProjectId、PersonId获取培训任务教材明细列表
        /// <summary>
        /// 根据ProjectId、PersonId获取培训任务教材明细列表
        /// </summary>
        /// <param name="projectId"></param>
        /// <param name="personId"></param>
        /// <param name="isRetakeCourse">是否重修:1:重修任务 、0:日常培训任务</param>
        /// <returns></returns>
        public static List<Model.TrainingTaskItem> getTrainingTaskListByProjectIdPersonId(string projectId, string personId, string isRetakeCourse)
        {
            using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
            {
                personId = PersonService.GetPersonIdByUserId(personId);
                var getDataLists = (from x in db.Training_Task
                                    join y in db.Training_Plan on x.PlanId equals y.PlanId
                                    where x.ProjectId == projectId && x.UserId == personId && y.States != "0"
                                    orderby x.TaskDate descending
                                    select new Model.TrainingTaskItem
                                    {
                                        TaskId = x.TaskId,
                                        PlanId = x.PlanId,
                                        PlanCode = y.PlanCode,
                                        PlanName = y.PlanName,
                                        TrainStartDate = string.Format("{0:yyyy-MM-dd HH:mm}", y.TrainStartDate),
                                        TeachAddress = y.TeachAddress,
                                        PersonId = x.UserId,
                                        PersonName = db.SitePerson_Person.FirstOrDefault(p => p.PersonId == x.UserId).PersonName,
                                        TaskDate = string.Format("{0:yyyy-MM-dd HH:mm}", x.TaskDate),
                                        TrainTypeName = db.Base_TrainType.FirstOrDefault(b => b.TrainTypeId == y.TrainTypeId).TrainTypeName,
                                        TrainLevelName = db.Base_TrainLevel.FirstOrDefault(b => b.TrainLevelId == y.TrainLevelId).TrainLevelName,
                                        PlanStatesName = y.States == "3" ? "已完成" : "培训中",
                                        TaskStatesName = x.States == "2" ? "已完成" : "培训中",
                                        TrainingItemCode = getTrainingItemCode(y.PlanId),
                                        IsRetakeCourse = y.IsRetakeCourse == 1 ? 1 : 0,
                                    }).ToList();
                if (!string.IsNullOrWhiteSpace(isRetakeCourse))
                {
                    getDataLists = getDataLists.Where(x => x.IsRetakeCourse == int.Parse(isRetakeCourse)).ToList();
                }
                return getDataLists;
            }
        }

        public static string getTrainingItemCode(string PlanId)
        {
            using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
            {
                var ids = db.Training_PlanItem.Where(xx => xx.PlanId == PlanId).Select(x => x.CompanyTrainingItemId).ToList();
                var codes = db.Training_CompanyTrainingItem.Where(x => ids.Contains(x.CompanyTrainingItemId)).Select(x => x.CompanyTrainingItemCode);
                string res = string.Join(",", codes);
                return res;
            }
        }

        #endregion

        #region 根据TaskId获取培训任务教材列表
        /// <summary>
        /// 根据TaskId获取培训任务列表
        /// </summary>
        /// <param name="taskId"></param>
        /// <returns></returns>
        public static List<Model.TrainingTaskItemItem> getTrainingTaskItemListByTaskId(string taskId)
        {
            using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
            {
                ////生成培训任务下培训明细
                GetDataService.CreateTrainingTaskItemByTaskId(taskId);

                var getDataLists = (from x in db.Training_TaskItem
                                    join y in db.Training_CompanyTrainingItem on x.TrainingItemCode equals y.CompanyTrainingItemCode into temp
                                    from y in temp.DefaultIfEmpty()
                                    where x.TaskId == taskId
                                    orderby x.TrainingItemCode
                                    select new Model.TrainingTaskItemItem
                                    {
                                        TaskItemId = x.TaskItemId,
                                        TaskId = x.TaskId,
                                        PlanId = x.PlanId,
                                        StartTime = x.StartTime,
                                        EndTime = x.EndTime,
                                        LearningTime = x.LearnTime,
                                        AttachTime = y.LearningTime,
                                        VideoProgress = x.VideoProgress,
                                        PersonId = x.PersonId,
                                        TrainingItemCode = x.TrainingItemCode,
                                        TrainingItemName = x.TrainingItemName,
                                        AttachUrl = x.AttachUrl.Replace('\\', '/'),
                                    }).ToList();
                return getDataLists;
            }
        }

        #endregion

        #region 根据ProjectId、PersonId获取培训任务列表

        /// <summary>
        /// 根据ProjectId、PersonId获取培训任务列表
        /// </summary>
        /// <param name="projectId"></param>
        /// <param name="personId"></param>
        /// <param name="isRetakeCourse"></param>
        /// <returns></returns>
        public static List<Model.TrainingRecordItemItem> getTrainingRecordItemListByProjectIdPersonId(string projectId, string personId, string isRetakeCourse)
        {
            using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
            {
                var getDataLists = (from x in db.Training_TaskItem
                                    join t in db.Training_Task on x.TaskId equals t.TaskId
                                    join p in db.Training_Plan on x.PlanId equals p.PlanId
                                    join y in db.Training_CompanyTrainingItem on x.TrainingItemCode equals y.CompanyTrainingItemCode into temp
                                    //join z in db.Training_CompanyTraining on y.CompanyTrainingId equals z.CompanyTrainingId into temp
                                    from y in temp.DefaultIfEmpty()
                                    where t.ProjectId == projectId && t.UserId == personId
                                    orderby x.TrainingItemCode
                                    select new Model.TrainingRecordItemItem
                                    {
                                        TaskItemId = x.TaskItemId,
                                        TaskId = x.TaskId,
                                        PlanId = x.PlanId,
                                        StartTime = x.StartTime,
                                        EndTime = x.EndTime,
                                        LearningTime = x.LearnTime ?? 0,
                                        AttachTime = y.LearningTime,
                                        VideoProgress = x.VideoProgress,
                                        PersonId = x.PersonId,
                                        TrainingItemCode = x.TrainingItemCode,
                                        TrainingItemName = x.TrainingItemName,
                                        AttachUrl = x.AttachUrl.Replace('\\', '/'),
                                        IsRetakeCourse = p.IsRetakeCourse == 1 ? 1 : 0,
                                    }).ToList();
                if (!string.IsNullOrWhiteSpace(isRetakeCourse))
                {
                    getDataLists = getDataLists.Where(x => x.IsRetakeCourse == int.Parse(isRetakeCourse)).ToList();
                }
                return getDataLists;
            }
        }

        #endregion

        #region 根据PlanId、PersonId将人员加入培训任务条件
        /// <summary>
        /// 根据PlanId、PersonId将人员加入培训任务条件
        /// </summary>
        /// <param name="planId">培训计划ID</param>
        /// <param name="personId">人员ID</param>
        /// <returns></returns>
        public static string getTrainingTaskByPlanIdPersonIdCondition(string planId, string personId)
        {
            string alterString = string.Empty;
            using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
            {
                var task = db.Training_Task.FirstOrDefault(x => x.PlanId == planId && x.UserId == personId);
                if (task != null)
                {
                    alterString = "人员已在培训任务中!";
                }
                else
                {
                    var plan = db.Training_Plan.FirstOrDefault(e => e.PlanId == planId);
                    if (plan != null)
                    {
                        if (plan.States != "0" && plan.States != "1")
                        {
                            alterString = "当前培训不能再加入人员!";
                        }
                        else
                        {
                            var person = db.SitePerson_Person.FirstOrDefault(e => e.PersonId == personId);
                            if (person != null && plan.ProjectId == person.ProjectId && plan.UnitIds.Contains(person.UnitId)
                                    && (string.IsNullOrEmpty(plan.WorkPostId) || plan.WorkPostId.Contains(person.WorkPostId)))
                            {
                                var trainType = db.Base_TrainType.FirstOrDefault(e => e.TrainTypeId == plan.TrainTypeId);
                                if (trainType != null)
                                {
                                    if (!trainType.IsRepeat.HasValue || trainType.IsRepeat == false)
                                    {
                                        var trainRecord = (from x in db.EduTrain_TrainRecord
                                                           join y in db.EduTrain_TrainRecordDetail on x.TrainingId equals y.TrainingId
                                                           where x.TrainTypeId == plan.TrainTypeId && x.ProjectId == person.ProjectId
                                                           && y.PersonId == personId && y.CheckResult == true
                                                           select x).FirstOrDefault();
                                        if (trainRecord != null)
                                        {
                                            alterString = "人员已参加过当前类型的培训!";
                                        }
                                        else
                                        {
                                            var getTask = (from x in db.Training_Plan
                                                           join y in db.Training_Task on x.PlanId equals y.PlanId
                                                           where x.TrainTypeId == plan.TrainTypeId && y.UserId == personId && x.States != "3"
                                                           select x).FirstOrDefault();
                                            if (getTask != null)
                                            {
                                                alterString = "人员已再同培训类型的培训中!";
                                            }
                                        }
                                    }
                                }
                                else
                                {
                                    alterString = "当前培训类型有问题!";
                                }
                            }
                            else
                            {
                                alterString = "人员与培训计划不匹配!";
                            }
                        }
                    }
                    else
                    {
                        alterString = "当前培训计划不允许再增加人员!";
                    }
                }
            }
            return alterString;
        }
        #endregion

        #region 根据PlanId、PersonId将人员加入培训任务
        /// <summary>
        /// 根据PlanId、PersonId将人员加入培训任务
        /// </summary>
        /// <param name="planId">培训计划ID</param>
        /// <param name="personId">人员ID</param>
        /// <returns></returns>
        public static void getTrainingTaskByPlanIdPersonId(string planId, string personId)
        {
            using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
            {
                var plan = db.Training_Plan.FirstOrDefault(e => e.PlanId == planId);
                Model.Training_Task newTask = new Model.Training_Task
                {
                    TaskId = SQLHelper.GetNewID(),
                    PlanId = planId,
                    UserId = personId,
                    TaskDate = DateTime.Now,
                    States = "0",
                };
                if (plan != null)
                {
                    newTask.ProjectId = plan.ProjectId;
                    db.Training_Task.InsertOnSubmit(newTask);
                    db.SubmitChanges();

                    ////生成培训任务下培训明细
                    GetDataService.CreateTrainingTaskItemByTaskId(newTask.TaskId);
                }
            }
        }
        #endregion

        #region 根据TrainingPlanId获取培训任务教材明细列表
        /// <summary>
        /// 根据TrainingPlanId获取培训任务教材明细列表
        /// </summary>
        /// <param name="trainingPlanId"></param>
        /// <returns>培训计划人员</returns>
        public static List<Model.TrainingTaskItem> getTrainingTaskListByTrainingPlanId(string trainingPlanId)
        {
            using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
            {
                var getDataLists = (from x in db.Training_Task
                                    where x.PlanId == trainingPlanId
                                    orderby x.TaskDate descending
                                    select new Model.TrainingTaskItem
                                    {
                                        TaskId = x.TaskId,
                                        PlanId = x.PlanId,
                                        PersonId = x.UserId,
                                        PersonName = db.SitePerson_Person.FirstOrDefault(p => p.PersonId == x.UserId).PersonName,
                                        TaskDate = string.Format("{0:yyyy-MM-dd HH:mm}", x.TaskDate),
                                        States = x.States,
                                    }).ToList();
                return getDataLists;
            }
        }
        #endregion




        #region 维护任务学习时长
        /// <summary>
        /// 维护任务学习时长
        /// </summary>
        /// <param name="taskItemId"></param>
        /// <param name="startTime"></param>
        /// <param name="endTime"></param>
        /// <param name="VideoProgress"></param>
        /// <returns></returns>
        public static Model.Training_TaskItem updateTaskItemLearnTime(string taskItemId, DateTime startTime, DateTime endTime, string VideoProgress)
        {
            using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
            {
                var q = from x in db.Training_TaskItem
                        where x.TaskItemId == taskItemId
                        select x;
                var item = q.FirstOrDefault();
                if (!item.StartTime.HasValue)
                {
                    item.StartTime = startTime;
                }

                if (!item.LearnTime.HasValue)
                {
                    item.LearnTime = 0;
                }
                if (!string.IsNullOrEmpty(VideoProgress))
                {
                    item.VideoProgress = int.Parse(VideoProgress);
                }
                var span = endTime.Subtract(startTime);
                item.LearnTime = item.LearnTime.Value + (int)span.TotalMinutes;
                item.EndTime = endTime;
                db.SubmitChanges();
                return item;
            }
        }
        #endregion
    }
}