using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using EMIS.DataLogic.Common.CalendarManage;
using Bowin.Common.Linq.Entity;
using EMIS.Entities;
using EMIS.ViewModel;
using System.Linq.Expressions;
using EMIS.ViewModel.CalendarManage;

namespace EMIS.CommonLogic.CalendarManage
{
    public class CoursesTimeServices : BaseServices, ICoursesTimeServices
    {
        public CoursesTimeDAL coursesTimeDAL { get; set; }
        public Lazy<ISchoolYearServices> SchoolYearServices { get; set; }
        /// <summary>
        /// 查询课程时间信息
        /// </summary>
        /// <param name="configuretView">查询条件实体</param>
        /// <param name="timesSegment">时间段</param>
        /// <param name="pageIndex">页码</param>
        /// <param name="pageSize">显示页数</param>
        /// <returns></returns>
        public IGridResultSet<CoursesTimeView> GetCoursesTimeViewGrid(ConfiguretView configuretView, int? timesSegment, int pageIndex, int pageSize)
        {
            var query = coursesTimeDAL.GetCoursesTimeQueryable(x => x.RecordStatus > (int)SYS_STATUS.UNUSABLE);
            if (timesSegment.HasValue && timesSegment != -1)
                query = query.Where(x => x.TimesSegment == timesSegment);

            if (!string.IsNullOrEmpty(configuretView.ConditionValue))
                return query.DynamicWhere(configuretView.Attribute, configuretView.Condition, configuretView.ConditionValue).OrderByDescending(x => x.CreateTime).ToGridResultSet<CoursesTimeView>(pageIndex, pageSize);
            return query.OrderBy(x => x.StartTimes).ToGridResultSet<CoursesTimeView>(pageIndex, pageSize);
        }

        /// <summary>
        /// 查询课程时间信息
        /// </summary>
        /// <param name="configuretView">查询条件实体</param>
        /// <param name="timesSegment">时间段</param>
        /// <returns></returns>
        public List<CoursesTimeView> GetCoursesTimeViewList(ConfiguretView configuretView, int? timesSegment)
        {
            var query = coursesTimeDAL.GetCoursesTimeQueryable(x => x.RecordStatus > (int)SYS_STATUS.UNUSABLE);
            if (timesSegment.HasValue && timesSegment != -1)
                query = query.Where(x => x.TimesSegment == timesSegment);

            if (!string.IsNullOrEmpty(configuretView.ConditionValue))
                return query.DynamicWhere(configuretView.Attribute, configuretView.Condition, configuretView.ConditionValue).OrderByDescending(x => x.CreateTime).ToList();
            return query.OrderBy(x => x.StartTimes).ToList();
        }

        /// <summary>
        /// 查询课程时间信息
        /// </summary>
        /// <param name="configuretView">查询条件实体</param>
        /// <param name="timesSegment">时间段</param>
        /// <returns></returns>
        public List<CoursesTimeView> GetCoursesTimeViewFutureList(int? weekNum, int? weekday)
        {
            var currentSchoolyear = this.SchoolYearServices.Value.GetCurrentSchoolYear();
            var query = coursesTimeDAL.GetCoursesTimeQueryable(x => x.RecordStatus > (int)SYS_STATUS.UNUSABLE);

            var result = query.OrderBy(x => x.StartTimes).ToList();

            result = result.Where(x => !this.SchoolYearServices.Value.IsTimePassed(currentSchoolyear, weekNum, weekday, x.StartHour, x.StartMinutes))
                .ToList();

            return result;
        }

        /// <summary>
        /// 获取课程时间信息
        /// </summary>
        /// <param name="coursesTimeID">主键ID</param>
        /// <returns></returns>
        public EM_CoursesTime GetCoursesTime(Guid? coursesTimeID)
        {
            //查询条件
            Expression<Func<EM_CoursesTime, bool>> expression = (x => x.RecordStatus > (int)SYS_STATUS.UNUSABLE);
            expression = (x => x.CoursesTimeID == coursesTimeID);
            return coursesTimeDAL.coursesTimeRepository.GetSingle(expression);
        }

        /// <summary>
        /// 获取下一堂课程时间信息
        /// </summary>
        /// <param name="coursesTimeID">主键ID</param>
        /// <returns></returns>
        public CoursesTimeView GetNextCoursesTime(Guid? coursesTimeID)
        {
            //查询条件
            Expression<Func<EM_CoursesTime, bool>> expression = (x => x.RecordStatus > (int)SYS_STATUS.UNUSABLE);
            expression = (x => x.CoursesTimeID == coursesTimeID);
            return coursesTimeDAL.GetNextCoursesTimeQueryable(expression).FirstOrDefault();
        }

        /// <summary>
        /// 获取课程时间信息
        /// </summary>
        /// <param name="coursesTimeID">主键ID</param>
        /// <returns></returns>
        public CoursesTimeView GetCoursesTimeView(Guid? coursesTimeID)
        {
            CoursesTimeView coursesTimeView = new CoursesTimeView();
            if (coursesTimeID.HasValue)
                coursesTimeView = coursesTimeDAL.GetCoursesTimeQueryable(x => true).Where(x => x.CoursesTimeID == coursesTimeID).FirstOrDefault();
            return coursesTimeView;
        }

        /// <summary>
        /// 添加
        /// </summary>
        /// <param name="coursesTime">实体</param>
        /// <returns></returns>
        public bool CoursesTimeAdd(CoursesTimeView coursesTimeView)
        {
            try
            {
                if (this.coursesTimeDAL.coursesTimeRepository
                       .GetList(x => x.EndTimes >= coursesTimeView.StartTimes && x.StartTimes <= coursesTimeView.EndTimes
                           && x.RecordStatus > (int)SYS_STATUS.UNUSABLE).Count() > 0)
                {
                    throw new Exception("节次已存在,请重新输入!");
                }
                EM_CoursesTime coursesTime = new EM_CoursesTime();
                coursesTime.CoursesTimeID = Guid.NewGuid();
                coursesTime.StartTimes = coursesTimeView.StartTimes.Value;
                coursesTime.EndTimes = coursesTimeView.EndTimes.Value;
                coursesTime.TimesSegment = coursesTimeView.TimesSegment.Value;
                coursesTime.StartHour = coursesTimeView.StartHour.Value;
                coursesTime.StartMinutes = coursesTimeView.StartMinutes.Value;
                coursesTime.EndHour = coursesTimeView.EndHour.Value;
                coursesTime.EndMinutes = coursesTimeView.EndMinutes.Value;
                this.SetNewStatus(coursesTime);

                UnitOfWork.Add(coursesTime);
                UnitOfWork.Commit();
                return true;
            }
            catch (Exception)
            {

                throw;
            }
        }

        /// <summary>
        /// 修改
        /// </summary>
        /// <param name="coursesTime">实体</param>
        /// <returns></returns>
        public bool CoursesTimeUpdate(CoursesTimeView coursesTimeView)
        {
            try
            {
                if (this.coursesTimeDAL.coursesTimeRepository
                       .GetList(x => x.EndTimes >= coursesTimeView.StartTimes && x.StartTimes <= coursesTimeView.EndTimes 
                           && x.RecordStatus > (int)SYS_STATUS.UNUSABLE 
                           && x.CoursesTimeID != coursesTimeView.CoursesTimeID).Count() > 0)
                {
                    throw new Exception("节次已存在,请重新输入!");
                }
                EM_CoursesTime coursesTime = GetCoursesTime(coursesTimeView.CoursesTimeID);

                if (coursesTime == null)
                {
                    throw new Exception("保存失败,未能找到相对应的数据!");
                }
                coursesTime.StartTimes = coursesTimeView.StartTimes.Value;
                coursesTime.EndTimes = coursesTimeView.EndTimes.Value;
                coursesTime.TimesSegment = coursesTimeView.TimesSegment.Value;
                coursesTime.StartHour = coursesTimeView.StartHour.Value;
                coursesTime.StartMinutes = coursesTimeView.StartMinutes.Value;
                coursesTime.EndHour = coursesTimeView.EndHour.Value;
                coursesTime.EndMinutes = coursesTimeView.EndMinutes.Value;
                this.SetModifyStatus(coursesTime);

                UnitOfWork.Update(coursesTime);
                UnitOfWork.Commit();
                return true;
            }
            catch (Exception)
            {

                throw;
            }
        }
        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="coursesTimeIDs"></param>
        /// <returns></returns>
        public bool CoursesTimeDelete(List<Guid> coursesTimeIDs)
        {
            try
            {
                UnitOfWork.Update<EM_CoursesTime>((x => new EM_CoursesTime { RecordStatus = (int)SYS_STATUS.UNUSABLE }), x => coursesTimeIDs.Contains(x.CoursesTimeID));
                return true;
            }
            catch (Exception)
            {

                throw;
            }
        }

    }
}