private double GetHoursWorkedBetweenBedtimeAndMidnight(CalculatePayRequest calculatePayRequest, double hoursWorkedBeforeBedtime, double hoursWorkedAfterMidnight)
        {
            var totalHoursWorked = (calculatePayRequest.EndTime - calculatePayRequest.StartTime).TotalHours;
            var hoursBetweenBedtimeAndMidnight = totalHoursWorked - (hoursWorkedBeforeBedtime + hoursWorkedAfterMidnight);

            return(hoursBetweenBedtimeAndMidnight > 0 ? hoursBetweenBedtimeAndMidnight : 0);
        }
        public ActionResult CalculatePay([FromBody] CalculatePayRequest calculatePayRequest)
        {
            var bedtimeHour = _configuration.GetValue <int>("BedtimeHour");
            var bedtime     = calculatePayRequest.StartTime.Date.Add(new TimeSpan(bedtimeHour, 0, 0));

            if (calculatePayRequest.StartTime.Hour < 17)
            {
                return(new BadRequestObjectResult("StartTime before 5:00PM is invalid."));
            }

            if (calculatePayRequest.EndTime.Hour > 04 &&
                calculatePayRequest.EndTime.Date == calculatePayRequest.StartTime.Date.AddDays(1))
            {
                return(new BadRequestObjectResult("EndTime after 4:00AM the next day is invalid."));
            }

            var hoursWorkedBeforeBedtime             = GetHoursWorkedBeforeBedtime(calculatePayRequest, bedtime);
            var hoursWorkedAfterMidnight             = GetHoursWorkedAfterMidnight(calculatePayRequest);
            var hoursWorkedBetweenBedtimeAndMidnight =
                GetHoursWorkedBetweenBedtimeAndMidnight(calculatePayRequest, hoursWorkedBeforeBedtime, hoursWorkedAfterMidnight);
            var pay = CalculateTotalPay(hoursWorkedBeforeBedtime, hoursWorkedAfterMidnight,
                                        hoursWorkedBetweenBedtimeAndMidnight);

            return(Ok(pay.ToString("C")));
        }
        private double GetHoursWorkedAfterMidnight(CalculatePayRequest calculatePayRequest)
        {
            var midnightOfNextDay = calculatePayRequest.StartTime.AddDays(1).Date;

            if (calculatePayRequest.EndTime >= midnightOfNextDay)
            {
                return((calculatePayRequest.EndTime - midnightOfNextDay).TotalHours);
            }

            return(0);
        }
        private double GetHoursWorkedBeforeBedtime(CalculatePayRequest calculatePayRequest, DateTime bedtime)
        {
            if (calculatePayRequest.StartTime >= bedtime)
            {
                return(0);
            }

            if (calculatePayRequest.EndTime < bedtime)
            {
                return((calculatePayRequest.EndTime - calculatePayRequest.StartTime).TotalHours);
            }

            return((bedtime - calculatePayRequest.StartTime).TotalHours);
        }