private async Task <string> SignAndEncodePresentationRequestBody(
            HttpClient client,
            V1_GetDidResponse did,
            V1_CreatePresentationRequestResponse v1CreatePresentationRequestResponse)
        {
            var createDidUrl = $"https://{_mattrConfiguration.TenantSubdomain}/v1/messaging/sign";

            object didUrlArray;

            did.DidDocument.AdditionalProperties.TryGetValue("authentication", out didUrlArray);
            var didUrl  = didUrlArray.ToString().Split("\"")[1];
            var payload = new MattrOpenApiClient.SignMessageRequest
            {
                DidUrl  = didUrl,
                Payload = v1CreatePresentationRequestResponse.Request
            };
            var payloadJson = JsonConvert.SerializeObject(payload);
            var uri         = new Uri(createDidUrl);

            using (var content = new StringContentWithoutCharset(payloadJson, "application/json"))
            {
                var response = await client.PostAsync(uri, content);

                if (response.StatusCode == System.Net.HttpStatusCode.OK)
                {
                    var result = await response.Content.ReadAsStringAsync();

                    return(result);
                }

                var error = await response.Content.ReadAsStringAsync();
            }

            return(null);
        }
        /// <summary>
        /// https://learn.mattr.global/tutorials/verify/using-callback/callback-e-to-e
        /// </summary>
        /// <param name="callbackBaseUrl"></param>
        /// <returns></returns>
        public async Task <(string QrCodeUrl, string ChallengeId)> CreateVerifyCallback(string callbackBaseUrl)
        {
            callbackBaseUrl = callbackBaseUrl.Trim();
            if (!callbackBaseUrl.EndsWith('/'))
            {
                callbackBaseUrl = $"{callbackBaseUrl}/";
            }

            var callbackUrlFull = $"{callbackBaseUrl}{MATTR_CALLBACK_VERIFY_PATH}";
            var challenge       = GetEncodedRandomString();

            HttpClient client      = _clientFactory.CreateClient();
            var        accessToken = await _mattrTokenApiService.GetApiToken(client, "mattrAccessToken");

            client.DefaultRequestHeaders.Authorization =
                new AuthenticationHeaderValue("Bearer", accessToken);
            client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json");

            var template = await _boInsuranceDbService.GetLastDriverLicensePrsentationTemplate();

            // Invoke the Presentation Request
            var invokePresentationResponse = await InvokePresentationRequest(
                client,
                template.DidId,
                template.TemplateId,
                challenge,
                callbackUrlFull);

            // Request DID
            V1_GetDidResponse did = await RequestDID(template.DidId, client);

            // Sign and Encode the Presentation Request body
            var signAndEncodePresentationRequestBodyResponse = await SignAndEncodePresentationRequestBody(
                client, did, invokePresentationResponse);

            // fix strange DTO
            var jws = signAndEncodePresentationRequestBodyResponse.Replace("\"", "");

            // save to db // TODO add this back once working
            var drivingLicensePresentationVerify = new DrivingLicensePresentationVerify
            {
                DidId       = template.DidId,
                TemplateId  = template.TemplateId,
                CallbackUrl = callbackUrlFull,
                Challenge   = challenge,
                InvokePresentationResponse = JsonConvert.SerializeObject(invokePresentationResponse),
                Did = JsonConvert.SerializeObject(did),
                SignAndEncodePresentationRequestBody = jws
            };
            await _boInsuranceDbService.CreateDrivingLicensePresentationVerify(drivingLicensePresentationVerify);

            var qrCodeUrl = $"didcomm://https://{_mattrConfiguration.TenantSubdomain}/?request={jws}";

            return(qrCodeUrl, challenge);
        }