# WARNING: DO NOT EDIT, AUTO-GENERATED CODE!
# See https://github.com/aws-beam/aws-codegen for more details.

defmodule AWS.ChimeSDKMeetings do
  @moduledoc """
  The Amazon Chime SDK meetings APIs in this section allow software developers to
  create Amazon Chime SDK meetings, set the Amazon Web Services Regions for
  meetings, create and manage users, and send and
  receive meeting notifications.

  For more information about the meeting APIs, see
  [Amazon Chime SDK meetings](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_Operations_Amazon_Chime_SDK_Meetings.html).
  """

  alias AWS.Client
  alias AWS.Request

  @typedoc """

  ## Example:

      update_attendee_capabilities_response() :: %{
        "Attendee" => attendee()
      }

  """
  @type update_attendee_capabilities_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      notifications_configuration() :: %{
        "LambdaFunctionArn" => String.t() | atom(),
        "SnsTopicArn" => String.t() | atom(),
        "SqsQueueArn" => String.t() | atom()
      }

  """
  @type notifications_configuration() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      tag_resource_request() :: %{
        required("ResourceARN") => String.t() | atom(),
        required("Tags") => list(tag())
      }

  """
  @type tag_resource_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      get_attendee_response() :: %{
        "Attendee" => attendee()
      }

  """
  @type get_attendee_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      unauthorized_exception() :: %{
        "Code" => String.t() | atom(),
        "Message" => String.t() | atom(),
        "RequestId" => String.t() | atom()
      }

  """
  @type unauthorized_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      untag_resource_response() :: %{}

  """
  @type untag_resource_response() :: %{}

  @typedoc """

  ## Example:

      create_meeting_with_attendees_request() :: %{
        optional("MediaPlacementNetworkType") => list(any()),
        optional("MeetingFeatures") => meeting_features_configuration(),
        optional("MeetingHostId") => String.t() | atom(),
        optional("NotificationsConfiguration") => notifications_configuration(),
        optional("PrimaryMeetingId") => String.t() | atom(),
        optional("Tags") => list(tag()),
        optional("TenantIds") => list(String.t() | atom()),
        required("Attendees") => list(create_attendee_request_item()),
        required("ClientRequestToken") => String.t() | atom(),
        required("ExternalMeetingId") => String.t() | atom(),
        required("MediaRegion") => String.t() | atom()
      }

  """
  @type create_meeting_with_attendees_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      service_failure_exception() :: %{
        "Code" => String.t() | atom(),
        "Message" => String.t() | atom(),
        "RequestId" => String.t() | atom()
      }

  """
  @type service_failure_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      forbidden_exception() :: %{
        "Code" => String.t() | atom(),
        "Message" => String.t() | atom(),
        "RequestId" => String.t() | atom()
      }

  """
  @type forbidden_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      meeting() :: %{
        "ExternalMeetingId" => String.t() | atom(),
        "MediaPlacement" => media_placement(),
        "MediaRegion" => String.t() | atom(),
        "MeetingArn" => String.t() | atom(),
        "MeetingFeatures" => meeting_features_configuration(),
        "MeetingHostId" => String.t() | atom(),
        "MeetingId" => String.t() | atom(),
        "PrimaryMeetingId" => String.t() | atom(),
        "TenantIds" => list(String.t() | atom())
      }

  """
  @type meeting() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      create_meeting_response() :: %{
        "Meeting" => meeting()
      }

  """
  @type create_meeting_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      get_meeting_response() :: %{
        "Meeting" => meeting()
      }

  """
  @type get_meeting_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      untag_resource_request() :: %{
        required("ResourceARN") => String.t() | atom(),
        required("TagKeys") => list(String.t() | atom())
      }

  """
  @type untag_resource_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      stop_meeting_transcription_request() :: %{}

  """
  @type stop_meeting_transcription_request() :: %{}

  @typedoc """

  ## Example:

      attendee_features() :: %{
        "MaxCount" => integer()
      }

  """
  @type attendee_features() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      engine_transcribe_settings() :: %{
        "ContentIdentificationType" => list(any()),
        "ContentRedactionType" => list(any()),
        "EnablePartialResultsStabilization" => boolean(),
        "IdentifyLanguage" => boolean(),
        "LanguageCode" => list(any()),
        "LanguageModelName" => String.t() | atom(),
        "LanguageOptions" => String.t() | atom(),
        "PartialResultsStability" => list(any()),
        "PiiEntityTypes" => String.t() | atom(),
        "PreferredLanguage" => list(any()),
        "Region" => list(any()),
        "VocabularyFilterMethod" => list(any()),
        "VocabularyFilterName" => String.t() | atom(),
        "VocabularyFilterNames" => String.t() | atom(),
        "VocabularyName" => String.t() | atom(),
        "VocabularyNames" => String.t() | atom()
      }

  """
  @type engine_transcribe_settings() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      list_attendees_response() :: %{
        "Attendees" => list(attendee()),
        "NextToken" => String.t() | atom()
      }

  """
  @type list_attendees_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      create_meeting_with_attendees_response() :: %{
        "Attendees" => list(attendee()),
        "Errors" => list(create_attendee_error()),
        "Meeting" => meeting()
      }

  """
  @type create_meeting_with_attendees_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      transcription_configuration() :: %{
        "EngineTranscribeMedicalSettings" => engine_transcribe_medical_settings(),
        "EngineTranscribeSettings" => engine_transcribe_settings()
      }

  """
  @type transcription_configuration() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      conflict_exception() :: %{
        "Code" => String.t() | atom(),
        "Message" => String.t() | atom(),
        "RequestId" => String.t() | atom()
      }

  """
  @type conflict_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      delete_meeting_request() :: %{}

  """
  @type delete_meeting_request() :: %{}

  @typedoc """

  ## Example:

      resource_not_found_exception() :: %{
        "Code" => String.t() | atom(),
        "Message" => String.t() | atom(),
        "RequestId" => String.t() | atom(),
        "ResourceName" => String.t() | atom()
      }

  """
  @type resource_not_found_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      tag() :: %{
        "Key" => String.t() | atom(),
        "Value" => String.t() | atom()
      }

  """
  @type tag() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      audio_features() :: %{
        "EchoReduction" => list(any())
      }

  """
  @type audio_features() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      engine_transcribe_medical_settings() :: %{
        "ContentIdentificationType" => list(any()),
        "LanguageCode" => list(any()),
        "Region" => list(any()),
        "Specialty" => list(any()),
        "Type" => list(any()),
        "VocabularyName" => String.t() | atom()
      }

  """
  @type engine_transcribe_medical_settings() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      create_meeting_request() :: %{
        optional("MediaPlacementNetworkType") => list(any()),
        optional("MeetingFeatures") => meeting_features_configuration(),
        optional("MeetingHostId") => String.t() | atom(),
        optional("NotificationsConfiguration") => notifications_configuration(),
        optional("PrimaryMeetingId") => String.t() | atom(),
        optional("Tags") => list(tag()),
        optional("TenantIds") => list(String.t() | atom()),
        required("ClientRequestToken") => String.t() | atom(),
        required("ExternalMeetingId") => String.t() | atom(),
        required("MediaRegion") => String.t() | atom()
      }

  """
  @type create_meeting_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      not_found_exception() :: %{
        "Code" => String.t() | atom(),
        "Message" => String.t() | atom(),
        "RequestId" => String.t() | atom()
      }

  """
  @type not_found_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      create_attendee_request_item() :: %{
        "Capabilities" => attendee_capabilities(),
        "ExternalUserId" => String.t() | atom()
      }

  """
  @type create_attendee_request_item() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      create_attendee_response() :: %{
        "Attendee" => attendee()
      }

  """
  @type create_attendee_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      list_tags_for_resource_response() :: %{
        "Tags" => list(tag())
      }

  """
  @type list_tags_for_resource_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      attendee_capabilities() :: %{
        "Audio" => list(any()),
        "Content" => list(any()),
        "Video" => list(any())
      }

  """
  @type attendee_capabilities() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      service_unavailable_exception() :: %{
        "Code" => String.t() | atom(),
        "Message" => String.t() | atom(),
        "RequestId" => String.t() | atom(),
        "RetryAfterSeconds" => String.t() | atom()
      }

  """
  @type service_unavailable_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      get_meeting_request() :: %{}

  """
  @type get_meeting_request() :: %{}

  @typedoc """

  ## Example:

      create_attendee_error() :: %{
        "ErrorCode" => String.t() | atom(),
        "ErrorMessage" => String.t() | atom(),
        "ExternalUserId" => String.t() | atom()
      }

  """
  @type create_attendee_error() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      unprocessable_entity_exception() :: %{
        "Code" => String.t() | atom(),
        "Message" => String.t() | atom(),
        "RequestId" => String.t() | atom()
      }

  """
  @type unprocessable_entity_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      tag_resource_response() :: %{}

  """
  @type tag_resource_response() :: %{}

  @typedoc """

  ## Example:

      get_attendee_request() :: %{}

  """
  @type get_attendee_request() :: %{}

  @typedoc """

  ## Example:

      attendee_id_item() :: %{
        "AttendeeId" => String.t() | atom()
      }

  """
  @type attendee_id_item() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      meeting_features_configuration() :: %{
        "Attendee" => attendee_features(),
        "Audio" => audio_features(),
        "Content" => content_features(),
        "Video" => video_features()
      }

  """
  @type meeting_features_configuration() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      list_tags_for_resource_request() :: %{
        required("ResourceARN") => String.t() | atom()
      }

  """
  @type list_tags_for_resource_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      content_features() :: %{
        "MaxResolution" => list(any())
      }

  """
  @type content_features() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      update_attendee_capabilities_request() :: %{
        required("Capabilities") => attendee_capabilities()
      }

  """
  @type update_attendee_capabilities_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      start_meeting_transcription_request() :: %{
        required("TranscriptionConfiguration") => transcription_configuration()
      }

  """
  @type start_meeting_transcription_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      throttling_exception() :: %{
        "Code" => String.t() | atom(),
        "Message" => String.t() | atom(),
        "RequestId" => String.t() | atom()
      }

  """
  @type throttling_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      batch_create_attendee_request() :: %{
        required("Attendees") => list(create_attendee_request_item())
      }

  """
  @type batch_create_attendee_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      batch_create_attendee_response() :: %{
        "Attendees" => list(attendee()),
        "Errors" => list(create_attendee_error())
      }

  """
  @type batch_create_attendee_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      list_attendees_request() :: %{
        optional("MaxResults") => integer(),
        optional("NextToken") => String.t() | atom()
      }

  """
  @type list_attendees_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      batch_update_attendee_capabilities_except_request() :: %{
        required("Capabilities") => attendee_capabilities(),
        required("ExcludedAttendeeIds") => list(attendee_id_item())
      }

  """
  @type batch_update_attendee_capabilities_except_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      limit_exceeded_exception() :: %{
        "Code" => String.t() | atom(),
        "Message" => String.t() | atom(),
        "RequestId" => String.t() | atom()
      }

  """
  @type limit_exceeded_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      video_features() :: %{
        "MaxResolution" => list(any())
      }

  """
  @type video_features() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      attendee() :: %{
        "AttendeeId" => String.t() | atom(),
        "Capabilities" => attendee_capabilities(),
        "ExternalUserId" => String.t() | atom(),
        "JoinToken" => String.t() | atom()
      }

  """
  @type attendee() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      bad_request_exception() :: %{
        "Code" => String.t() | atom(),
        "Message" => String.t() | atom(),
        "RequestId" => String.t() | atom()
      }

  """
  @type bad_request_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      create_attendee_request() :: %{
        optional("Capabilities") => attendee_capabilities(),
        required("ExternalUserId") => String.t() | atom()
      }

  """
  @type create_attendee_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      media_placement() :: %{
        "AudioFallbackUrl" => String.t() | atom(),
        "AudioHostUrl" => String.t() | atom(),
        "EventIngestionUrl" => String.t() | atom(),
        "ScreenDataUrl" => String.t() | atom(),
        "ScreenSharingUrl" => String.t() | atom(),
        "ScreenViewingUrl" => String.t() | atom(),
        "SignalingUrl" => String.t() | atom(),
        "TurnControlUrl" => String.t() | atom()
      }

  """
  @type media_placement() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      too_many_tags_exception() :: %{
        "Code" => String.t() | atom(),
        "Message" => String.t() | atom(),
        "RequestId" => String.t() | atom(),
        "ResourceName" => String.t() | atom()
      }

  """
  @type too_many_tags_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:

      delete_attendee_request() :: %{}

  """
  @type delete_attendee_request() :: %{}

  @type batch_create_attendee_errors() ::
          bad_request_exception()
          | limit_exceeded_exception()
          | throttling_exception()
          | unprocessable_entity_exception()
          | service_unavailable_exception()
          | not_found_exception()
          | forbidden_exception()
          | service_failure_exception()
          | unauthorized_exception()

  @type batch_update_attendee_capabilities_except_errors() ::
          bad_request_exception()
          | throttling_exception()
          | service_unavailable_exception()
          | not_found_exception()
          | conflict_exception()
          | forbidden_exception()
          | service_failure_exception()
          | unauthorized_exception()

  @type create_attendee_errors() ::
          bad_request_exception()
          | limit_exceeded_exception()
          | throttling_exception()
          | unprocessable_entity_exception()
          | service_unavailable_exception()
          | not_found_exception()
          | forbidden_exception()
          | service_failure_exception()
          | unauthorized_exception()

  @type create_meeting_errors() ::
          bad_request_exception()
          | limit_exceeded_exception()
          | throttling_exception()
          | service_unavailable_exception()
          | conflict_exception()
          | forbidden_exception()
          | service_failure_exception()
          | unauthorized_exception()

  @type create_meeting_with_attendees_errors() ::
          bad_request_exception()
          | limit_exceeded_exception()
          | throttling_exception()
          | service_unavailable_exception()
          | conflict_exception()
          | forbidden_exception()
          | service_failure_exception()
          | unauthorized_exception()

  @type delete_attendee_errors() ::
          bad_request_exception()
          | throttling_exception()
          | service_unavailable_exception()
          | not_found_exception()
          | forbidden_exception()
          | service_failure_exception()
          | unauthorized_exception()

  @type delete_meeting_errors() ::
          bad_request_exception()
          | throttling_exception()
          | service_unavailable_exception()
          | not_found_exception()
          | forbidden_exception()
          | service_failure_exception()
          | unauthorized_exception()

  @type get_attendee_errors() ::
          bad_request_exception()
          | throttling_exception()
          | service_unavailable_exception()
          | not_found_exception()
          | forbidden_exception()
          | service_failure_exception()
          | unauthorized_exception()

  @type get_meeting_errors() ::
          bad_request_exception()
          | throttling_exception()
          | service_unavailable_exception()
          | not_found_exception()
          | forbidden_exception()
          | service_failure_exception()
          | unauthorized_exception()

  @type list_attendees_errors() ::
          bad_request_exception()
          | throttling_exception()
          | service_unavailable_exception()
          | not_found_exception()
          | forbidden_exception()
          | service_failure_exception()
          | unauthorized_exception()

  @type list_tags_for_resource_errors() ::
          bad_request_exception()
          | limit_exceeded_exception()
          | throttling_exception()
          | service_unavailable_exception()
          | resource_not_found_exception()
          | forbidden_exception()
          | service_failure_exception()
          | unauthorized_exception()

  @type start_meeting_transcription_errors() ::
          bad_request_exception()
          | limit_exceeded_exception()
          | throttling_exception()
          | unprocessable_entity_exception()
          | service_unavailable_exception()
          | not_found_exception()
          | forbidden_exception()
          | service_failure_exception()
          | unauthorized_exception()

  @type stop_meeting_transcription_errors() ::
          bad_request_exception()
          | throttling_exception()
          | unprocessable_entity_exception()
          | service_unavailable_exception()
          | not_found_exception()
          | forbidden_exception()
          | service_failure_exception()
          | unauthorized_exception()

  @type tag_resource_errors() ::
          too_many_tags_exception()
          | bad_request_exception()
          | limit_exceeded_exception()
          | throttling_exception()
          | service_unavailable_exception()
          | resource_not_found_exception()
          | forbidden_exception()
          | service_failure_exception()
          | unauthorized_exception()

  @type untag_resource_errors() ::
          bad_request_exception()
          | limit_exceeded_exception()
          | throttling_exception()
          | service_unavailable_exception()
          | resource_not_found_exception()
          | forbidden_exception()
          | service_failure_exception()
          | unauthorized_exception()

  @type update_attendee_capabilities_errors() ::
          bad_request_exception()
          | throttling_exception()
          | service_unavailable_exception()
          | not_found_exception()
          | conflict_exception()
          | forbidden_exception()
          | service_failure_exception()
          | unauthorized_exception()

  def metadata do
    %{
      api_version: "2021-07-15",
      content_type: "application/x-amz-json-1.1",
      credential_scope: nil,
      endpoint_prefix: "meetings-chime",
      global?: false,
      hostname: nil,
      protocol: "rest-json",
      service_id: "Chime SDK Meetings",
      signature_version: "v4",
      signing_name: "chime",
      target_prefix: nil
    }
  end

  @doc """
  Creates up to 100 attendees for an active Amazon Chime SDK meeting.

  For more information about the Amazon Chime SDK, see
  [Using the Amazon Chime SDK](https://docs.aws.amazon.com/chime-sdk/latest/dg/meetings-sdk.html) in the
  *Amazon Chime Developer Guide*.
  """
  @spec batch_create_attendee(map(), String.t() | atom(), batch_create_attendee_request(), list()) ::
          {:ok, batch_create_attendee_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, batch_create_attendee_errors()}
  def batch_create_attendee(%Client{} = client, meeting_id, input, options \\ []) do
    url_path = "/meetings/#{AWS.Util.encode_uri(meeting_id)}/attendees?operation=batch-create"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Updates `AttendeeCapabilities` except the capabilities listed in an
  `ExcludedAttendeeIds` table.

  You use the capabilities with a set of values that control what the capabilities
  can do, such as `SendReceive` data. For more information about those values, see
  .

  When using capabilities, be aware of these corner cases:

    *
  If you specify `MeetingFeatures:Video:MaxResolution:None` when you create a
  meeting, all API requests
  that include `SendReceive`, `Send`, or `Receive` for
  `AttendeeCapabilities:Video` will be rejected with `ValidationError 400`.

    *
  If you specify `MeetingFeatures:Content:MaxResolution:None` when you create a
  meeting, all API requests that include `SendReceive`, `Send`, or
  `Receive` for `AttendeeCapabilities:Content` will be rejected with
  `ValidationError 400`.

    *
  You can't set `content` capabilities to `SendReceive` or `Receive` unless you
  also set `video` capabilities to `SendReceive`
  or `Receive`. If you don't set the `video` capability to receive, the response
  will contain an HTTP 400 Bad Request status code. However, you can set your
  `video` capability
  to receive and you set your `content` capability to not receive.

    *
  If meeting features is defined as `Video:MaxResolution:None` but
  `Content:MaxResolution` is defined as something other than
  `None` and attendee capabilities are not defined in the API
  request, then the default attendee video capability is set to
  `Receive` and attendee content capability is set to
  `SendReceive`. This is because content `SendReceive`
  requires video to be at least `Receive`.

    *
  When you change an `audio` capability from `None` or `Receive` to `Send` or
  `SendReceive` ,
  and if the attendee left their microphone unmuted, audio will flow from the
  attendee to the other meeting participants.

    *
  When you change a `video` or `content` capability from `None` or `Receive` to
  `Send` or `SendReceive` ,
  and if the attendee turned on their video or content streams, remote attendees
  can receive those streams, but only after media renegotiation between the client
  and the Amazon Chime back-end server.
  """
  @spec batch_update_attendee_capabilities_except(
          map(),
          String.t() | atom(),
          batch_update_attendee_capabilities_except_request(),
          list()
        ) ::
          {:ok, nil, any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, batch_update_attendee_capabilities_except_errors()}
  def batch_update_attendee_capabilities_except(
        %Client{} = client,
        meeting_id,
        input,
        options \\ []
      ) do
    url_path =
      "/meetings/#{AWS.Util.encode_uri(meeting_id)}/attendees/capabilities?operation=batch-update-except"

    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :put,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """

  Creates a new attendee for an active Amazon Chime SDK meeting.

  For more information about the Amazon Chime SDK, see
  [Using the Amazon Chime SDK](https://docs.aws.amazon.com/chime-sdk/latest/dg/meetings-sdk.html)
  in the
  *Amazon Chime Developer Guide*.
  """
  @spec create_attendee(map(), String.t() | atom(), create_attendee_request(), list()) ::
          {:ok, create_attendee_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, create_attendee_errors()}
  def create_attendee(%Client{} = client, meeting_id, input, options \\ []) do
    url_path = "/meetings/#{AWS.Util.encode_uri(meeting_id)}/attendees"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Creates a new Amazon Chime SDK meeting in the specified media Region with no
  initial attendees.

  For more information about specifying media Regions, see
  [Available Regions](https://docs.aws.amazon.com/chime-sdk/latest/dg/sdk-available-regions)
  and
  [Using meeting Regions](https://docs.aws.amazon.com/chime-sdk/latest/dg/chime-sdk-meetings-regions.html),
  both
  in the *Amazon Chime SDK Developer Guide*. For more information about the Amazon
  Chime SDK, see
  [Using the Amazon Chime SDK](https://docs.aws.amazon.com/chime-sdk/latest/dg/meetings-sdk.html)
  in the
  *Amazon Chime SDK Developer Guide*.

  If you use this API in conjuction with the and APIs, and you don't specify the
  `MeetingFeatures.Content.MaxResolution` or `MeetingFeatures.Video.MaxResolution`
  parameters, the following defaults are used:

    
  Content.MaxResolution: FHD

    
  Video.MaxResolution: HD
  """
  @spec create_meeting(map(), create_meeting_request(), list()) ::
          {:ok, create_meeting_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, create_meeting_errors()}
  def create_meeting(%Client{} = client, input, options \\ []) do
    url_path = "/meetings"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """

  Creates a new Amazon Chime SDK meeting in the specified media Region, with
  attendees.

  For more information about specifying media Regions, see
  [Available Regions](https://docs.aws.amazon.com/chime-sdk/latest/dg/sdk-available-regions)
  and
  [Using meeting Regions](https://docs.aws.amazon.com/chime-sdk/latest/dg/chime-sdk-meetings-regions.html),
  both
  in the *Amazon Chime SDK Developer Guide*. For more information about the Amazon
  Chime SDK, see
  [Using the Amazon Chime SDK](https://docs.aws.amazon.com/chime-sdk/latest/dg/meetings-sdk.html)
  in the
  *Amazon Chime SDK Developer Guide*.

  If you use this API in conjuction with the and APIs, and you don't specify the
  `MeetingFeatures.Content.MaxResolution` or `MeetingFeatures.Video.MaxResolution`
  parameters, the following defaults are used:

    
  Content.MaxResolution: FHD

    
  Video.MaxResolution: HD
  """
  @spec create_meeting_with_attendees(map(), create_meeting_with_attendees_request(), list()) ::
          {:ok, create_meeting_with_attendees_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, create_meeting_with_attendees_errors()}
  def create_meeting_with_attendees(%Client{} = client, input, options \\ []) do
    url_path = "/meetings?operation=create-attendees"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Deletes an attendee from the specified Amazon Chime SDK meeting and deletes
  their
  `JoinToken`.

  Attendees are automatically deleted when a Amazon Chime SDK meeting is deleted.
  For more information about the Amazon Chime SDK, see
  [Using the Amazon Chime SDK](https://docs.aws.amazon.com/chime-sdk/latest/dg/meetings-sdk.html)
  in the *Amazon Chime Developer Guide*.
  """
  @spec delete_attendee(
          map(),
          String.t() | atom(),
          String.t() | atom(),
          delete_attendee_request(),
          list()
        ) ::
          {:ok, nil, any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, delete_attendee_errors()}
  def delete_attendee(%Client{} = client, attendee_id, meeting_id, input, options \\ []) do
    url_path =
      "/meetings/#{AWS.Util.encode_uri(meeting_id)}/attendees/#{AWS.Util.encode_uri(attendee_id)}"

    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :delete,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      204
    )
  end

  @doc """
  Deletes the specified Amazon Chime SDK meeting.

  The operation deletes all attendees, disconnects all clients, and prevents new
  clients from
  joining the meeting. For more information about the Amazon Chime SDK, see
  [Using the Amazon Chime SDK](https://docs.aws.amazon.com/chime-sdk/latest/dg/meetings-sdk.html) in the
  *Amazon Chime Developer Guide*.
  """
  @spec delete_meeting(map(), String.t() | atom(), delete_meeting_request(), list()) ::
          {:ok, nil, any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, delete_meeting_errors()}
  def delete_meeting(%Client{} = client, meeting_id, input, options \\ []) do
    url_path = "/meetings/#{AWS.Util.encode_uri(meeting_id)}"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :delete,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      204
    )
  end

  @doc """

  Gets the Amazon Chime SDK attendee details for a specified meeting ID and
  attendee ID.

  For more information about the Amazon Chime SDK, see
  [Using the Amazon Chime SDK](https://docs.aws.amazon.com/chime-sdk/latest/dg/meetings-sdk.html)
  in the *Amazon Chime Developer Guide*.
  """
  @spec get_attendee(map(), String.t() | atom(), String.t() | atom(), list()) ::
          {:ok, get_attendee_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, get_attendee_errors()}
  def get_attendee(%Client{} = client, attendee_id, meeting_id, options \\ []) do
    url_path =
      "/meetings/#{AWS.Util.encode_uri(meeting_id)}/attendees/#{AWS.Util.encode_uri(attendee_id)}"

    headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(client, meta, :get, url_path, query_params, headers, nil, options, 200)
  end

  @doc """
  Gets the Amazon Chime SDK meeting details for the specified meeting ID.

  For more information about the Amazon Chime SDK, see
  [Using the Amazon Chime SDK](https://docs.aws.amazon.com/chime-sdk/latest/dg/meetings-sdk.html)
  in the *Amazon Chime Developer Guide*.
  """
  @spec get_meeting(map(), String.t() | atom(), list()) ::
          {:ok, get_meeting_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, get_meeting_errors()}
  def get_meeting(%Client{} = client, meeting_id, options \\ []) do
    url_path = "/meetings/#{AWS.Util.encode_uri(meeting_id)}"
    headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(client, meta, :get, url_path, query_params, headers, nil, options, 200)
  end

  @doc """

  Lists the attendees for the specified Amazon Chime SDK meeting.

  For more information about the Amazon Chime SDK, see
  [Using the Amazon Chime SDK](https://docs.aws.amazon.com/chime-sdk/latest/dg/meetings-sdk.html)
  in the *Amazon Chime Developer Guide*.
  """
  @spec list_attendees(
          map(),
          String.t() | atom(),
          String.t() | atom() | nil,
          String.t() | atom() | nil,
          list()
        ) ::
          {:ok, list_attendees_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_attendees_errors()}
  def list_attendees(
        %Client{} = client,
        meeting_id,
        max_results \\ nil,
        next_token \\ nil,
        options \\ []
      ) do
    url_path = "/meetings/#{AWS.Util.encode_uri(meeting_id)}/attendees"
    headers = []
    query_params = []

    query_params =
      if !is_nil(next_token) do
        [{"next-token", next_token} | query_params]
      else
        query_params
      end

    query_params =
      if !is_nil(max_results) do
        [{"max-results", max_results} | query_params]
      else
        query_params
      end

    meta = metadata()

    Request.request_rest(client, meta, :get, url_path, query_params, headers, nil, options, 200)
  end

  @doc """
  Returns a list of the tags available for the specified resource.
  """
  @spec list_tags_for_resource(map(), String.t() | atom(), list()) ::
          {:ok, list_tags_for_resource_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_tags_for_resource_errors()}
  def list_tags_for_resource(%Client{} = client, resource_arn, options \\ []) do
    url_path = "/tags"
    headers = []
    query_params = []

    query_params =
      if !is_nil(resource_arn) do
        [{"arn", resource_arn} | query_params]
      else
        query_params
      end

    meta = metadata()

    Request.request_rest(client, meta, :get, url_path, query_params, headers, nil, options, 200)
  end

  @doc """
  Starts transcription for the specified `meetingId`.

  For more information, refer to [
  Using Amazon Chime SDK live transcription
  ](https://docs.aws.amazon.com/chime-sdk/latest/dg/meeting-transcription.html) in
  the *Amazon Chime SDK Developer Guide*.

  If you specify an invalid configuration, a `TranscriptFailed` event will be sent
  with the contents of the `BadRequestException` generated by Amazon Transcribe.
  For more information on each parameter and which combinations are valid, refer
  to the
  [StartStreamTranscription](https://docs.aws.amazon.com/transcribe/latest/APIReference/API_streaming_StartStreamTranscription.html) API in the
  *Amazon Transcribe Developer Guide*.

  By default, Amazon Transcribe may use and store audio content processed by the
  service to develop and improve Amazon Web Services AI/ML services as
  further described in section 50 of the [Amazon Web Services Service
  Terms](https://aws.amazon.com/service-terms/). Using Amazon Transcribe
  may be subject to federal and state laws or regulations regarding the recording
  or interception of electronic communications. It is your and your end users’
  responsibility to comply with all applicable laws regarding the recording,
  including properly notifying all participants in a recorded session or
  communication
  that the session or communication is being recorded, and obtaining all necessary
  consents. You can opt out from Amazon Web Services using audio content to
  develop and
  improve AWS AI/ML services by configuring an AI services opt out policy using
  Amazon Web Services Organizations.
  """
  @spec start_meeting_transcription(
          map(),
          String.t() | atom(),
          start_meeting_transcription_request(),
          list()
        ) ::
          {:ok, nil, any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, start_meeting_transcription_errors()}
  def start_meeting_transcription(%Client{} = client, meeting_id, input, options \\ []) do
    url_path = "/meetings/#{AWS.Util.encode_uri(meeting_id)}/transcription?operation=start"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  Stops transcription for the specified `meetingId`.

  For more information, refer to [
  Using Amazon Chime SDK live transcription
  ](https://docs.aws.amazon.com/chime-sdk/latest/dg/meeting-transcription.html) in
  the *Amazon Chime SDK Developer Guide*.

  By default, Amazon Transcribe may use and store audio content processed by the
  service to develop and improve Amazon Web Services AI/ML services as
  further described in section 50 of the [Amazon Web Services Service Terms](https://aws.amazon.com/service-terms/). Using Amazon Transcribe
  may be subject to federal and state laws or regulations regarding the recording
  or interception of electronic communications. It is your and your end users’
  responsibility to comply with all applicable laws regarding the recording,
  including properly notifying all participants in a recorded session or
  communication
  that the session or communication is being recorded, and obtaining all necessary
  consents. You can opt out from Amazon Web Services using audio content to
  develop and
  improve Amazon Web Services AI/ML services by configuring an AI services opt out
  policy using Amazon Web Services Organizations.
  """
  @spec stop_meeting_transcription(
          map(),
          String.t() | atom(),
          stop_meeting_transcription_request(),
          list()
        ) ::
          {:ok, nil, any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, stop_meeting_transcription_errors()}
  def stop_meeting_transcription(%Client{} = client, meeting_id, input, options \\ []) do
    url_path = "/meetings/#{AWS.Util.encode_uri(meeting_id)}/transcription?operation=stop"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end

  @doc """
  The resource that supports tags.
  """
  @spec tag_resource(map(), tag_resource_request(), list()) ::
          {:ok, tag_resource_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, tag_resource_errors()}
  def tag_resource(%Client{} = client, input, options \\ []) do
    url_path = "/tags?operation=tag-resource"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      204
    )
  end

  @doc """
  Removes the specified tags from the specified resources.

  When you specify a tag key, the action removes both that key and its associated
  value. The operation succeeds even if you
  attempt to remove tags from a resource that were already removed. Note the
  following:

    *
  To remove tags from a resource, you need the necessary permissions for the
  service that the resource belongs to as well as permissions for removing tags.
  For more information,
  see the documentation for the service whose resource you want to untag.

    *
  You can only tag resources that are located in the specified Amazon Web Services
  Region for the calling Amazon Web Services account.

  ## Minimum permissions

  In addition to the `tag:UntagResources` permission required by this operation,
  you must also have the remove tags permission defined by the service that
  created the resource.
  For example, to remove the tags from an Amazon EC2 instance using the
  `UntagResources` operation, you must have both of the following permissions:

  `tag:UntagResource`

  `ChimeSDKMeetings:DeleteTags`
  """
  @spec untag_resource(map(), untag_resource_request(), list()) ::
          {:ok, untag_resource_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, untag_resource_errors()}
  def untag_resource(%Client{} = client, input, options \\ []) do
    url_path = "/tags?operation=untag-resource"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :post,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      204
    )
  end

  @doc """
  The capabilities that you want to update.

  You use the capabilities with a set of values that control what the capabilities
  can do, such as `SendReceive` data. For more information about those values, see
  .

  When using capabilities, be aware of these corner cases:

    *
  If you specify `MeetingFeatures:Video:MaxResolution:None` when you create a
  meeting, all API requests
  that include `SendReceive`, `Send`, or `Receive` for
  `AttendeeCapabilities:Video` will be rejected with `ValidationError 400`.

    *
  If you specify `MeetingFeatures:Content:MaxResolution:None` when you create a
  meeting, all API requests that include `SendReceive`, `Send`, or
  `Receive` for `AttendeeCapabilities:Content` will be rejected with
  `ValidationError 400`.

    *
  You can't set `content` capabilities to `SendReceive` or `Receive` unless you
  also set `video` capabilities to `SendReceive`
  or `Receive`. If you don't set the `video` capability to receive, the response
  will contain an HTTP 400 Bad Request status code. However, you can set your
  `video` capability
  to receive and you set your `content` capability to not receive.

    *
  If meeting features is defined as `Video:MaxResolution:None` but
  `Content:MaxResolution` is defined as something other than
  `None` and attendee capabilities are not defined in the API
  request, then the default attendee video capability is set to
  `Receive` and attendee content capability is set to
  `SendReceive`. This is because content `SendReceive`
  requires video to be at least `Receive`.

    *
  When you change an `audio` capability from `None` or `Receive` to `Send` or
  `SendReceive` ,
  and if the attendee left their microphone unmuted, audio will flow from the
  attendee to the other meeting participants.

    *
  When you change a `video` or `content` capability from `None` or `Receive` to
  `Send` or `SendReceive` ,
  and if the attendee turned on their video or content streams, remote attendees
  can receive those streams, but only after media renegotiation between the client
  and the Amazon Chime back-end server.
  """
  @spec update_attendee_capabilities(
          map(),
          String.t() | atom(),
          String.t() | atom(),
          update_attendee_capabilities_request(),
          list()
        ) ::
          {:ok, update_attendee_capabilities_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, update_attendee_capabilities_errors()}
  def update_attendee_capabilities(
        %Client{} = client,
        attendee_id,
        meeting_id,
        input,
        options \\ []
      ) do
    url_path =
      "/meetings/#{AWS.Util.encode_uri(meeting_id)}/attendees/#{AWS.Util.encode_uri(attendee_id)}/capabilities"

    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

    Request.request_rest(
      client,
      meta,
      :put,
      url_path,
      query_params,
      custom_headers ++ headers,
      input,
      options,
      200
    )
  end
end
