public IActionResult PatchWorkDay(int id, [FromBody] JsonPatchDocument <CustomWorkDayForUpdateData> patchDoc)
        {
            var    claimsPrincipal = User as ClaimsPrincipal;
            int    barberId        = int.Parse(claimsPrincipal.FindFirst("userId").Value);
            string role            = claimsPrincipal.FindFirst("role").Value;

            if (!role.Equals("client"))
            {
                CustomWorkDay customWorkDay = role.Equals("admin") ? CustomWorkDaysDataStore.Current.Days.FirstOrDefault(wd => wd.Id == id) :
                                              CustomWorkDaysDataStore.Current.Days.FirstOrDefault(wd => wd.Id == id && wd.BarberId == barberId);
                if (customWorkDay == null)
                {
                    return(NotFound());
                }
                CustomWorkDayForUpdateData patchCustomWorkDay = new CustomWorkDayForUpdateData()
                {
                    OffDay = customWorkDay.OffDay,
                };

                patchDoc.ApplyTo(patchCustomWorkDay);

                if (!ModelState.IsValid)
                {
                    return(BadRequest(ModelState));
                }
                customWorkDay.OffDay = patchCustomWorkDay.OffDay;
                return(NoContent());
            }
            return(Unauthorized());
        }
        public IActionResult CreateCustomAppointmentHour(int customworkdayId, [FromBody] CustomAppointmentHourForCreateData data)
        {
            ClaimsPrincipal claimsPrincipal = User as ClaimsPrincipal;
            string          role            = claimsPrincipal.FindFirst("role").Value;
            int             barberId        = int.Parse(claimsPrincipal.FindFirst("userId").Value);

            if (!role.Equals("client"))
            {
                CustomWorkDay customWorkday = role.Equals("admin") ? CustomWorkDaysDataStore.Current.Days.FirstOrDefault(wd => wd.Id == customworkdayId) :
                                              CustomWorkDaysDataStore.Current.Days.FirstOrDefault(wd => wd.Id == customworkdayId && wd.BarberId == barberId);
                if (customWorkday == null)
                {
                    return(NotFound());
                }
                int maxCustomAppointmentHourId = CustomWorkDaysDataStore.Current.Days.SelectMany(wd => wd.CustomAppointmentHour).Max(ah => ah.Id);

                CustomAppointmentHour newCustomAppointmentHour = new CustomAppointmentHour()
                {
                    Id      = ++maxCustomAppointmentHourId,
                    Visible = data.Visible,
                    Hour    = data.Hour
                };
                customWorkday.CustomAppointmentHour.Add(newCustomAppointmentHour);
                return(CreatedAtRoute(role.Equals("admin") ? "GetCustomAppointmentHourById" : "GetCustomAppointmentHourByIdForBarber", new { customworkdayId, id = newCustomAppointmentHour.Id }, newCustomAppointmentHour));
            }
            return(Unauthorized());
        }
        public IActionResult GetCustomWorkDayById(int id)
        {
            CustomWorkDay workDay = CustomWorkDaysDataStore.Current.Days.FirstOrDefault(wd => wd.Id == id);

            if (workDay == null)
            {
                return(NotFound());
            }
            return(Ok(workDay));
        }
        public IActionResult GetAppointmentHours(int customworkdayId)
        {
            CustomWorkDay customworkDay = CustomWorkDaysDataStore.Current.Days.FirstOrDefault(wd => wd.Id == customworkdayId);

            if (customworkDay == null)
            {
                return(NotFound());
            }
            return(Ok(customworkDay.CustomAppointmentHour));
        }
        public IActionResult GetCustomWorkDayByDateForBarber(string date)
        {
            var           claimsPrincipal = User as ClaimsPrincipal;
            int           barberId        = int.Parse(claimsPrincipal.FindFirst("userId").Value);
            CustomWorkDay workDay         = CustomWorkDaysDataStore.Current.Days.FirstOrDefault(wd => wd.BarberId == barberId && wd.Date == date);

            if (workDay == null)
            {
                return(NotFound());
            }
            return(Ok(workDay));
        }
        public IActionResult UpdateWorkDay([FromBody] CustomWorkDayForUpdateData data)
        {
            var claimsPrincipal = User as ClaimsPrincipal;
            var role            = claimsPrincipal.FindFirst("role").Value;

            if (!role.Equals("client"))
            {
                CustomWorkDay customworkDay = CustomWorkDaysDataStore.Current.Days.FirstOrDefault(wd => wd.Id == data.Id);
                if (customworkDay == null)
                {
                    return(NotFound());
                }
                customworkDay.OffDay = data.OffDay;
                return(NoContent());
            }
            return(Unauthorized());
        }
        public IActionResult DeleteWorkDay(int id)
        {
            var claimsPrincipal = User as ClaimsPrincipal;
            var role            = claimsPrincipal.FindFirst("role").Value;
            int barberId        = int.Parse(claimsPrincipal.FindFirst("userId").Value);

            if (!role.Equals("client"))
            {
                CustomWorkDay customWorkDay = role.Equals("admin") ? CustomWorkDaysDataStore.Current.Days.FirstOrDefault(wd => wd.Id == id) :
                                              CustomWorkDaysDataStore.Current.Days.FirstOrDefault(wd => wd.Id == id && wd.BarberId == barberId);
                if (customWorkDay == null)
                {
                    return(NotFound());
                }
                CustomWorkDaysDataStore.Current.Days.Remove(customWorkDay);
                return(NoContent());
            }
            return(Unauthorized());
        }
        public IActionResult CreateCustomWorkDay([FromBody] CustomWorkDayForCreateData data)
        {
            ClaimsPrincipal claimsPrincipal = User as ClaimsPrincipal;
            string          role            = claimsPrincipal.FindFirst("role").Value;

            if (!role.Equals("client"))
            {
                var maxCustomWorkDayId = WorkDaysDataStore.Current.Days.Max(wd => wd.Id);
                var newCustomWorkDay   = new CustomWorkDay()
                {
                    Id       = ++maxCustomWorkDayId,
                    OffDay   = data.OffDay,
                    Date     = data.Date,
                    BarberId = data.BarberId,
                    CustomAppointmentHour = data.CustomAppointmentHour
                };
                CustomWorkDaysDataStore.Current.Days.Add(newCustomWorkDay);
                return(CreatedAtRoute(role.Equals("admin") ? "GetCustomWorkDayById" : "GetCustomWorkDayByIdForBarber", new { newCustomWorkDay.Id }, newCustomWorkDay));
            }
            return(Unauthorized());
        }