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

defmodule AWS.LicenseManagerLinuxSubscriptions do
  @moduledoc """
  With License Manager, you can discover and track your commercial Linux
  subscriptions on running
  Amazon EC2 instances.
  """

  alias AWS.Client
  alias AWS.Request

  @typedoc """

  ## Example:

      deregister_subscription_provider_request() :: %{
        required("SubscriptionProviderArn") => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      deregister_subscription_provider_response() :: %{}

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

  @typedoc """

  ## Example:

      filter() :: %{
        "Name" => [String.t() | atom()],
        "Operator" => String.t() | atom(),
        "Values" => list([String.t() | atom()]())
      }

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

  @typedoc """

  ## Example:

      get_registered_subscription_provider_request() :: %{
        required("SubscriptionProviderArn") => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      get_registered_subscription_provider_response() :: %{
        "LastSuccessfulDataRetrievalTime" => [String.t() | atom()],
        "SecretArn" => String.t() | atom(),
        "SubscriptionProviderArn" => String.t() | atom(),
        "SubscriptionProviderSource" => String.t() | atom(),
        "SubscriptionProviderStatus" => String.t() | atom(),
        "SubscriptionProviderStatusMessage" => [String.t() | atom()]
      }

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

  @typedoc """

  ## Example:

      get_service_settings_request() :: %{}

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

  @typedoc """

  ## Example:

      get_service_settings_response() :: %{
        optional("HomeRegions") => list([String.t() | atom()]()),
        optional("LinuxSubscriptionsDiscovery") => String.t() | atom(),
        optional("LinuxSubscriptionsDiscoverySettings") => linux_subscriptions_discovery_settings(),
        optional("Status") => String.t() | atom(),
        optional("StatusMessage") => map()
      }

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

  @typedoc """

  ## Example:

      instance() :: %{
        "AccountID" => [String.t() | atom()],
        "AmiId" => [String.t() | atom()],
        "DualSubscription" => [String.t() | atom()],
        "InstanceID" => [String.t() | atom()],
        "InstanceType" => [String.t() | atom()],
        "LastUpdatedTime" => [String.t() | atom()],
        "OsVersion" => [String.t() | atom()],
        "ProductCode" => list([String.t() | atom()]()),
        "Region" => [String.t() | atom()],
        "RegisteredWithSubscriptionProvider" => [String.t() | atom()],
        "Status" => [String.t() | atom()],
        "SubscriptionName" => [String.t() | atom()],
        "SubscriptionProviderCreateTime" => [String.t() | atom()],
        "SubscriptionProviderUpdateTime" => [String.t() | atom()],
        "UsageOperation" => [String.t() | atom()]
      }

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

  @typedoc """

  ## Example:

      internal_server_exception() :: %{
        "message" => [String.t() | atom()]
      }

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

  @typedoc """

  ## Example:

      linux_subscriptions_discovery_settings() :: %{
        "OrganizationIntegration" => String.t() | atom(),
        "SourceRegions" => list([String.t() | atom()]())
      }

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

  @typedoc """

  ## Example:

      list_linux_subscription_instances_request() :: %{
        "Filters" => list(filter()),
        "MaxResults" => integer(),
        "NextToken" => [String.t() | atom()]
      }

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

  @typedoc """

  ## Example:

      list_linux_subscription_instances_response() :: %{
        optional("Instances") => list(instance()),
        optional("NextToken") => [String.t() | atom()]
      }

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

  @typedoc """

  ## Example:

      list_linux_subscriptions_request() :: %{
        "Filters" => list(filter()),
        "MaxResults" => integer(),
        "NextToken" => [String.t() | atom()]
      }

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

  @typedoc """

  ## Example:

      list_linux_subscriptions_response() :: %{
        optional("NextToken") => [String.t() | atom()],
        optional("Subscriptions") => list(subscription())
      }

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

  @typedoc """

  ## Example:

      list_registered_subscription_providers_request() :: %{
        optional("MaxResults") => integer(),
        optional("NextToken") => [String.t() | atom()],
        optional("SubscriptionProviderSources") => list(String.t() | atom())
      }

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

  @typedoc """

  ## Example:

      list_registered_subscription_providers_response() :: %{
        "NextToken" => [String.t() | atom()],
        "RegisteredSubscriptionProviders" => list(registered_subscription_provider())
      }

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

  @typedoc """

  ## Example:

      list_tags_for_resource_request() :: %{}

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

  @typedoc """

  ## Example:

      list_tags_for_resource_response() :: %{
        "tags" => map()
      }

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

  @typedoc """

  ## Example:

      register_subscription_provider_request() :: %{
        optional("Tags") => map(),
        required("SecretArn") => String.t() | atom(),
        required("SubscriptionProviderSource") => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      register_subscription_provider_response() :: %{
        "SubscriptionProviderArn" => [String.t() | atom()],
        "SubscriptionProviderSource" => String.t() | atom(),
        "SubscriptionProviderStatus" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      registered_subscription_provider() :: %{
        "LastSuccessfulDataRetrievalTime" => [String.t() | atom()],
        "SecretArn" => String.t() | atom(),
        "SubscriptionProviderArn" => String.t() | atom(),
        "SubscriptionProviderSource" => String.t() | atom(),
        "SubscriptionProviderStatus" => String.t() | atom(),
        "SubscriptionProviderStatusMessage" => [String.t() | atom()]
      }

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

  @typedoc """

  ## Example:

      resource_not_found_exception() :: %{
        "message" => [String.t() | atom()]
      }

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

  @typedoc """

  ## Example:

      subscription() :: %{
        "InstanceCount" => float(),
        "Name" => [String.t() | atom()],
        "Type" => [String.t() | atom()]
      }

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

  @typedoc """

  ## Example:

      tag_resource_request() :: %{
        required("tags") => map()
      }

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

  @typedoc """

  ## Example:

      tag_resource_response() :: %{}

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

  @typedoc """

  ## Example:

      throttling_exception() :: %{
        "message" => [String.t() | atom()]
      }

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

  @typedoc """

  ## Example:

      untag_resource_request() :: %{
        required("tagKeys") => list([String.t() | atom()]())
      }

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

  @typedoc """

  ## Example:

      untag_resource_response() :: %{}

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

  @typedoc """

  ## Example:

      update_service_settings_request() :: %{
        optional("AllowUpdate") => [boolean()],
        required("LinuxSubscriptionsDiscovery") => String.t() | atom(),
        required("LinuxSubscriptionsDiscoverySettings") => linux_subscriptions_discovery_settings()
      }

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

  @typedoc """

  ## Example:

      update_service_settings_response() :: %{
        optional("HomeRegions") => list([String.t() | atom()]()),
        optional("LinuxSubscriptionsDiscovery") => String.t() | atom(),
        optional("LinuxSubscriptionsDiscoverySettings") => linux_subscriptions_discovery_settings(),
        optional("Status") => String.t() | atom(),
        optional("StatusMessage") => map()
      }

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

  @typedoc """

  ## Example:

      validation_exception() :: %{
        "message" => [String.t() | atom()]
      }

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

  @type deregister_subscription_provider_errors() ::
          validation_exception()
          | throttling_exception()
          | resource_not_found_exception()
          | internal_server_exception()

  @type get_registered_subscription_provider_errors() ::
          validation_exception()
          | throttling_exception()
          | resource_not_found_exception()
          | internal_server_exception()

  @type get_service_settings_errors() ::
          validation_exception() | throttling_exception() | internal_server_exception()

  @type list_linux_subscription_instances_errors() ::
          validation_exception() | throttling_exception() | internal_server_exception()

  @type list_linux_subscriptions_errors() ::
          validation_exception() | throttling_exception() | internal_server_exception()

  @type list_registered_subscription_providers_errors() ::
          validation_exception() | throttling_exception() | internal_server_exception()

  @type list_tags_for_resource_errors() ::
          validation_exception() | resource_not_found_exception() | internal_server_exception()

  @type register_subscription_provider_errors() ::
          validation_exception() | throttling_exception() | internal_server_exception()

  @type tag_resource_errors() ::
          validation_exception() | resource_not_found_exception() | internal_server_exception()

  @type untag_resource_errors() :: resource_not_found_exception() | internal_server_exception()

  @type update_service_settings_errors() ::
          validation_exception() | throttling_exception() | internal_server_exception()

  def metadata do
    %{
      api_version: "2018-05-10",
      content_type: "application/x-amz-json-1.1",
      credential_scope: nil,
      endpoint_prefix: "license-manager-linux-subscriptions",
      global?: false,
      hostname: nil,
      protocol: "rest-json",
      service_id: "License Manager Linux Subscriptions",
      signature_version: "v4",
      signing_name: "license-manager-linux-subscriptions",
      target_prefix: nil
    }
  end

  @doc """
  Remove a third-party subscription provider from the Bring Your Own License
  (BYOL) subscriptions
  registered to your account.
  """
  @spec deregister_subscription_provider(
          map(),
          deregister_subscription_provider_request(),
          list()
        ) ::
          {:ok, deregister_subscription_provider_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, deregister_subscription_provider_errors()}
  def deregister_subscription_provider(%Client{} = client, input, options \\ []) do
    url_path = "/subscription/DeregisterSubscriptionProvider"
    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 """
  Get details for a Bring Your Own License (BYOL) subscription that's registered
  to your account.
  """
  @spec get_registered_subscription_provider(
          map(),
          get_registered_subscription_provider_request(),
          list()
        ) ::
          {:ok, get_registered_subscription_provider_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, get_registered_subscription_provider_errors()}
  def get_registered_subscription_provider(%Client{} = client, input, options \\ []) do
    url_path = "/subscription/GetRegisteredSubscriptionProvider"
    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 """
  Lists the Linux subscriptions service settings for your account.
  """
  @spec get_service_settings(map(), get_service_settings_request(), list()) ::
          {:ok, get_service_settings_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, get_service_settings_errors()}
  def get_service_settings(%Client{} = client, input, options \\ []) do
    url_path = "/subscription/GetServiceSettings"
    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 """
  Lists the running Amazon EC2 instances that were discovered with commercial
  Linux
  subscriptions.
  """
  @spec list_linux_subscription_instances(
          map(),
          list_linux_subscription_instances_request(),
          list()
        ) ::
          {:ok, list_linux_subscription_instances_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_linux_subscription_instances_errors()}
  def list_linux_subscription_instances(%Client{} = client, input, options \\ []) do
    url_path = "/subscription/ListLinuxSubscriptionInstances"
    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 """
  Lists the Linux subscriptions that have been discovered.

  If you have linked your
  organization, the returned results will include data aggregated across your
  accounts in
  Organizations.
  """
  @spec list_linux_subscriptions(map(), list_linux_subscriptions_request(), list()) ::
          {:ok, list_linux_subscriptions_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_linux_subscriptions_errors()}
  def list_linux_subscriptions(%Client{} = client, input, options \\ []) do
    url_path = "/subscription/ListLinuxSubscriptions"
    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 """
  List Bring Your Own License (BYOL) subscription registration resources for your
  account.
  """
  @spec list_registered_subscription_providers(
          map(),
          list_registered_subscription_providers_request(),
          list()
        ) ::
          {:ok, list_registered_subscription_providers_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_registered_subscription_providers_errors()}
  def list_registered_subscription_providers(%Client{} = client, input, options \\ []) do
    url_path = "/subscription/ListRegisteredSubscriptionProviders"
    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 """
  List the metadata tags that are assigned to the
  specified Amazon Web Services 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/#{AWS.Util.encode_uri(resource_arn)}"
    headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Register the supported third-party subscription provider for your Bring Your Own
  License (BYOL) subscription.
  """
  @spec register_subscription_provider(map(), register_subscription_provider_request(), list()) ::
          {:ok, register_subscription_provider_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, register_subscription_provider_errors()}
  def register_subscription_provider(%Client{} = client, input, options \\ []) do
    url_path = "/subscription/RegisterSubscriptionProvider"
    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 """
  Add metadata tags to the specified Amazon Web Services resource.
  """
  @spec tag_resource(map(), String.t() | atom(), tag_resource_request(), list()) ::
          {:ok, tag_resource_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, tag_resource_errors()}
  def tag_resource(%Client{} = client, resource_arn, input, options \\ []) do
    url_path = "/tags/#{AWS.Util.encode_uri(resource_arn)}"
    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 """
  Remove one or more metadata tag from the specified Amazon Web Services resource.
  """
  @spec untag_resource(map(), String.t() | atom(), untag_resource_request(), list()) ::
          {:ok, untag_resource_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, untag_resource_errors()}
  def untag_resource(%Client{} = client, resource_arn, input, options \\ []) do
    url_path = "/tags/#{AWS.Util.encode_uri(resource_arn)}"
    headers = []
    custom_headers = []

    {query_params, input} =
      [
        {"tagKeys", "tagKeys"}
      ]
      |> Request.build_params(input)

    meta = metadata()

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

  @doc """
  Updates the service settings for Linux subscriptions.
  """
  @spec update_service_settings(map(), update_service_settings_request(), list()) ::
          {:ok, update_service_settings_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, update_service_settings_errors()}
  def update_service_settings(%Client{} = client, input, options \\ []) do
    url_path = "/subscription/UpdateServiceSettings"
    headers = []
    custom_headers = []
    query_params = []

    meta = metadata()

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