using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Linq;
using System.Text;

namespace BLL
{
    /// <summary>
    /// 人工时计划
    /// </summary>
    public class PlanService
    {
        /// <summary>
        /// 根据主键获取人工时计划
        /// </summary>
        /// <param name="planId"></param>
        /// <returns></returns>
        public static Model.View_NewManHours_Plan GetPlanById(string planId)
        {
            return Funs.DB.View_NewManHours_Plan.FirstOrDefault(e => e.ManHoursPlanId == planId);
        }

        public static Model.ManHours_Plan GetPlanByIds(string planId)
        {
            return Funs.DB.ManHours_Plan.FirstOrDefault(e => e.ManHoursPlanId == planId);
        }

        public static Model.ManHours_Plan GetPlanByIds(string resourcePlanId, string DisciplineId)
        {
            return Funs.DB.ManHours_Plan.FirstOrDefault(e => e.ResourcePlanId == resourcePlanId && e.DisciplineId == DisciplineId);
        }

        /// <summary>
        /// 视图
        /// </summary>
        /// <param name="planId"></param>
        /// <returns></returns>
        public static Model.View_ManHours_Plan GetManHoursPlan(string UserId)
        {
            return Funs.DB.View_ManHours_Plan.FirstOrDefault(e => e.EngineerId == UserId);
        }

        /// <summary>
        /// 视图
        /// </summary>
        /// <param name="planId"></param>
        /// <returns></returns>
        public static Model.View_ManHours_Plan GetManHoursPlan1(string EProjectId, string EngineerId)
        {
            return Funs.DB.View_ManHours_Plan.FirstOrDefault(e => e.EProjectId == EProjectId && e.EngineerId == EngineerId);
        }

        /// <summary>
        /// 增加
        /// </summary>
        /// <param name="plan"></param>
        public static void AddPlan(Model.ManHours_Plan plan)
        {
            Model.ManHours_Plan newPlan = new Model.ManHours_Plan();
            newPlan.ManHoursPlanId = plan.ManHoursPlanId;
            newPlan.ResourcePlanId = plan.ResourcePlanId;
            newPlan.EProjectId = plan.EProjectId;
            newPlan.EngineerId = plan.EngineerId;
            newPlan.EngineerName = plan.EngineerName;
            newPlan.Account = plan.Account;
            newPlan.DisciplineId = plan.DisciplineId;
            newPlan.Discipline = plan.Discipline;
            newPlan.Roles = plan.Roles;
            newPlan.ManHours = plan.ManHours;
            newPlan.AccountDisabled = plan.AccountDisabled;
            newPlan.IsClose = plan.IsClose;
            Funs.DB.ManHours_Plan.InsertOnSubmit(newPlan);
            Funs.DB.SubmitChanges();
        }

        /// <summary>
        /// 修改
        /// </summary>
        /// <param name="plan"></param>
        public static void UpdatePlan(Model.ManHours_Plan plan)
        {
            Model.ManHours_Plan newPlan = Funs.DB.ManHours_Plan.FirstOrDefault(e => e.ManHoursPlanId == plan.ManHoursPlanId);
            if (newPlan != null)
            {
                newPlan.EngineerId = plan.EngineerId;
                newPlan.EngineerName = plan.EngineerName;
                newPlan.Account = plan.Account;
                newPlan.DisciplineId = plan.DisciplineId;
                newPlan.Discipline = plan.Discipline;
                newPlan.ManHours = plan.ManHours;
                newPlan.AccountDisabled = plan.AccountDisabled;
                Funs.DB.SubmitChanges();
            }
        }

        /// <summary>
        /// 修改人工时计划的Account
        /// </summary>
        /// <param name="manHoursPlanId"></param>
        /// <param name="account"></param>
        public static void UpdateManHourPlanAccount(string manHoursPlanId, string account)
        {
            Model.ManHours_Plan updatePlan = Funs.DB.ManHours_Plan.FirstOrDefault(e => e.ManHoursPlanId == manHoursPlanId);
            if (updatePlan != null)
            {
                updatePlan.Account = account;
                Funs.DB.SubmitChanges();
            }
        }

        public static void UpdateManHourPlanAccountDisabled(string resourcePlanId, int? accountDisabled)
        {
            var updatePlan = Funs.DB.ManHours_Plan.Where(e => e.ResourcePlanId == resourcePlanId);
            if (updatePlan != null)
            {
                foreach (var p in updatePlan)
                {
                    p.AccountDisabled = accountDisabled;
                }
                Funs.DB.SubmitChanges();
            }
        }

        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="manHoursPlanId"></param>
        /// <param name="eProjectId"></param>
        public static void DeletePlan(string manHoursPlanId, string eProjectId)
        {
            Model.ManHours_Plan plan = Funs.DB.ManHours_Plan.FirstOrDefault(e => e.ManHoursPlanId == manHoursPlanId && e.EProjectId == eProjectId);
            if (plan != null)
            {
                Funs.DB.ManHours_Plan.DeleteOnSubmit(plan);
                Funs.DB.SubmitChanges();
            }
        }

        /// <summary>
        /// 根据主键删除计划人工时
        /// </summary>
        /// <param name="manHoursPlanId"></param>
        public static void DeletePlanById(string manHoursPlanId)
        {
            Model.EProjectDB db = Funs.DB;
            var manHours = db.ManHours_Plan.FirstOrDefault(e => e.ManHoursPlanId == manHoursPlanId);
            if (manHours != null)
            {
                var planDetail = db.ManHours_PlanDetail.Where(e => e.PlanManHoursId == manHoursPlanId);
                if (planDetail != null && planDetail.Count() > 0)
                {
                    db.ManHours_PlanDetail.DeleteAllOnSubmit(planDetail);
                }

                var act = db.ManHours_Actual.Where(e => e.ManHoursPlanId == manHoursPlanId);
                if (act != null && act.Count() > 0)
                {
                    db.ManHours_Actual.DeleteAllOnSubmit(act);
                }

                db.ManHours_Plan.DeleteOnSubmit(manHours);
                db.SubmitChanges();
            }
        }

        /// <summary>
        /// 增加实际
        /// </summary>
        /// <param name="plan"></param>
        public static bool AddActualList(List<Model.ManHours_Actual> list)
        {
            bool result = false;
            try
            {
                Funs.DB.ManHours_Actual.InsertAllOnSubmit(list);
                Funs.DB.SubmitChanges();
                result = true;
            }
            catch
            {
                result = false;
            }
            return result;
        }


        /// <summary>
        /// 事物提交
        /// </summary>
        /// <param name="model"></param>
        /// <param name="PlanDetailList"></param>
        /// <param name="ManHoursPlanList"></param>
        /// <returns></returns>
        public static bool AddTran(string UserId, List<Model.ManHours_Actual> list, string month)
        {
            Model.EProjectDB db = Funs.DB;
            bool result = false;
            db.Connection.Close();
            db.Connection.Open();
            db.CommandTimeout = 30000;
            using (DbTransaction tran = db.Connection.BeginTransaction())
            {
                db.Transaction = tran;
                try
                {
                    if (UserId != "")
                    {
                        var actualList = (from x in db.ManHours_Actual where x.UserId == UserId && x.ManHoursDate == month select x).ToList();
                        if (actualList != null && actualList.Count > 0)
                        {
                            db.ManHours_Actual.DeleteAllOnSubmit(actualList);
                            db.SubmitChanges();
                        }
                        if (list != null && list.Count() > 0)
                        {
                            db.ManHours_Actual.InsertAllOnSubmit(list);
                            db.SubmitChanges();
                        }

                        tran.Commit();
                        result = true;
                    }
                }
                catch
                {
                    tran.Rollback();//回滚事务
                    result = false;
                }
            }
            db.Connection.Close();
            return result;
        }
    


        /// <summary>
        /// 
        /// </summary>
        /// <param name="PlanManHoursList"></param>
        /// <param name="PlanDetailList"></param>
        /// <returns></returns>
        public static bool AddTranManHours(List<Model.ManHours_PlanManHours> PlanManHoursList, List<Model.ManHours_PlanDetail> PlanDetailList)
        {
            bool result = false;
            Funs.DB.Connection.Close();
            Funs.DB.Connection.Open();
            Funs.DB.CommandTimeout = 30000;
            using (DbTransaction tran = Funs.DB.Connection.BeginTransaction())
            {
                Funs.DB.Transaction = tran;
                try
                {
                    if (PlanManHoursList != null && PlanManHoursList.Count > 0)
                        Funs.DB.ManHours_PlanManHours.InsertAllOnSubmit(PlanManHoursList);
                    for (int i = 0; i < PlanManHoursList.Count; i++)
                    {
                        if (PlanDetailList != null)
                        {
                            var query1 = (from x in Funs.DB.ManHours_PlanDetail where x.EProjectId == PlanManHoursList[i].EprojectId && x.UserId == PlanManHoursList[i].UserId orderby x.DateMonth select x).ToList();
                            if (query1 != null && query1.Count > 0)
                            {
                                for (int l = 0; l < query1.Count; l++)
                                {
                                    var d = query1.Where(n => n.DateMonth == PlanDetailList[l].DateMonth).ToList();
                                    if (d != null && d.Count > 0)
                                    {
                                        if (d[0].DateMonth == PlanDetailList[l].DateMonth)
                                        {
                                            //query1[l].DateMonth = PlanDetailList[l].DateMonth;
                                            query1[l].Hour = PlanDetailList[l].Hour;
                                            Funs.DB.SubmitChanges();
                                        }
                                    }
                                    else
                                    {
                                        Model.ManHours_PlanDetail dd = new Model.ManHours_PlanDetail();
                                        dd.ManHoursPlanDetailId = Guid.NewGuid().ToString();
                                        dd.EProjectId = PlanManHoursList[i].EprojectId;
                                        dd.UserId = PlanManHoursList[i].UserId;
                                        dd.PlanManHoursId = PlanManHoursList[i].PlanManHoursId;
                                        dd.DateMonth = PlanDetailList[l].DateMonth;
                                        dd.Hour = PlanDetailList[l].Hour;
                                        Funs.DB.ManHours_PlanDetail.InsertOnSubmit(dd);
                                    }
                                }
                            }
                            else
                            {
                                if (PlanDetailList != null && PlanDetailList.Count > 0)
                                    Funs.DB.ManHours_PlanDetail.InsertAllOnSubmit(PlanDetailList);
                            }
                        }
                    }
                    Funs.DB.SubmitChanges();
                    tran.Commit();
                    result = true;
                }
                catch
                {
                    tran.Rollback();//回滚事务
                                    // db.Connection.Close();
                    result = false;
                }
            }
            Funs.DB.Connection.Close();
            return result;

        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="CurrentMonth"></param>
        /// <param name="PlanManHoursList"></param>
        /// <param name="PlanDetailList"></param>
        /// <returns></returns>
        public static bool EditTranManHours(string CurrentMonth, string UserId, List<Model.ManHours_PlanManHours> PlanManHoursList, List<Model.ManHours_PlanDetail> PlanDetailList)
        {
            bool result = false;
            Funs.DB.Connection.Close();
            Funs.DB.Connection.Open();
            Funs.DB.CommandTimeout = 30000;
            using (DbTransaction tran = Funs.DB.Connection.BeginTransaction())
            {
                Funs.DB.Transaction = tran;
                try
                {
                    if (PlanManHoursList != null && PlanManHoursList.Count > 0)
                    {
                        var query = (from x in Funs.DB.ManHours_PlanManHours where x.ManHoursMonth == CurrentMonth && x.UserId == UserId select x).ToList();
                        if (query != null)
                        {
                            if (query != null)
                            {
                                Funs.DB.ManHours_PlanManHours.DeleteAllOnSubmit(query);
                                Funs.DB.ManHours_PlanManHours.InsertAllOnSubmit(PlanManHoursList);
                            }
                        }
                    }

                    if (PlanDetailList != null && PlanDetailList.Count > 0)
                    {
                        DateTime dt = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM") + "-01");
                        DateTime dt1 = dt.AddMonths(11);
                        var query1 = (from x in Funs.DB.ManHours_PlanDetail where x.DateMonth >= dt && x.DateMonth <= dt1 && x.UserId == UserId orderby x.DateMonth select x).ToList();
                        if (query1 != null)
                        {
                            Funs.DB.ManHours_PlanDetail.DeleteAllOnSubmit(query1);
                            Funs.DB.ManHours_PlanDetail.InsertAllOnSubmit(PlanDetailList);
                        }
                    }

                    Funs.DB.SubmitChanges();
                    tran.Commit();
                    result = true;
                }
                catch (Exception ex)
                {
                    tran.Rollback();//回滚事务
                    // db.Connection.Close();
                    result = false;
                }
            }
            Funs.DB.Connection.Close();
            return result;

        }

        /// <summary>
        /// 获取当前月的数据
        /// </summary>
        /// <param name="month"></param>
        /// <returns></returns>
        public static DataTable GetList(string month, string UserId)
        {
            try
            {
                string strSql = "SELECT  * FROM ManHours_PlanManHours where 1=1";
                List<SqlParameter> listStr = new List<SqlParameter>();

                if (!string.IsNullOrEmpty(month))
                {
                    strSql += " AND ManHoursMonth=@ManHoursMonth ";
                    listStr.Add(new SqlParameter("@ManHoursMonth", month));
                }
                if (!string.IsNullOrEmpty(UserId))
                {
                    strSql += " AND UserId=@UserId ";
                    listStr.Add(new SqlParameter("@UserId", UserId));
                }
                strSql += "order by EprojectId";
                SqlParameter[] parameter = listStr.ToArray();
                DataTable table = SQLHelper.GetDataTableRunText(strSql, parameter);
                return table;
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

        #region 得到一个月的第一天和最后一天的日期
        /// <summary>
        /// 得到本月的第一天日期
        /// </summary>
        /// <returns>DateTime</returns>
        public static DateTime GetFirstDayOfMonth()
        {
            return GetFirstDayOfMonth(DateTime.Now);
        }
        /// <summary>
        /// 得到本月的最后一天的日期
        /// </summary>
        /// <returns>DateTime</returns>
        public static DateTime GetLastDayOfMonth()
        {
            return GetLastDayOfMonth(DateTime.Now);
        }
        /// <summary>
        /// 得到一个月的第一天
        /// </summary>
        /// <param name="someday">这个月的随便一天</param>
        /// <returns>DateTime</returns>
        public static DateTime GetFirstDayOfMonth(DateTime someday)
        {
            int totalDays = DateTime.DaysInMonth(someday.Year, someday.Month);
            DateTime result;
            int ts = 1 - someday.Day;
            result = someday.AddDays(ts);
            return result;
        }
        /// <summary>
        /// 得到一个月的最后一天
        /// </summary>
        /// <param name="someday">这个月的随便一天</param>
        /// <returns>DateTime</returns>
        public static DateTime GetLastDayOfMonth(DateTime someday)
        {
            int totalDays = DateTime.DaysInMonth(someday.Year, someday.Month);
            DateTime result;
            int ts = totalDays - someday.Day;
            result = someday.AddDays(ts);
            return result;
        }
        #endregion


        /// <summary>
        /// 根据人员和日期获取当月人工时
        /// </summary>
        /// <param name="userid"></param>
        /// <param name="month"></param>
        /// <returns></returns>
        public static double getSumManHoursByUserIdAndMonth(string userid, DateTime month)
        {
            var hours = (from x in Funs.DB.ManHours_Actual where x.UserId == userid && x.Month.Value.Year == month.Year && x.Month.Value.Month == month.Month select x.Hours).Sum();
            if (hours != null)
            {
                return hours.Value;
            }
            else
            {
                return 0;
            }
        }

        /// <summary>
        /// 根据人员获取总的人工时
        /// </summary>
        /// <param name="userid"></param>
        /// <returns></returns>
        public static double getSumManHoursByUserId(string userid)
        {
            var hours = (from x in Funs.DB.ManHours_Actual where x.UserId == userid select x.Hours).Sum();
            if(hours!=null)
            {
                return hours.Value;
            }
            else
            {
                return 0;
            }            
        }
    }
}