using System.Collections.Generic;
using System.Linq;
using System;
namespace BLL
{
    public static class APIPageDataService
    {
        #region 获取当前人数
        /// 
        /// 获取当前人数
        /// 
        /// 项目ID
        /// 
        public static List getPersonNum(string projectId, DateTime dateValue)
        {
            using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
            {
                List getSiteInOutList = new List();
                var getDayAll = from x in db.SitePerson_PersonInOutNow
                                join y in db.SitePerson_Person on x.PersonId equals y.PersonId
                                join z in db.Base_WorkPost on y.WorkPostId equals z.WorkPostId
                                where x.ProjectId == projectId && x.ChangeTime.Value.Year == dateValue.Year && x.ChangeTime.Value.Month == dateValue.Month
                                && x.ChangeTime.Value.Day == dateValue.Day
                                select new { x.PersonId, x.ChangeTime, x.IsIn, z.PostType };
                if (getDayAll.Count() > 0)
                {
                    var getInMaxs = from x in getDayAll
                                    group x by x.PersonId into g
                                    select new Model.PageDataPersonInOutItem
                                    {
                                        PersonId = g.First().PersonId,
                                        ChangeTime = g.Max(x => x.ChangeTime),
                                        IsIn = g.First().IsIn,
                                        PostType = g.First().PostType
                                    };
                    if (getInMaxs.Count() > 0)
                    {
                        getSiteInOutList = getInMaxs.Where(x => x.IsIn == true).ToList();
                    }
                }
                return getSiteInOutList;
            }
        }
        #endregion
        #region 获取当前人工时
        /// 
        /// 获取当前人工时
        /// 
        /// 项目ID
        /// 
        public static int getSafeHours(string projectId)
        {
            using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
            {
                int safeHours = 0;
                var getPersonInOutNumber = db.SitePerson_PersonInOutNumber.FirstOrDefault(x => x.ProjectId == projectId && x.InOutDate.Year == DateTime.Now.Year
                     && x.InOutDate.Month == DateTime.Now.Month && x.InOutDate.Day == DateTime.Now.Day);
                if (getPersonInOutNumber != null)
                {                    //// 获取工时                        
                    safeHours = getPersonInOutNumber.WorkHours ?? 0;
                }
                else
                {
                    safeHours = getSafeWorkTime(projectId);
                }
                return safeHours;
            }
        }
        #endregion
        /// 
        ///  获取当前人工时
        /// 
        /// 
        public static int getSafeWorkTime(string projectId)
        {
            Model.SGGLDB db = Funs.DB;
            int SafeHours = 0;
            //// 查找当前项目 最新的人工时数量记录
            int getMaxWorkHours = db.SitePerson_PersonInOutNumber.Where(x => x.ProjectId == projectId).Max(x => x.WorkHours) ?? 0;
            var getAllPersonInOutList = from x in db.SitePerson_PersonInOutNow
                                        where x.ProjectId == projectId && x.ChangeTime.Value.Year == DateTime.Now.Year && x.ChangeTime.Value.Month == DateTime.Now.Month
                                        && x.ChangeTime.Value.Day == DateTime.Now.Day
                                        select x;
            var getPersonOutTimes = getAllPersonInOutList.Where(x => x.IsIn == false);
            var getInLists = getAllPersonInOutList.Where(x => x.IsIn == true);
            if (getPersonOutTimes.Count() > 0)
            {
                List personIdList = new List();
                foreach (var item in getPersonOutTimes)
                {
                    var getMaxInTime = getInLists.Where(x => x.ChangeTime < item.ChangeTime
                                && x.PersonId == item.PersonId && x.ChangeTime.Value.AddDays(1) >= item.ChangeTime).Max(x => x.ChangeTime);
                    if (getMaxInTime.HasValue)
                    {
                        SafeHours += Convert.ToInt32((item.ChangeTime - getMaxInTime).Value.TotalMinutes);
                    }
                    else
                    {
                        personIdList.Add(item.PersonId);
                    }
                }
                if (personIdList.Count() > 0)
                {
                    SafeHours += (personIdList.Distinct().Count() * 8 * 60);
                }
            }
            SafeHours = Convert.ToInt32((SafeHours) * 1.0 / 60) + getMaxWorkHours;
            return SafeHours;
        }
        #region 获取日进场人数
        /// 
        /// 获取当前人数
        /// 
        /// 项目ID
        /// 
        public static int getPersonInNowNum(string projectId, DateTime dateValue)
        {
            using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
            {
                var getDayAll = from x in db.SitePerson_PersonInOutNow
                                where x.ProjectId == projectId && x.ChangeTime.Value.Year == dateValue.Year && x.ChangeTime.Value.Month == dateValue.Month
                                && x.ChangeTime.Value.Day == dateValue.Day && x.IsIn == true
                                select x;
                return getDayAll.Select(x => x.PersonId).Distinct().Count(); ;
            }
        }
        #endregion
        #region 获取当前现场人数
        /// 
        /// 获取当前现场人数
        /// 
        /// 
        public static List getPersonNumByCompany(DateTime dateValue)
        {
            using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
            {
                List getSiteInOutList = new List();
                var getDayAll = from x in db.SitePerson_PersonInOutNow
                                join y in db.SitePerson_Person on x.PersonId equals y.PersonId
                                join z in db.Base_WorkPost on y.WorkPostId equals z.WorkPostId
                                where x.ChangeTime.Value.Year == dateValue.Year && x.ChangeTime.Value.Month == dateValue.Month
                                && x.ChangeTime.Value.Day == dateValue.Day
                                select new { x.PersonId, x.ChangeTime, x.IsIn, z.PostType };
                if (getDayAll.Count() > 0)
                {
                    var getInMaxs = from x in getDayAll
                                    group x by x.PersonId into g
                                    select new Model.PageDataPersonInOutItem
                                    {
                                        PersonId = g.First().PersonId,
                                        ChangeTime = g.Max(x => x.ChangeTime),
                                        IsIn = g.First().IsIn,
                                        PostType = g.First().PostType
                                    };
                    if (getInMaxs.Count() > 0)
                    {
                        getSiteInOutList = getInMaxs.Where(x => x.IsIn == true).ToList();
                    }
                }
                return getSiteInOutList;
            }
        }
        public static List getPersonNumByCompany(DateTime dateValue,string[] pids)
        {
            using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
            {
                List getSiteInOutList = new List();
                var getDayAll = from x in db.SitePerson_PersonInOutNow
                                join y in db.SitePerson_Person on x.PersonId equals y.PersonId
                                join z in db.Base_WorkPost on y.WorkPostId equals z.WorkPostId
                                where x.ChangeTime.Value.Year == dateValue.Year && x.ChangeTime.Value.Month == dateValue.Month
                                && x.ChangeTime.Value.Day == dateValue.Day && pids.Contains(x.ProjectId)
                                select new { x.PersonId, x.ChangeTime, x.IsIn, z.PostType };
                if (getDayAll.Count() > 0)
                {
                    var getInMaxs = from x in getDayAll
                                    group x by x.PersonId into g
                                    select new Model.PageDataPersonInOutItem
                                    {
                                        PersonId = g.First().PersonId,
                                        ChangeTime = g.Max(x => x.ChangeTime),
                                        IsIn = g.First().IsIn,
                                        PostType = g.First().PostType
                                    };
                    if (getInMaxs.Count() > 0)
                    {
                        getSiteInOutList = getInMaxs.Where(x => x.IsIn == true).ToList();
                    }
                }
                return getSiteInOutList;
            }
        }
        #endregion
    }
}