protected bool TryGetCertificateSession(string model, string username, out CertificateSession certSession)
        {
            var sessionString = SessionService.Get(nameof(CertificateSession));

            if (sessionString == null)
            {
                Logger.LogInformation($"Session for {model} requested by {username} has been lost. Redirecting to Search Index");
                certSession = null;
                return(false);
            }

            certSession = JsonConvert.DeserializeObject <CertificateSession>(sessionString);
            return(certSession != null);
        }
        public async Task <IActionResult> Start(CertificateStartViewModel vm)
        {
            _sessionService.Remove(nameof(CertificateSession));

            var ukprn    = _contextAccessor.HttpContext.User.FindFirst("http://schemas.portal.com/ukprn")?.Value;
            var username = _contextAccessor.HttpContext.User.FindFirst("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn")?.Value;

            List <string>          options      = new List <string>();
            var                    singleOption = string.Empty;
            List <StandardVersion> versions     = new List <StandardVersion>();

            var startCertificateRequest = new StartCertificateRequest()
            {
                UkPrn        = int.Parse(ukprn),
                StandardCode = vm.StdCode,
                Uln          = vm.Uln,
                Username     = username
            };

            async Task RetrieveAndPopulateStandardOptions(string standardUId)
            {
                var optionsResult = await _standardVersionClient.GetStandardOptions(standardUId);

                if (optionsResult != null && optionsResult.HasOptions())
                {
                    if (optionsResult.OnlyOneOption())
                    {
                        singleOption = optionsResult.CourseOption.Single();
                        startCertificateRequest.CourseOption = singleOption;
                    }

                    options = optionsResult.CourseOption.ToList();
                }
            }

            var learner = await _learnerApiClient.GetLearnerRecord(vm.StdCode, vm.Uln);

            var versionsResult = await _standardVersionClient.GetStandardVersionsByLarsCode(vm.StdCode);

            if (learner.VersionConfirmed && !string.IsNullOrEmpty(learner.Version))
            {
                var version = versionsResult.First(v => v.Version == learner.Version);

                startCertificateRequest.StandardUId = version.StandardUId;
                versions.Add(version);

                if (!string.IsNullOrEmpty(learner.CourseOption))
                {
                    options.Add(learner.CourseOption);
                    startCertificateRequest.CourseOption = learner.CourseOption;
                }
                else
                {
                    await RetrieveAndPopulateStandardOptions(version.StandardUId);
                }
            }
            else
            {
                versions = versionsResult.ToList();

                if (versionsResult.Count() == 1)
                {
                    startCertificateRequest.StandardUId = versionsResult.First().StandardUId;

                    await RetrieveAndPopulateStandardOptions(versionsResult.First().StandardUId);
                }
            }

            _logger.LogInformation($"Start of Certificate Start for ULN {vm.Uln} and Standard Code: {vm.StdCode} by user {username}");

            var cert = await _certificateApiClient.Start(startCertificateRequest);

            var certificateSession = new CertificateSession()
            {
                CertificateId = cert.Id,
                Uln           = vm.Uln,
                StandardCode  = vm.StdCode,
                StandardUId   = startCertificateRequest.StandardUId,
                Versions      = Mapper.Map <List <StandardVersionViewModel> >(versions),
                Options       = options
            };

            _sessionService.Set(nameof(CertificateSession), certificateSession);
            _logger.LogInformation($"New Certificate received for ULN {vm.Uln} and Standard Code: {vm.StdCode} with ID {cert.Id}");

            if (versions.Count() > 1)
            {
                return(RedirectToAction("Version", "CertificateVersion"));
            }
            else if (!string.IsNullOrWhiteSpace(singleOption))
            {
                return(RedirectToAction("Declare", "CertificateDeclaration"));
            }
            else if (options.Count > 1)
            {
                return(RedirectToAction("Option", "CertificateOption"));
            }

            return(RedirectToAction("Declare", "CertificateDeclaration"));
        }