private (string, PairingSession) IsValidPairingSession(string pairingId, [JsonConverter(typeof(StringEnumConverter))] HandshakeResourceType handshakeResourceType = HandshakeResourceType.None)
        {
            var pairingSession = _sessions.FirstOrDefault(a => a.Id.Equals(pairingId, StringComparison.InvariantCultureIgnoreCase));

            if (pairingSession == null)
            {
                return("pairing session not found", null);
            }
            else if (handshakeResourceType != HandshakeResourceType.None)
            {
                if (pairingSession.Step != handshakeResourceType)
                {
                    return("the pairing session has not reached a valid state to do that", pairingSession);
                }
                else
                {
                    return("OK", pairingSession);
                }
            }

            return("OK", pairingSession);
        }
        public IActionResult Handle([FromQuery] string pairingId, [FromQuery][JsonConverter(typeof(StringEnumConverter))] HandshakeResourceType resource, [FromBody] string data)
        {
            (string, PairingSession)pairingSession;

            switch (resource)
            {
            case HandshakeResourceType.None:
                return(BadRequest("no resource given"));

            case HandshakeResourceType.ServerHello:
                pairingSession = IsValidPairingSession(pairingId);

                if (pairingSession.Item2 == null)
                {
                    pairingSession.Item1 = "OK";
                    pairingSession.Item2 = new PairingSession(pairingId);
                    _sessions.Add(pairingSession.Item2);
                }

                if (pairingSession.Item2.Step != HandshakeResourceType.None)
                {
                    return(BadRequest("the pairing session has not reached a valid state to do that"));
                }


                if (pairingSession.Item1 == "OK")
                {
                    var returnData      = pairingSession.Item2.GenerateServerHello(data);
                    var apiCallResponse = new ApiCallResponse(ApiCallMethod.POST, Constants.Step1Url, JsonConvert.SerializeObject(returnData));
                    return(Ok(apiCallResponse));
                }
                else
                {
                    return(BadRequest(pairingSession.Item1));
                }

            case HandshakeResourceType.ClientHello:
                pairingSession = IsValidPairingSession(pairingId, HandshakeResourceType.ClientHello);

                if (pairingSession.Item1 == "OK")
                {
                    var returnAckData = pairingSession.Item2.ParseClientHello(data);
                    return(Accepted(returnAckData));
                }
                else
                {
                    return(BadRequest(pairingSession.Item1));
                }

            case HandshakeResourceType.ServerAck:
                pairingSession = IsValidPairingSession(pairingId, HandshakeResourceType.ServerAck);

                if (pairingSession.Item1 == "OK")
                {
                    var ackData         = pairingSession.Item2.GenerateServerAck();
                    var ackCallResponse = new ApiCallResponse(ApiCallMethod.POST, Constants.Step2Url, JsonConvert.SerializeObject(ackData));
                    return(Ok(ackCallResponse));
                }
                else
                {
                    return(BadRequest(pairingSession.Item1));
                }

            case HandshakeResourceType.ClientAck:
                pairingSession = IsValidPairingSession(pairingId, HandshakeResourceType.ClientAck);

                if (pairingSession.Item1 == "OK")
                {
                    var returnAckData = pairingSession.Item2.ParseClientAck(data);
                    return(Accepted(returnAckData));
                }
                else
                {
                    return(BadRequest(pairingSession.Item1));
                }

            case HandshakeResourceType.Session:
                pairingSession = IsValidPairingSession(pairingId, HandshakeResourceType.Session);

                if (pairingSession.Item1 == "OK")
                {
                    var returnSessionData = pairingSession.Item2.GetKey();
                    return(Accepted(new KeyWrapper(Convert.ToBase64String(returnSessionData))));
                }
                else
                {
                    return(BadRequest(pairingSession.Item1));
                }

            default:
                return(BadRequest("no resource given"));
            }
        }