// if you change something here - make sure you also changing the way polling populates the manifest to keep constistency
        private static void ParseTabsWithItems(RecipientStatus recipient, DocuSignRecipientStatus docusignRecipient)
        {
            //handle radio group tabs
            foreach (var radioGroup in recipient.TabStatuses.Where(a => a.CustomTabType == CustomTabType.Radio).GroupBy(a => a.TabLabel))
            {
                var first_tab_ingroup = radioGroup.First();
                var radioGroupTab     = ParseTab(first_tab_ingroup);

                if (radioGroup.Count() > 0)
                {
                    foreach (var tab_ingroup in radioGroup)
                    {
                        var childTab = ParseTab(tab_ingroup);
                        radioGroupTab.Items.Add(childTab);
                        childTab.Selected = (childTab.Value != null).ToString();
                    }
                }
                else
                // <TabValue>X</TabValue> <- this is how it arrives with connect
                {
                    radioGroupTab.Selected = (radioGroupTab.Value != null).ToString();
                }
                docusignRecipient.Tabs.Add(radioGroupTab);
            }

            //handle list tabs
            foreach (var dslisttab in recipient.TabStatuses.Where(a => a.CustomTabType == CustomTabType.List))
            {
                DocuSignTabStatus listtab = ParseTab(dslisttab);

                string[] values = dslisttab.TabName.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries); //yes, TabName
                foreach (var ddlbvalue in values)
                {
                    var childItem = new DocuSignTabStatus();
                    childItem.TabLabel = ddlbvalue;
                    childItem.Value    = ddlbvalue;
                    childItem.Selected = false.ToString();
                    listtab.Items.Add(childItem);
                }

                //choose selected
                var selectedItem = listtab.Items.Where(a => a.Value == dslisttab.ListSelectedValue).FirstOrDefault();
                if (selectedItem != null)
                {
                    selectedItem.Selected = true.ToString();
                }

                docusignRecipient.Tabs.Add(listtab);
            }
        }
        private static DocuSignTabStatus ParseTab(TabStatus dstab)
        {
            var tab = new DocuSignTabStatus();

            tab.DocumentId = dstab.DocumentID;
            tab.Name       = dstab.TabName;
            tab.TabLabel   = dstab.TabLabel;
            string tabType = Enum.GetName(typeof(TabTypeCode), dstab.TabType);

            if (tabType == "Custom")
            {
                tabType = Enum.GetName(typeof(CustomTabType), dstab.CustomTabType);
            }
            tab.TabType = tabType;
            tab.Value   = dstab.TabValue;
            return(tab);
        }
        public static DocuSignEnvelopeCM_v2 ParseXMLintoCM(DocuSignEnvelopeInformation curDocuSignEnvelopeInfo)
        {
            var result = new DocuSignEnvelopeCM_v2();

            result.EnvelopeId            = curDocuSignEnvelopeInfo.EnvelopeStatus.EnvelopeID;
            result.Status                = Enum.GetName(typeof(EnvelopeStatusCode), curDocuSignEnvelopeInfo.EnvelopeStatus.Status);
            result.StatusChangedDateTime = DateTime.UtcNow;
            result.Subject               = curDocuSignEnvelopeInfo.EnvelopeStatus.Subject;
            result.ExternalAccountId     = curDocuSignEnvelopeInfo.EnvelopeStatus.Email;
            result.SentDate              = curDocuSignEnvelopeInfo.EnvelopeStatus.Sent;
            result.CreateDate            = curDocuSignEnvelopeInfo.EnvelopeStatus.Created;
            //Recipients
            foreach (var recipient in curDocuSignEnvelopeInfo.EnvelopeStatus.RecipientStatuses)
            {
                var docusignRecipient = new DocuSignRecipientStatus()
                {
                    Type           = Enum.GetName(typeof(RecipientTypeCode), recipient.Type),
                    Email          = recipient.Email,
                    Name           = recipient.UserName,
                    RecipientId    = recipient.RecipientId,
                    RoutingOrderId = recipient.RoutingOrder.ToString(),
                    Status         = Enum.GetName(typeof(RecipientStatusCode), recipient.Status)
                };

                //Tabs
                if (recipient.TabStatuses != null)
                {
                    foreach (var dstab in recipient.TabStatuses.Where(a => a.CustomTabType != CustomTabType.Radio && a.CustomTabType != CustomTabType.List))
                    {
                        DocuSignTabStatus tab = ParseTab(dstab);
                        docusignRecipient.Tabs.Add(tab);
                    }

                    ParseTabsWithItems(recipient, docusignRecipient);
                }

                result.Recipients.Add(docusignRecipient);
            }

            foreach (var dstemplate in curDocuSignEnvelopeInfo.EnvelopeStatus.DocumentStatuses)
            {
                var template = new DocuSignTemplate();
                template.DocumentId = dstemplate.ID;
                //sadly Connect gives us only a template name
                template.TemplateId = "";
                template.Name       = dstemplate.TemplateName;
                result.Templates.Add(template);
            }

            // Connect doesn't provide CourentRoutingOrder. let's assume that it's a highest routingOrderId from recipients who completed/signed
            var completedRecipients = curDocuSignEnvelopeInfo.EnvelopeStatus.RecipientStatuses.Where(a => a.Status == RecipientStatusCode.Completed || a.Status == RecipientStatusCode.Signed);

            if (completedRecipients.Count() > 0)
            {
                result.CurrentRoutingOrderId = completedRecipients.OrderByDescending(a => a.RoutingOrder).First().RoutingOrder.ToString();
            }
            else
            {
                result.CurrentRoutingOrderId = curDocuSignEnvelopeInfo.EnvelopeStatus.RecipientStatuses.First().RoutingOrder.ToString();
            }

            return(result);
        }
        public static DocuSignEnvelopeCM_v2 ParseAPIresponsesIntoCM(out DocuSignEnvelopeCM_v2 envelope, TemplateInformation templates, Recipients recipients)
        {
            envelope = new DocuSignEnvelopeCM_v2();
            envelope.CurrentRoutingOrderId = recipients.CurrentRoutingOrder;


            if (templates.Templates != null)
            {
                foreach (var ds_template in templates.Templates)
                {
                    DocuSignTemplate template = new DocuSignTemplate();
                    template.DocumentId = ds_template.DocumentId;
                    template.Name       = ds_template.Name;
                    template.TemplateId = ds_template.TemplateId;
                    envelope.Templates.Add(template);
                }
            }

            //Recipients

            if (recipients.Signers != null)
            {
                foreach (var dsrecipient in recipients.Signers)
                {
                    DocuSignRecipientStatus recipient = new DocuSignRecipientStatus();
                    recipient.Email          = dsrecipient.Email;
                    recipient.Name           = dsrecipient.Name;
                    recipient.RecipientId    = dsrecipient.RecipientId;
                    recipient.RoutingOrderId = dsrecipient.RoutingOrder;
                    recipient.Status         = dsrecipient.Status;
                    recipient.Type           = "Signer";
                    envelope.Recipients.Add(recipient);

                    //Tabs
                    if (dsrecipient.Tabs != null)
                    {
                        var tabsDTO = DocuSignTab.ExtractTabs(JObject.Parse(dsrecipient.Tabs.ToJson()), "");

                        foreach (var tabDTO in tabsDTO)
                        {
                            DocuSignTabStatus tab = new DocuSignTabStatus();
                            tab.DocumentId = tabDTO.DocumentId.ToString();
                            tab.Name       = tabDTO.Name;
                            tab.TabType    = tabDTO.Type;
                            tab.Value      = tabDTO.Value;
                            tab.TabLabel   = tabDTO.TabLabel;

                            if (tabDTO is DocuSignMultipleOptionsTabDTO)
                            {
                                var multiTabDTO = (DocuSignMultipleOptionsTabDTO)tabDTO;
                                foreach (var childDTO in multiTabDTO.Items)
                                {
                                    var childTab = new DocuSignTabStatus();
                                    childTab.Selected = childDTO.Selected.ToString();
                                    childTab.Value    = childDTO.Value;
                                    childTab.TabLabel = childDTO.Text;
                                    tab.Items.Add(childTab);
                                }
                            }
                            recipient.Tabs.Add(tab);
                        }
                    }
                }
            }
            return(envelope);
        }