using System;
using System.Collections.Generic;
using System.Text;

namespace BBWY.Client.Helpers
{
    public class PackTaskTimerHelper
    {
        /// <summary>
        /// 是否停止倒计时
        /// </summary>
        /// <param name="dateTime"></param>
        /// <returns></returns>
        public static bool IsStopTimer(DateTime dateTime)
        {
            var hour = dateTime.Hour;

            if (hour < 9 || hour >= 18 || (hour == 12))
                return true;
            return false;
        }


        /// <summary>
        /// 计算有效超时时间
        /// </summary>
        /// <param name="startTime"></param>
        /// <returns></returns>
        public static DateTime AccountEffectiveOverTime(DateTime overTime)
        {
            var userStartTime = overTime;//有效开始时间

            if (overTime.Hour < 9)
            {
                userStartTime = overTime.Date.AddHours(9);//未到9店 按9点计时
            }
            if (overTime.Hour >= 18)//从隔天9点开始计时
            {
                userStartTime = overTime.Date.AddHours(18);//超过18点 按次日9点计时
            }
            if (overTime.Hour == 12)
            {
                userStartTime = overTime.Date.AddHours(13);//中午未到13点 按13点计时
            }

            if (userStartTime.DayOfWeek == DayOfWeek.Sunday)
            {
                userStartTime = userStartTime.Date.AddDays(1).AddHours(9);//周日算周1 9点开始 
            }

            return userStartTime;
        }

        /// <summary>
        /// 计算有效当前时间
        /// </summary>
        /// <param name="endTime">完成时间</param>
        /// <returns></returns>
        public static DateTime AccountEffectiveNowTime(DateTime nowTime)
        {
            var userEndTime = nowTime;//有效开始时间

            if (nowTime.Hour < 9)
            {
                userEndTime = nowTime.Date.AddDays(-1).AddHours(18);//未到9店 按前一天 18点完成
            }
            if (nowTime.Hour >= 18)
            {
                userEndTime = nowTime.Date.AddHours(18);//超过18点 按18点完成
            }
            if (nowTime.Hour == 12)
            {
                userEndTime = nowTime.Date.AddHours(12);//中午未到13点 按12点计时
            }

            if (userEndTime.DayOfWeek == DayOfWeek.Sunday)
            {
                userEndTime = userEndTime.Date.AddDays(-1).AddHours(18);//周日算周六 18点完成
            }
            return userEndTime;
        }



        /// <summary>
        /// 计算有效剩余时长
        /// </summary>
        /// <param name="startTime">开始时间</param>
        /// <param name="completedTime">完成时间</param>
        /// <returns></returns>
        public static TimeSpan AccountEffectiveRemainDuration(DateTime nowTime, DateTime overTime)
        {






            var effectiveNowTime = AccountEffectiveNowTime(nowTime);

            var effectiveOverTime = AccountEffectiveOverTime(overTime);


            if (effectiveNowTime < effectiveOverTime)
            {
                return AccountEffectiveDuration(effectiveNowTime , effectiveOverTime);

            }

            return -AccountEffectiveDuration( effectiveOverTime, effectiveNowTime);






        }

        /// <summary>
        /// 计算有效时长(任务耗时)
        /// </summary>
        /// <param name="startTime">开始时间</param>
        /// <param name="completedTime">完成时间</param>
        /// <returns></returns>
        public static TimeSpan AccountEffectiveDuration(DateTime effectiveStartTime, DateTime effectiveCompletedTime)
        {

            var timespan = effectiveCompletedTime - effectiveStartTime;

       

            var hoursTimeSpan = timespan.Add(TimeSpan.FromDays(-CountSundays(effectiveStartTime, effectiveCompletedTime)));//计算小时差



            //1. 开始时间 12点     结束时间  10点
            if (effectiveStartTime.TimeOfDay > effectiveCompletedTime.TimeOfDay)
            {
                if (effectiveStartTime.Hour <= 12)//-16小时
                    return hoursTimeSpan.Add(TimeSpan.FromHours(-16));
                else
                {
                    if (effectiveCompletedTime.Hour <= 12)
                        return hoursTimeSpan.Add(TimeSpan.FromHours(-15));
                    else
                        return hoursTimeSpan.Add(TimeSpan.FromHours(-16));
                }

            }
            else//2. 开始时间 10点     结束时间  11点/ 14点
            {
                if (effectiveCompletedTime.Hour > 12)
                    if (effectiveStartTime.Hour <= 12)
                        return hoursTimeSpan.Add(TimeSpan.FromHours(-1));

                return hoursTimeSpan;
            }
        }


        /// <summary>
        /// 判断两个日期之间有多少个星期日
        /// </summary>
        /// <param name="startDate"></param>
        /// <param name="endDate"></param>
        /// <returns></returns>
        private static int CountSundays(DateTime startDate, DateTime endDate)
        {
            int sundays = 0;

            while (startDate <= endDate)
            {
                if (startDate.DayOfWeek == DayOfWeek.Sunday)
                {
                    sundays++;
                }
                startDate = startDate.AddDays(1);
            }

            return sundays;
        }
    }
}