/// <summary>
        /// Create supervisor approval notification card.
        /// </summary>
        /// <param name="context">Dialog context.</param>
        /// <param name="reqId">Created request Id.</param>
        /// <param name="personNumber">Person number of request creator.</param>
        /// <param name="paycode">Paycode for request.</param>
        /// <param name="timePeriod">Time period for request.</param>
        /// <param name="details">Request details from API.</param>
        /// <param name="note">Comment by requestor while creating request.</param>
        /// <param name="requestor">Request creator name.</param>
        /// <param name="comments">List of comments to which note will be attached.</param>
        /// <param name="advancedTimeOff">Advanced time off request object.</param>
        /// <returns>Supervisor notification card.</returns>
        public AdaptiveCard GetSupervisorNotificationCard(IDialogContext context, string reqId, string personNumber, string paycode, string timePeriod, GlobalTimeOffRequestItem details, string note, string requestor, Models.ResponseEntities.CommentList.Response comments, AdvancedTimeOff advancedTimeOff = null)
        {
            var    repoMessage  = context.MakeMessage();
            var    adaptiveCard = File.ReadAllText(HttpContext.Current.Server.MapPath("/Cards/AdaptiveCards/TimeOff/SupervisorNotificationCard.json"));
            var    activity     = context.Activity as Activity;
            JToken token        = JObject.Parse(activity.Value.ToString());

            DateTime sdt, edt;

            if (advancedTimeOff == null)
            {
                DateTime.TryParse((string)token.SelectToken("sdt"), CultureInfo.InvariantCulture, DateTimeStyles.None, out sdt);
                DateTime.TryParse((string)token.SelectToken("edt"), CultureInfo.InvariantCulture, DateTimeStyles.None, out edt);
            }
            else
            {
                DateTime.TryParse(advancedTimeOff.sdt, CultureInfo.InvariantCulture, DateTimeStyles.None, out sdt);
                DateTime.TryParse(advancedTimeOff.edt, CultureInfo.InvariantCulture, DateTimeStyles.None, out edt);
            }

            edt = edt.AddHours(23);
            edt = edt.AddMinutes(59);
            var days = (int)Math.Round(edt.Subtract(sdt).TotalDays, MidpointRounding.AwayFromZero);

            adaptiveCard = adaptiveCard.Replace("{Title}", KronosResourceText.TimeOffRequstText).Replace("{Status_txt}", KronosResourceText.Status).Replace("{Employee_txt}", KronosResourceText.Employee);
            adaptiveCard = adaptiveCard.Replace("{Paycode_txt}", KronosResourceText.PayCode).Replace("{Date_txt}", KronosResourceText.Date).Replace("{TimePeriod_txt}", KronosResourceText.TimePeriod);
            adaptiveCard = adaptiveCard.Replace("{Note_txt}", KronosResourceText.Note).Replace("{SelectComment}", KronosResourceText.SelectComment).Replace("{EnterNote}", KronosResourceText.EnterNote);
            adaptiveCard = adaptiveCard.Replace("{Submit}", KronosResourceText.Submit).Replace("{Refuse}", KronosResourceText.Refuse);
            adaptiveCard = adaptiveCard.Replace("{Days}", days.ToString() + (days > 1 ? " Days" : " Day"));
            adaptiveCard = adaptiveCard.Replace("{StartDate}", sdt.ToString("MMM d, yyyy", CultureInfo.InvariantCulture));
            adaptiveCard = adaptiveCard.Replace("{Approve}", KronosResourceText.Approve).Replace("{Submit}", KronosResourceText.Submit).Replace("{Refuse}", KronosResourceText.Refuse).Replace("{ShowHistory}", KronosResourceText.ShowHistory);
            if (timePeriod.ToLowerInvariant() == Constants.FullDay.ToLowerInvariant() && days == 0)
            {
                adaptiveCard = adaptiveCard.Replace("- {EndDate}", string.Empty);
            }
            else
            {
                adaptiveCard = adaptiveCard.Replace("{EndDate}", edt.ToString("MMM d, yyyy", CultureInfo.InvariantCulture));
            }

            adaptiveCard = adaptiveCard.Replace("{RequestId}", reqId).Replace("{PersonNumber}", personNumber).Replace("{Status}", KronosResourceText.Submitted);
            adaptiveCard = adaptiveCard.Replace("{Color}", Constants.Default).Replace("{Employee}", requestor).Replace("{PayCode}", paycode);
            adaptiveCard = adaptiveCard.Replace("{TimePeriod}", timePeriod).Replace("{QueryDateSpan}", sdt.ToString("M/d/yyyy", CultureInfo.InvariantCulture) + "-" + edt.ToString("M/d/yyyy", CultureInfo.InvariantCulture));
            adaptiveCard = adaptiveCard.Replace("{Note}", note ?? KronosResourceText.NoComment);

            var           historyItem = File.ReadAllText(HttpContext.Current.Server.MapPath("/Cards/AdaptiveCards/TimeOff/HistoryItem.json"));
            var           first       = true;
            StringBuilder sb          = new StringBuilder();

            foreach (var item in details?.RequestStatusChanges?.RequestStatusChange)
            {
                sb.Append("," + historyItem.Replace("{Seperator}", first == true ? "False" : "True").Replace("{Status}", item.ToStatusName).Replace("{Person}", item.User.PersonIdentity.PersonNumber).Replace("{Datetime}", item.ChangeDateTime));
                first = false;
            }

            adaptiveCard = adaptiveCard.Replace("{rows}", details?.RequestStatusChanges.RequestStatusChange.Count == 0 ? null : sb.ToString());

            var row = "{\"title\": \"{Text}\",\"value\": \"{Value}\"}";

            sb = new StringBuilder();
            for (int i = 0; i < comments.Comments.Count; i++)
            {
                if (i == 0)
                {
                    sb.Append(row.Replace("{Text}", comments.Comments[i].CommentText).Replace("{Value}", comments.Comments[i].CommentText));
                    adaptiveCard.Replace("{CommentValue}", comments.Comments[i].CommentText);
                }
                else
                {
                    sb.Append(", " + row.Replace("{Text}", comments.Comments[i].CommentText).Replace("{Value}", comments.Comments[i].CommentText));
                }
            }

            adaptiveCard = adaptiveCard.Replace("{CommentRows}", sb.ToString());
            var card = AdaptiveCard.FromJson(adaptiveCard).Card;

            return(card);
        }
        /// <summary>
        /// Filter shifts option based on employees and job roles.
        /// </summary>
        /// <param name="context">dialog context.</param>
        /// <param name="obj">selected values from previous cards.</param>
        /// <param name="comment">passed note while approving.</param>
        /// <param name="comments">selected comment while approving.</param>
        /// <param name="approvalType">approvaltype = Manager/Employee.</param>
        /// <returns>basic filter card card.</returns>
        public AdaptiveCard GetNotificationCard(IDialogContext context, SwapShiftObj obj, string comment, Models.ResponseEntities.CommentList.Response comments, int approvalType)
        {
            string fullPath     = HttpContext.Current.Server.MapPath("/Cards/AdaptiveCards/SwapShift/ApprovalNotification.json");
            var    adaptiveCard = File.ReadAllText(fullPath);

            if (approvalType == 1)
            {
                adaptiveCard = adaptiveCard.Replace("{Title}", KronosResourceText.SwapShiftConfirmTitle);
                adaptiveCard = adaptiveCard.Replace("{Info}", obj.RequestorName + " " + KronosResourceText.RequestedShiftSwapWith);
                adaptiveCard = adaptiveCard.Replace("{LeftBar}", Constants.WhiteBar);
                adaptiveCard = adaptiveCard.Replace("{LeftDate}", obj.Emp2FromDateTime.ToString("ddd, MMM d", CultureInfo.InvariantCulture));
                adaptiveCard = adaptiveCard.Replace("{LeftTimeSpan}", obj.Emp2FromDateTime.ToString("h:mm tt", CultureInfo.InvariantCulture) + Separator + obj.Emp2ToDateTime.ToString("h:mm tt", CultureInfo.InvariantCulture));
                adaptiveCard = adaptiveCard.Replace("{LeftHours}", obj.Emp2ToDateTime.Subtract(obj.Emp2FromDateTime).Hours.ToString());
                adaptiveCard = adaptiveCard.Replace("{LeftMin}", obj.Emp2ToDateTime.Subtract(obj.Emp2FromDateTime).Minutes.ToString());
                adaptiveCard = adaptiveCard.Replace("{LeftText}", KronosResourceText.AssignedToYou);
                adaptiveCard = adaptiveCard.Replace("{SwapIcon}", Constants.SwapIcon);
                adaptiveCard = adaptiveCard.Replace("{RightBar}", Constants.WhiteBar);
                adaptiveCard = adaptiveCard.Replace("{RightDate}", obj.Emp1FromDateTime.ToString("ddd, MMM d", CultureInfo.InvariantCulture));
                adaptiveCard = adaptiveCard.Replace("{RightTimeSpan}", obj.Emp1FromDateTime.ToString("h:mm tt", CultureInfo.InvariantCulture) + Separator + obj.Emp1ToDateTime.ToString("h:mm tt", CultureInfo.InvariantCulture));
                adaptiveCard = adaptiveCard.Replace("{RightHours}", obj.Emp1ToDateTime.Subtract(obj.Emp1FromDateTime).Hours.ToString());
                adaptiveCard = adaptiveCard.Replace("{RightMin}", obj.Emp1ToDateTime.Subtract(obj.Emp1FromDateTime).Minutes.ToString());
                adaptiveCard = adaptiveCard.Replace("{RightText}", KronosResourceText.AssignedTo + obj.RequestorName);
                adaptiveCard = adaptiveCard.Replace("{txt_Updated}", KronosResourceText.Updated);
                adaptiveCard = adaptiveCard.Replace("{StatusImage}", Constants.PendingImg);
                adaptiveCard = adaptiveCard.Replace("{UpdatedOn}", context.Activity.LocalTimestamp.Value.DateTime.ToString("MMM dd, h:mm tt", CultureInfo.InvariantCulture));
                adaptiveCard = adaptiveCard.Replace("{txt_Note}", KronosResourceText.Note);
                adaptiveCard = adaptiveCard.Replace("{Comment}", string.IsNullOrEmpty(comment) ? $"({KronosResourceText.None})" : comment);
                adaptiveCard = adaptiveCard.Replace("{SwapShiftObj}", JsonConvert.SerializeObject(obj, Formatting.None));
                adaptiveCard = adaptiveCard.Replace("{ApproveCmd}", KronosResourceText.ApproveByEmp);
                adaptiveCard = adaptiveCard.Replace("{RefuseCmd}", KronosResourceText.RefuseByEmp);
            }
            else
            {
                adaptiveCard = adaptiveCard.Replace("{Title}", KronosResourceText.SwapShiftConfirmTitle);
                adaptiveCard = adaptiveCard.Replace("{Info}", obj.RequestorName + " " + KronosResourceText.RequestSwapShiftWith + " " + obj.RequestedToName + ".");
                adaptiveCard = adaptiveCard.Replace("{LeftBar}", Constants.WhiteBar);
                adaptiveCard = adaptiveCard.Replace("{LeftDate}", obj.Emp1FromDateTime.ToString("ddd, MMM d", CultureInfo.InvariantCulture));
                adaptiveCard = adaptiveCard.Replace("{LeftTimeSpan}", obj.Emp1FromDateTime.ToString("h:mm tt", CultureInfo.InvariantCulture) + Separator + obj.Emp1ToDateTime.ToString("h:mm tt", CultureInfo.InvariantCulture));
                adaptiveCard = adaptiveCard.Replace("{LeftHours}", obj.Emp1ToDateTime.Subtract(obj.Emp1FromDateTime).Hours.ToString());
                adaptiveCard = adaptiveCard.Replace("{LeftMin}", obj.Emp1ToDateTime.Subtract(obj.Emp1FromDateTime).Minutes.ToString());
                adaptiveCard = adaptiveCard.Replace("{LeftText}", KronosResourceText.AssignedTo + " " + obj.RequestorName);
                adaptiveCard = adaptiveCard.Replace("{SwapIcon}", Constants.SwapIcon);
                adaptiveCard = adaptiveCard.Replace("{RightBar}", Constants.WhiteBar);
                adaptiveCard = adaptiveCard.Replace("{RightDate}", obj.Emp2FromDateTime.ToString("ddd, MMM d", CultureInfo.InvariantCulture));
                adaptiveCard = adaptiveCard.Replace("{RightTimeSpan}", obj.Emp2FromDateTime.ToString("h:mm tt", CultureInfo.InvariantCulture) + Separator + obj.Emp2ToDateTime.ToString("h:mm tt", CultureInfo.InvariantCulture));
                adaptiveCard = adaptiveCard.Replace("{RightHours}", obj.Emp2ToDateTime.Subtract(obj.Emp2FromDateTime).Hours.ToString());
                adaptiveCard = adaptiveCard.Replace("{RightMin}", obj.Emp2ToDateTime.Subtract(obj.Emp2FromDateTime).Minutes.ToString());
                adaptiveCard = adaptiveCard.Replace("{RightText}", KronosResourceText.AssignedTo + " " + obj.RequestedToName);
                adaptiveCard = adaptiveCard.Replace("{txt_Updated}", KronosResourceText.Updated);
                adaptiveCard = adaptiveCard.Replace("{StatusImage}", Constants.PendingImg);
                adaptiveCard = adaptiveCard.Replace("{txt_Note}", KronosResourceText.Note);
                adaptiveCard = adaptiveCard.Replace("{UpdatedOn}", context.Activity.LocalTimestamp.Value.DateTime.ToString("MMM dd, h:mm tt", CultureInfo.InvariantCulture));
                adaptiveCard = adaptiveCard.Replace("{Comment}", string.IsNullOrEmpty(comment) ? $"({KronosResourceText.None})" : comment);
                adaptiveCard = adaptiveCard.Replace("{ApproveCmd}", KronosResourceText.ApproveBySupervisor);
                adaptiveCard = adaptiveCard.Replace("{RefuseCmd}", KronosResourceText.RefuseBySupervisor);
                adaptiveCard = adaptiveCard.Replace("{SwapShiftObj}", JsonConvert.SerializeObject(obj, Formatting.None));
            }

            var row = "{\"title\": \"{Text}\",\"value\": \"{Value}\"}";
            var sb  = new StringBuilder();

            for (int i = 0; i < comments.Comments.Count; i++)
            {
                if (i == 0)
                {
                    sb.Append(row.Replace("{Text}", comments.Comments[i].CommentText).Replace("{Value}", comments.Comments[i].CommentText));
                    adaptiveCard.Replace("{CommentValue}", comments.Comments[i].CommentText);
                }
                else
                {
                    sb.Append(", " + row.Replace("{Text}", comments.Comments[i].CommentText).Replace("{Value}", comments.Comments[i].CommentText));
                }
            }

            adaptiveCard = adaptiveCard.Replace("{CommentRows}", sb.ToString());
            var card = AdaptiveCard.FromJson(adaptiveCard).Card;

            return(card);
        }
        /// <summary>
        /// For displaying advanced time off confirmation card which shows details selected by employee through previous steps.
        /// </summary>
        /// <param name="context">Dialog context.</param>
        /// <param name="obj">Advanced timeoff object.</param>
        /// <param name="comments">List of comments from API.</param>
        /// <returns>Confirmation card.</returns>
        public AdaptiveCard OnNextGetConfirmationCard(IDialogContext context, AdvancedTimeOff obj, Models.ResponseEntities.CommentList.Response comments)
        {
            string fullPath = HttpContext.Current.Server.MapPath("/Cards/AdaptiveCards/TimeOff/ConfirmAdvanceTimeOff.json");
            var    json     = File.ReadAllText(fullPath);

            DateTime.TryParse(obj.sdt, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime sdt);
            DateTime.TryParse(obj.edt, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime edt);
            edt = edt.AddHours(23).AddMinutes(59);
            var days = (int)Math.Round(edt.Subtract(sdt).TotalDays, MidpointRounding.AwayFromZero);

            if (obj.duration.ToLowerInvariant() == Constants.Hours.ToLowerInvariant())
            {
                var shr   = Convert.ToInt32(obj.StartTime.Split(' ')[0].Split(':')[0]);
                var smin  = Convert.ToInt32(obj.StartTime.Split(' ')[0].Split(':')[1]);
                var ehr   = Convert.ToInt32(obj.EndTime.Split(' ')[0].Split(':')[0]);
                var emin  = Convert.ToInt32(obj.EndTime.Split(' ')[0].Split(':')[1]);
                var stime = new DateTime(2000, 1, 1, shr, smin, 0);
                var etime = new DateTime(2000, 1, 1, ehr, emin, 0);
                json = json.Replace("{DurationHours}", "**" + KronosResourceText.TimePeriod + ":** " + stime.ToString("h:mm tt", CultureInfo.InvariantCulture) + " to " + etime.ToString("h:mm tt", CultureInfo.InvariantCulture));
                json = json.Replace("{Duration}", KronosResourceText.Hours);
            }
            else
            {
                json = json.Replace("{DurationHours}", string.Empty);
                if (obj.duration.ToLowerInvariant() == Constants.first_half_day.ToLowerInvariant())
                {
                    json = json.Replace("{Duration}", KronosResourceText.FirstHalfDay);
                }
                else if (obj.duration.ToLowerInvariant() == Constants.half_day.ToLowerInvariant())
                {
                    json = json.Replace("{Duration}", KronosResourceText.HalfDay);
                }
                else
                {
                    json = json.Replace("{Duration}", KronosResourceText.FullDay);
                }
            }

            json = json.Replace("{Title}", KronosResourceText.TimeOffRequstText).Replace("{ConfirmTimeOffRequest}", KronosResourceText.ConfirmTimeoffRequest).Replace("{PayCode_txt}", KronosResourceText.PayCode);
            json = json.Replace("{Date_txt}", KronosResourceText.Date).Replace("{Duration_txt}", KronosResourceText.Duration).Replace("{Back}", KronosResourceText.Back).Replace("{Cancel}", KronosResourceText.Cancel).Replace("{Confirm}", KronosResourceText.Confirm);
            json = json.Replace("{SelectComment}", KronosResourceText.SelectComment).Replace("{EnterNote}", KronosResourceText.EnterNote).Replace("{Submit}", KronosResourceText.Submit);
            json = json.Replace("{Days}", days.ToString() + (days > 1 ? " " + KronosResourceText.Days : " " + KronosResourceText.Day));
            json = days > 1 ? json.Replace("{DurationDate}", sdt.ToString("MMM d, yyyy", CultureInfo.InvariantCulture) + " - " + edt.ToString("MMM d, yyyy", CultureInfo.InvariantCulture)) : json.Replace("{DurationDate}", sdt.ToString("MMM d, yyyy", CultureInfo.InvariantCulture));

            json = json.Replace("{DeductFrom}", obj.DeductFrom);

            var           row = "{\"title\": \"{Text}\",\"value\": \"{Value}\"}";
            StringBuilder sb  = new StringBuilder();

            for (int i = 0; i < comments.Comments.Count; i++)
            {
                if (i == 0)
                {
                    sb.Append(row.Replace("{Text}", comments.Comments[i].CommentText).Replace("{Value}", comments.Comments[i].CommentText));
                    json.Replace("{CommentValue}", comments.Comments[i].CommentText);
                }
                else
                {
                    sb.Append(", " + row.Replace("{Text}", comments.Comments[i].CommentText).Replace("{Value}", comments.Comments[i].CommentText));
                }
            }

            json = json.Replace("{CommentRows}", sb.ToString());

            var card = AdaptiveCard.FromJson(json).Card;

            return(card);
        }