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

defmodule AWS.IoTJobsDataPlane do
  @moduledoc """
  IoT Jobs is a service that allows you to define a set of jobs — remote
  operations
  that are sent to and executed on one or more devices connected to Amazon Web
  Services IoT Core.

  For example,
  you can define a job that instructs a set of devices to download and install
  application or
  firmware updates, reboot, rotate certificates, or perform remote troubleshooting
  operations.

  Find the endpoint address for actions in the IoT jobs data plane by running this
  CLI command:

  `aws iot describe-endpoint --endpoint-type iot:Jobs`

  The service name used by [Amazon Web Services Signature Version
  4](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html) to
  sign requests is:
  *iot-jobs-data*.

  To create a job, you make a job document which is a description of the remote
  operations to be performed, and you specify a list of targets that should
  perform the
  operations. The targets can be individual things, thing groups or both.

  IoT Jobs sends a message to inform the targets that a job is available. The
  target
  starts the execution of the job by downloading the job document, performing the
  operations
  it specifies, and reporting its progress to Amazon Web Services IoT Core. The
  Jobs service provides commands
  to track the progress of a job on a specific target and for all the targets of
  the
  job
  """

  alias AWS.Client
  alias AWS.Request

  @typedoc """

  ## Example:

      certificate_validation_exception() :: %{
        "message" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      command_parameter_value() :: %{
        "B" => boolean(),
        "BIN" => binary(),
        "D" => float(),
        "I" => integer(),
        "L" => float(),
        "S" => String.t() | atom(),
        "UL" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      conflict_exception() :: %{
        "message" => String.t() | atom(),
        "resourceId" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      describe_job_execution_request() :: %{
        optional("executionNumber") => float(),
        optional("includeJobDocument") => boolean()
      }

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

  @typedoc """

  ## Example:

      describe_job_execution_response() :: %{
        "execution" => job_execution()
      }

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

  @typedoc """

  ## Example:

      get_pending_job_executions_request() :: %{}

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

  @typedoc """

  ## Example:

      get_pending_job_executions_response() :: %{
        "inProgressJobs" => list(job_execution_summary()),
        "queuedJobs" => list(job_execution_summary())
      }

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

  @typedoc """

  ## Example:

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

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

  @typedoc """

  ## Example:

      invalid_request_exception() :: %{
        "message" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      invalid_state_transition_exception() :: %{
        "message" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      job_execution() :: %{
        "approximateSecondsBeforeTimedOut" => float(),
        "executionNumber" => float(),
        "jobDocument" => String.t() | atom(),
        "jobId" => String.t() | atom(),
        "lastUpdatedAt" => float(),
        "queuedAt" => float(),
        "startedAt" => float(),
        "status" => list(any()),
        "statusDetails" => map(),
        "thingName" => String.t() | atom(),
        "versionNumber" => float()
      }

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

  @typedoc """

  ## Example:

      job_execution_state() :: %{
        "status" => list(any()),
        "statusDetails" => map(),
        "versionNumber" => float()
      }

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

  @typedoc """

  ## Example:

      job_execution_summary() :: %{
        "executionNumber" => float(),
        "jobId" => String.t() | atom(),
        "lastUpdatedAt" => float(),
        "queuedAt" => float(),
        "startedAt" => float(),
        "versionNumber" => float()
      }

  """
  @type job_execution_summary() :: %{(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:

      service_quota_exceeded_exception() :: %{
        "message" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      service_unavailable_exception() :: %{
        "message" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      start_command_execution_request() :: %{
        optional("clientToken") => String.t() | atom(),
        optional("executionTimeoutSeconds") => float(),
        optional("parameters") => map(),
        required("commandArn") => String.t() | atom(),
        required("targetArn") => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      start_command_execution_response() :: %{
        "executionId" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      start_next_pending_job_execution_request() :: %{
        optional("statusDetails") => map(),
        optional("stepTimeoutInMinutes") => float()
      }

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

  @typedoc """

  ## Example:

      start_next_pending_job_execution_response() :: %{
        "execution" => job_execution()
      }

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

  @typedoc """

  ## Example:

      terminal_state_exception() :: %{
        "message" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

      throttling_exception() :: %{
        "message" => String.t() | atom(),
        "payload" => binary()
      }

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

  @typedoc """

  ## Example:

      update_job_execution_request() :: %{
        optional("executionNumber") => float(),
        optional("expectedVersion") => float(),
        optional("includeJobDocument") => boolean(),
        optional("includeJobExecutionState") => boolean(),
        optional("statusDetails") => map(),
        optional("stepTimeoutInMinutes") => float(),
        required("status") => list(any())
      }

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

  @typedoc """

  ## Example:

      update_job_execution_response() :: %{
        "executionState" => job_execution_state(),
        "jobDocument" => String.t() | atom()
      }

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

  @typedoc """

  ## Example:

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

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

  @type describe_job_execution_errors() ::
          throttling_exception()
          | terminal_state_exception()
          | service_unavailable_exception()
          | resource_not_found_exception()
          | invalid_request_exception()
          | certificate_validation_exception()

  @type get_pending_job_executions_errors() ::
          throttling_exception()
          | service_unavailable_exception()
          | resource_not_found_exception()
          | invalid_request_exception()
          | certificate_validation_exception()

  @type start_command_execution_errors() ::
          validation_exception()
          | throttling_exception()
          | service_quota_exceeded_exception()
          | resource_not_found_exception()
          | internal_server_exception()
          | conflict_exception()

  @type start_next_pending_job_execution_errors() ::
          throttling_exception()
          | service_unavailable_exception()
          | resource_not_found_exception()
          | invalid_request_exception()
          | certificate_validation_exception()

  @type update_job_execution_errors() ::
          throttling_exception()
          | service_unavailable_exception()
          | resource_not_found_exception()
          | invalid_state_transition_exception()
          | invalid_request_exception()
          | certificate_validation_exception()

  def metadata do
    %{
      api_version: "2017-09-29",
      content_type: "application/x-amz-json-1.1",
      credential_scope: nil,
      endpoint_prefix: "data.jobs.iot",
      global?: false,
      hostname: nil,
      protocol: "rest-json",
      service_id: "IoT Jobs Data Plane",
      signature_version: "v4",
      signing_name: "iot-jobs-data",
      target_prefix: nil
    }
  end

  @doc """
  Gets details of a job execution.

  Requires permission to access the
  [DescribeJobExecution](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsiot.html#awsiot-actions-as-permissions)
  action.
  """
  @spec describe_job_execution(
          map(),
          String.t() | atom(),
          String.t() | atom(),
          String.t() | atom() | nil,
          String.t() | atom() | nil,
          list()
        ) ::
          {:ok, describe_job_execution_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, describe_job_execution_errors()}
  def describe_job_execution(
        %Client{} = client,
        job_id,
        thing_name,
        execution_number \\ nil,
        include_job_document \\ nil,
        options \\ []
      ) do
    url_path = "/things/#{AWS.Util.encode_uri(thing_name)}/jobs/#{AWS.Util.encode_uri(job_id)}"
    headers = []
    query_params = []

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

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

    meta = metadata()

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

  @doc """
  Gets the list of all jobs for a thing that are not in a terminal status.

  Requires permission to access the
  [GetPendingJobExecutions](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsiot.html#awsiot-actions-as-permissions)
  action.
  """
  @spec get_pending_job_executions(map(), String.t() | atom(), list()) ::
          {:ok, get_pending_job_executions_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, get_pending_job_executions_errors()}
  def get_pending_job_executions(%Client{} = client, thing_name, options \\ []) do
    url_path = "/things/#{AWS.Util.encode_uri(thing_name)}/jobs"
    headers = []
    query_params = []

    meta = metadata()

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

  @doc """
  Using the command created with the `CreateCommand` API, start a command
  execution on a specific device.
  """
  @spec start_command_execution(map(), start_command_execution_request(), list()) ::
          {:ok, start_command_execution_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, start_command_execution_errors()}
  def start_command_execution(%Client{} = client, input, options \\ []) do
    url_path = "/command-executions"
    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 """
  Gets and starts the next pending (status IN_PROGRESS or QUEUED) job execution
  for a
  thing.

  Requires permission to access the
  [StartNextPendingJobExecution](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsiot.html#awsiot-actions-as-permissions)
  action.
  """
  @spec start_next_pending_job_execution(
          map(),
          String.t() | atom(),
          start_next_pending_job_execution_request(),
          list()
        ) ::
          {:ok, start_next_pending_job_execution_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, start_next_pending_job_execution_errors()}
  def start_next_pending_job_execution(%Client{} = client, thing_name, input, options \\ []) do
    url_path = "/things/#{AWS.Util.encode_uri(thing_name)}/jobs/$next"
    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 """
  Updates the status of a job execution.

  Requires permission to access the
  [UpdateJobExecution](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsiotjobsdataplane.html)
  action.
  """
  @spec update_job_execution(
          map(),
          String.t() | atom(),
          String.t() | atom(),
          update_job_execution_request(),
          list()
        ) ::
          {:ok, update_job_execution_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, update_job_execution_errors()}
  def update_job_execution(%Client{} = client, job_id, thing_name, input, options \\ []) do
    url_path = "/things/#{AWS.Util.encode_uri(thing_name)}/jobs/#{AWS.Util.encode_uri(job_id)}"
    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
