text: """Support for alexa Smart Home Skill API."""
  import logging
  
  import homeassistant.core as ha
  
  from .const import API_DIRECTIVE, API_HEADER
  from .errors import AlexaError, AlexaBridgeUnreachableError
  from .handlers import HANDLERS
  from .messages import AlexaDirective
  
  _LOGGER = logging.getLogger(__name__)
  
  EVENT_ALEXA_SMART_HOME = "alexa_smart_home"
  
  
  async def async_handle_message(hass, config, request, context=None, enabled=True):
      """Handle incoming API messages.
  
      If enabled is False, the response to all messagess will be a
      BRIDGE_UNREACHABLE error. This can be used if the API has been disabled in
      configuration.
      """
      assert request[API_DIRECTIVE][API_HEADER]["payloadVersion"] == "3"
  
      if context is None:
          context = ha.Context()
  
      directive = AlexaDirective(request)
  
      try:
          if not enabled:
              raise AlexaBridgeUnreachableError(
                  "Alexa API not enabled in Home Assistant configuration"
              )
  
          if directive.has_endpoint:
              directive.load_entity(hass, config)
  
          funct_ref = HANDLERS.get((directive.namespace, directive.name))
          if funct_ref:
              response = await funct_ref(hass, config, directive, context)
              if directive.has_endpoint:
                  response.merge_context_properties(directive.endpoint)
          else:
              _LOGGER.warning(
                  "Unsupported API request %s/%s", directive.namespace, directive.name
              )
              response = directive.error()
      except AlexaError as err:
          response = directive.error(
              error_type=err.error_type, error_message=err.error_message
          )
  
      request_info = {"namespace": directive.namespace, "name": directive.name}
  
      if directive.has_endpoint:
          request_info["entity_id"] = directive.entity_id
  
      hass.bus.async_fire(
          EVENT_ALEXA_SMART_HOME,
          {
              "request": request_info,
              "response": {"namespace": response.namespace, "name": response.name},
          },
          context=context,
      )
  
      return response.serialize()
  