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 DutyServices : BaseServices, IDutyServices
    {
        public DutyDAL dutyDAL { get; set; }

        /// <summary>
        /// 查询值班管理信息
        /// </summary>
        /// <param name="configuretView">查询条件实体</param>
        /// <param name="departmentID">负责部门/科室</param>
        /// <param name="campusID">校区ID</param>
        /// <param name="collegeID">学院ID</param>
        /// <param name="timesSegment">时间段</param>
        /// <param name="pageIndex">页码</param>
        /// <param name="pageSize">显示页数</param>
        /// <returns></returns>
      public  IGridResultSet<DutyView> GetDutyViewGrid(ConfiguretView configuretView, Guid? campusID, Guid? collegeID, Guid? departmentID, int? timesSegment, int pageIndex, int pageSize)
        {
            var query = dutyDAL.GetDutyQueryable(x => true);
            if (campusID.HasValue && campusID != Guid.Empty)
                query = query.Where(x => x.CampusID == campusID);
            if (collegeID.HasValue && collegeID != Guid.Empty)
                query = query.Where(x => x.CollegeID == collegeID);
            if (departmentID.HasValue && departmentID != Guid.Empty)
                query = query.Where(x => x.DepartmentID == departmentID);
            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)
                    .OrderBy(x => x.DutyTime).ThenBy(x => x.TimesSegment).ToGridResultSet<DutyView>(pageIndex, pageSize);
            return query.OrderBy(x => x.DutyTime).ThenBy(x => x.TimesSegment).ToGridResultSet<DutyView>(pageIndex, pageSize);
        }

        /// <summary>
        /// 查询值班管理信息
        /// </summary>
        /// <param name="configuretView">查询条件实体</param>
        /// <param name="departmentID">负责部门/科室</param>
        /// <param name="timesSegment">时间段</param>
        /// <returns></returns>
      public List<DutyView> GetDutyViewList(ConfiguretView configuretView, Guid? campusID, Guid? collegeID, Guid? departmentID, int? timesSegment)
        {
            var query = dutyDAL.GetDutyQueryable(x => true);
            if (campusID.HasValue && campusID != Guid.Empty)
                query = query.Where(x => x.CampusID == campusID);
            if (collegeID.HasValue && collegeID != Guid.Empty)
                query = query.Where(x => x.CollegeID == collegeID);
            if (departmentID.HasValue && departmentID != Guid.Empty)
                query = query.Where(x => x.DepartmentID == departmentID);
            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)
                    .OrderBy(x => x.DutyTime).ThenBy(x => x.TimesSegment).ToList();
            return query.OrderBy(x => x.DutyTime).ThenBy(x => x.TimesSegment).ToList();
        }

        /// <summary>
        /// 获取值班管理信息
        /// </summary>
        /// <param name="dutyID">主键ID</param>
        /// <returns></returns>
        public EM_duty GetDuty(Guid? dutyID)
        {
            //查询条件
            Expression<Func<EM_duty, bool>> expression = (x => x.RecordStatus > (int)SYS_STATUS.UNUSABLE);
            expression = (x => x.DutyID == dutyID);
            return dutyDAL.dutyRepository.GetSingle(expression);
        }

        /// <summary>
        /// 获取值班管理信息
        /// </summary>
        /// <param name="userID">值班人ID</param>
        /// <param name="dutyTime">值班日期</param>
        /// <param name="timesSegment">时间段</param>
        /// <param name="departmentID">负责部门/科室</param>
        /// <returns></returns>
        public EM_duty GetDuty(Guid userID, DateTime dutyTime, int timesSegment, Guid departmentID)
        {
            //查询条件
            Expression<Func<EM_duty, bool>> expression = (x => x.RecordStatus > (int)SYS_STATUS.UNUSABLE);
            expression = (x => x.UserID == userID && x.DutyTime == dutyTime && x.TimesSegment == timesSegment && x.DepartmentID == departmentID);
            return dutyDAL.dutyRepository.GetSingle(expression);
        }

        /// <summary>
        /// 获取值班管理信息
        /// </summary>
        /// <param name="dutyID">主键ID</param>
        /// <returns></returns>
        public DutyView GetDutyView(Guid? dutyID)
        {
            DutyView dutyView = new DutyView();
            if (dutyID.HasValue)
                dutyView = dutyDAL.GetDutyQueryable(x => true).Where(x => x.DutyID == dutyID).FirstOrDefault();
            return dutyView;
        }
        /// <summary>
        /// 添加
        /// </summary>
        /// <param name="duty">实体</param>
        /// <returns></returns>
        public bool DutyAdd(DutyView dutyView)
        {
            try
            {
                if (this.dutyDAL.dutyRepository
                       .GetList(x => x.RecordStatus > (int)SYS_STATUS.UNUSABLE
                       && x.UserID == dutyView.UserID && x.DutyTime == dutyView.DutyTime && 
                       x.TimesSegment == dutyView.TimesSegment && x.DepartmentID == dutyView.DepartmentID).Count() > 0)
                {
                    throw new Exception("值班人、值班日期、时间段、教研室必须唯一,请重新输入!");
                }
                EM_duty duty = new EM_duty();
                duty.DutyID = Guid.NewGuid();
                duty.UserID = dutyView.UserID.Value;
                duty.TimesSegment = dutyView.TimesSegment.Value;
                duty.DutyTime = dutyView.DutyTime;
                duty.StartHour = dutyView.StartHour;
                duty.StartMinutes = dutyView.StartMinutes;
                duty.EndHour = dutyView.EndHour;
                duty.EndMinutes = dutyView.EndMinutes;
                duty.Description = dutyView.Description;
                duty.DepartmentID = dutyView.DepartmentID;
                this.SetNewStatus(duty);

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

                throw;
            }
        }

        /// <summary>
        /// 修改
        /// </summary>
        /// <param name="duty">实体</param>
        /// <returns></returns>
        public bool DutyUpdate(DutyView dutyView)
        {
            try
            {
                if (this.dutyDAL.dutyRepository
                          .GetList(x => x.RecordStatus > (int)SYS_STATUS.UNUSABLE
                          && x.UserID == dutyView.UserID && x.DutyTime == dutyView.DutyTime &&
                          x.TimesSegment == dutyView.TimesSegment && x.DepartmentID == dutyView.DepartmentID 
                          && x.DutyID != dutyView.DutyID).Count() > 0)
                {
                    throw new Exception("值班人、值班日期、时间段、教研室必须唯一,请重新输入!");
                }
                var duty = GetDuty(dutyView.DutyID);
                if (duty == null)
                {
                    throw new Exception("保存失败,未能找到相对应的数据!");
                }
                duty.UserID = dutyView.UserID.Value;
                duty.TimesSegment = dutyView.TimesSegment.Value;
                duty.DutyTime = dutyView.DutyTime;
                duty.StartHour = dutyView.StartHour;
                duty.StartMinutes = dutyView.StartMinutes;
                duty.EndHour = dutyView.EndHour;
                duty.EndMinutes = dutyView.EndMinutes;
                duty.Description = dutyView.Description;
                duty.DepartmentID = dutyView.DepartmentID;
                this.SetModifyStatus(duty);
                UnitOfWork.Commit();
                return true;
            }
            catch (Exception)
            {

                throw;
            }
        }

        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="dutyIDs"></param>
        /// <returns></returns>
        public bool DutyDelete(List<Guid> dutyIDs)
        {
            try
            {
                UnitOfWork.Delete<EM_duty>(x => dutyIDs.Contains(x.DutyID));
                UnitOfWork.Commit();
                return true;
            }
            catch (Exception)
            {

                throw;
            }
        }

    }
}