{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -fno-warn-unused-binds #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}

-- Derived from AWS service descriptions, licensed under Apache 2.0.

-- |
-- Module      : Amazonka.IoTWireless.UpdateResourcePosition
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Update the position information of a given wireless device or a wireless
-- gateway resource. The postion coordinates are based on the
-- <https://gisgeography.com/wgs84-world-geodetic-system/ World Geodetic System (WGS84)>.
module Amazonka.IoTWireless.UpdateResourcePosition
  ( -- * Creating a Request
    UpdateResourcePosition (..),
    newUpdateResourcePosition,

    -- * Request Lenses
    updateResourcePosition_geoJsonPayload,
    updateResourcePosition_resourceIdentifier,
    updateResourcePosition_resourceType,

    -- * Destructuring the Response
    UpdateResourcePositionResponse (..),
    newUpdateResourcePositionResponse,

    -- * Response Lenses
    updateResourcePositionResponse_httpStatus,
  )
where

import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import qualified Amazonka.Data as Data
import Amazonka.IoTWireless.Types
import qualified Amazonka.Prelude as Prelude
import qualified Amazonka.Request as Request
import qualified Amazonka.Response as Response

-- | /See:/ 'newUpdateResourcePosition' smart constructor.
data UpdateResourcePosition = UpdateResourcePosition'
  { -- | The position information of the resource, displayed as a JSON payload.
    -- The payload uses the GeoJSON format, which a format that\'s used to
    -- encode geographic data structures. For more information, see
    -- <https://geojson.org/ GeoJSON>.
    UpdateResourcePosition -> Maybe ByteString
geoJsonPayload :: Prelude.Maybe Prelude.ByteString,
    -- | The identifier of the resource for which position information is
    -- updated. It can be the wireless device ID or the wireless gateway ID
    -- depending on the resource type.
    UpdateResourcePosition -> Text
resourceIdentifier :: Prelude.Text,
    -- | The type of resource for which position information is updated, which
    -- can be a wireless device or a wireless gateway.
    UpdateResourcePosition -> PositionResourceType
resourceType :: PositionResourceType
  }
  deriving (UpdateResourcePosition -> UpdateResourcePosition -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: UpdateResourcePosition -> UpdateResourcePosition -> Bool
$c/= :: UpdateResourcePosition -> UpdateResourcePosition -> Bool
== :: UpdateResourcePosition -> UpdateResourcePosition -> Bool
$c== :: UpdateResourcePosition -> UpdateResourcePosition -> Bool
Prelude.Eq, ReadPrec [UpdateResourcePosition]
ReadPrec UpdateResourcePosition
Int -> ReadS UpdateResourcePosition
ReadS [UpdateResourcePosition]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [UpdateResourcePosition]
$creadListPrec :: ReadPrec [UpdateResourcePosition]
readPrec :: ReadPrec UpdateResourcePosition
$creadPrec :: ReadPrec UpdateResourcePosition
readList :: ReadS [UpdateResourcePosition]
$creadList :: ReadS [UpdateResourcePosition]
readsPrec :: Int -> ReadS UpdateResourcePosition
$creadsPrec :: Int -> ReadS UpdateResourcePosition
Prelude.Read, Int -> UpdateResourcePosition -> ShowS
[UpdateResourcePosition] -> ShowS
UpdateResourcePosition -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [UpdateResourcePosition] -> ShowS
$cshowList :: [UpdateResourcePosition] -> ShowS
show :: UpdateResourcePosition -> String
$cshow :: UpdateResourcePosition -> String
showsPrec :: Int -> UpdateResourcePosition -> ShowS
$cshowsPrec :: Int -> UpdateResourcePosition -> ShowS
Prelude.Show, forall x. Rep UpdateResourcePosition x -> UpdateResourcePosition
forall x. UpdateResourcePosition -> Rep UpdateResourcePosition x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep UpdateResourcePosition x -> UpdateResourcePosition
$cfrom :: forall x. UpdateResourcePosition -> Rep UpdateResourcePosition x
Prelude.Generic)

-- |
-- Create a value of 'UpdateResourcePosition' with all optional fields omitted.
--
-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
--
-- The following record fields are available, with the corresponding lenses provided
-- for backwards compatibility:
--
-- 'geoJsonPayload', 'updateResourcePosition_geoJsonPayload' - The position information of the resource, displayed as a JSON payload.
-- The payload uses the GeoJSON format, which a format that\'s used to
-- encode geographic data structures. For more information, see
-- <https://geojson.org/ GeoJSON>.
--
-- 'resourceIdentifier', 'updateResourcePosition_resourceIdentifier' - The identifier of the resource for which position information is
-- updated. It can be the wireless device ID or the wireless gateway ID
-- depending on the resource type.
--
-- 'resourceType', 'updateResourcePosition_resourceType' - The type of resource for which position information is updated, which
-- can be a wireless device or a wireless gateway.
newUpdateResourcePosition ::
  -- | 'resourceIdentifier'
  Prelude.Text ->
  -- | 'resourceType'
  PositionResourceType ->
  UpdateResourcePosition
newUpdateResourcePosition :: Text -> PositionResourceType -> UpdateResourcePosition
newUpdateResourcePosition
  Text
pResourceIdentifier_
  PositionResourceType
pResourceType_ =
    UpdateResourcePosition'
      { $sel:geoJsonPayload:UpdateResourcePosition' :: Maybe ByteString
geoJsonPayload =
          forall a. Maybe a
Prelude.Nothing,
        $sel:resourceIdentifier:UpdateResourcePosition' :: Text
resourceIdentifier = Text
pResourceIdentifier_,
        $sel:resourceType:UpdateResourcePosition' :: PositionResourceType
resourceType = PositionResourceType
pResourceType_
      }

-- | The position information of the resource, displayed as a JSON payload.
-- The payload uses the GeoJSON format, which a format that\'s used to
-- encode geographic data structures. For more information, see
-- <https://geojson.org/ GeoJSON>.
updateResourcePosition_geoJsonPayload :: Lens.Lens' UpdateResourcePosition (Prelude.Maybe Prelude.ByteString)
updateResourcePosition_geoJsonPayload :: Lens' UpdateResourcePosition (Maybe ByteString)
updateResourcePosition_geoJsonPayload = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\UpdateResourcePosition' {Maybe ByteString
geoJsonPayload :: Maybe ByteString
$sel:geoJsonPayload:UpdateResourcePosition' :: UpdateResourcePosition -> Maybe ByteString
geoJsonPayload} -> Maybe ByteString
geoJsonPayload) (\s :: UpdateResourcePosition
s@UpdateResourcePosition' {} Maybe ByteString
a -> UpdateResourcePosition
s {$sel:geoJsonPayload:UpdateResourcePosition' :: Maybe ByteString
geoJsonPayload = Maybe ByteString
a} :: UpdateResourcePosition)

-- | The identifier of the resource for which position information is
-- updated. It can be the wireless device ID or the wireless gateway ID
-- depending on the resource type.
updateResourcePosition_resourceIdentifier :: Lens.Lens' UpdateResourcePosition Prelude.Text
updateResourcePosition_resourceIdentifier :: Lens' UpdateResourcePosition Text
updateResourcePosition_resourceIdentifier = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\UpdateResourcePosition' {Text
resourceIdentifier :: Text
$sel:resourceIdentifier:UpdateResourcePosition' :: UpdateResourcePosition -> Text
resourceIdentifier} -> Text
resourceIdentifier) (\s :: UpdateResourcePosition
s@UpdateResourcePosition' {} Text
a -> UpdateResourcePosition
s {$sel:resourceIdentifier:UpdateResourcePosition' :: Text
resourceIdentifier = Text
a} :: UpdateResourcePosition)

-- | The type of resource for which position information is updated, which
-- can be a wireless device or a wireless gateway.
updateResourcePosition_resourceType :: Lens.Lens' UpdateResourcePosition PositionResourceType
updateResourcePosition_resourceType :: Lens' UpdateResourcePosition PositionResourceType
updateResourcePosition_resourceType = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\UpdateResourcePosition' {PositionResourceType
resourceType :: PositionResourceType
$sel:resourceType:UpdateResourcePosition' :: UpdateResourcePosition -> PositionResourceType
resourceType} -> PositionResourceType
resourceType) (\s :: UpdateResourcePosition
s@UpdateResourcePosition' {} PositionResourceType
a -> UpdateResourcePosition
s {$sel:resourceType:UpdateResourcePosition' :: PositionResourceType
resourceType = PositionResourceType
a} :: UpdateResourcePosition)

instance Core.AWSRequest UpdateResourcePosition where
  type
    AWSResponse UpdateResourcePosition =
      UpdateResourcePositionResponse
  request :: (Service -> Service)
-> UpdateResourcePosition -> Request UpdateResourcePosition
request Service -> Service
overrides =
    forall a. (ToRequest a, ToBody a) => Service -> a -> Request a
Request.patchBody (Service -> Service
overrides Service
defaultService)
  response :: forall (m :: * -> *).
MonadResource m =>
(ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy UpdateResourcePosition
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse UpdateResourcePosition)))
response =
    forall (m :: * -> *) a.
MonadResource m =>
(Int -> ResponseHeaders -> () -> Either String (AWSResponse a))
-> (ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveEmpty
      ( \Int
s ResponseHeaders
h ()
x ->
          Int -> UpdateResourcePositionResponse
UpdateResourcePositionResponse'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (forall (f :: * -> *) a. Applicative f => a -> f a
Prelude.pure (forall a. Enum a => a -> Int
Prelude.fromEnum Int
s))
      )

instance Prelude.Hashable UpdateResourcePosition where
  hashWithSalt :: Int -> UpdateResourcePosition -> Int
hashWithSalt Int
_salt UpdateResourcePosition' {Maybe ByteString
Text
PositionResourceType
resourceType :: PositionResourceType
resourceIdentifier :: Text
geoJsonPayload :: Maybe ByteString
$sel:resourceType:UpdateResourcePosition' :: UpdateResourcePosition -> PositionResourceType
$sel:resourceIdentifier:UpdateResourcePosition' :: UpdateResourcePosition -> Text
$sel:geoJsonPayload:UpdateResourcePosition' :: UpdateResourcePosition -> Maybe ByteString
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe ByteString
geoJsonPayload
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
resourceIdentifier
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` PositionResourceType
resourceType

instance Prelude.NFData UpdateResourcePosition where
  rnf :: UpdateResourcePosition -> ()
rnf UpdateResourcePosition' {Maybe ByteString
Text
PositionResourceType
resourceType :: PositionResourceType
resourceIdentifier :: Text
geoJsonPayload :: Maybe ByteString
$sel:resourceType:UpdateResourcePosition' :: UpdateResourcePosition -> PositionResourceType
$sel:resourceIdentifier:UpdateResourcePosition' :: UpdateResourcePosition -> Text
$sel:geoJsonPayload:UpdateResourcePosition' :: UpdateResourcePosition -> Maybe ByteString
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe ByteString
geoJsonPayload
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
resourceIdentifier
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf PositionResourceType
resourceType

instance Data.ToBody UpdateResourcePosition where
  toBody :: UpdateResourcePosition -> RequestBody
toBody UpdateResourcePosition' {Maybe ByteString
Text
PositionResourceType
resourceType :: PositionResourceType
resourceIdentifier :: Text
geoJsonPayload :: Maybe ByteString
$sel:resourceType:UpdateResourcePosition' :: UpdateResourcePosition -> PositionResourceType
$sel:resourceIdentifier:UpdateResourcePosition' :: UpdateResourcePosition -> Text
$sel:geoJsonPayload:UpdateResourcePosition' :: UpdateResourcePosition -> Maybe ByteString
..} =
    forall a. ToBody a => a -> RequestBody
Data.toBody Maybe ByteString
geoJsonPayload

instance Data.ToHeaders UpdateResourcePosition where
  toHeaders :: UpdateResourcePosition -> ResponseHeaders
toHeaders = forall a b. a -> b -> a
Prelude.const forall a. Monoid a => a
Prelude.mempty

instance Data.ToPath UpdateResourcePosition where
  toPath :: UpdateResourcePosition -> ByteString
toPath UpdateResourcePosition' {Maybe ByteString
Text
PositionResourceType
resourceType :: PositionResourceType
resourceIdentifier :: Text
geoJsonPayload :: Maybe ByteString
$sel:resourceType:UpdateResourcePosition' :: UpdateResourcePosition -> PositionResourceType
$sel:resourceIdentifier:UpdateResourcePosition' :: UpdateResourcePosition -> Text
$sel:geoJsonPayload:UpdateResourcePosition' :: UpdateResourcePosition -> Maybe ByteString
..} =
    forall a. Monoid a => [a] -> a
Prelude.mconcat
      [ ByteString
"/resource-positions/",
        forall a. ToByteString a => a -> ByteString
Data.toBS Text
resourceIdentifier
      ]

instance Data.ToQuery UpdateResourcePosition where
  toQuery :: UpdateResourcePosition -> QueryString
toQuery UpdateResourcePosition' {Maybe ByteString
Text
PositionResourceType
resourceType :: PositionResourceType
resourceIdentifier :: Text
geoJsonPayload :: Maybe ByteString
$sel:resourceType:UpdateResourcePosition' :: UpdateResourcePosition -> PositionResourceType
$sel:resourceIdentifier:UpdateResourcePosition' :: UpdateResourcePosition -> Text
$sel:geoJsonPayload:UpdateResourcePosition' :: UpdateResourcePosition -> Maybe ByteString
..} =
    forall a. Monoid a => [a] -> a
Prelude.mconcat
      [ByteString
"resourceType" forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: PositionResourceType
resourceType]

-- | /See:/ 'newUpdateResourcePositionResponse' smart constructor.
data UpdateResourcePositionResponse = UpdateResourcePositionResponse'
  { -- | The response's http status code.
    UpdateResourcePositionResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (UpdateResourcePositionResponse
-> UpdateResourcePositionResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: UpdateResourcePositionResponse
-> UpdateResourcePositionResponse -> Bool
$c/= :: UpdateResourcePositionResponse
-> UpdateResourcePositionResponse -> Bool
== :: UpdateResourcePositionResponse
-> UpdateResourcePositionResponse -> Bool
$c== :: UpdateResourcePositionResponse
-> UpdateResourcePositionResponse -> Bool
Prelude.Eq, ReadPrec [UpdateResourcePositionResponse]
ReadPrec UpdateResourcePositionResponse
Int -> ReadS UpdateResourcePositionResponse
ReadS [UpdateResourcePositionResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [UpdateResourcePositionResponse]
$creadListPrec :: ReadPrec [UpdateResourcePositionResponse]
readPrec :: ReadPrec UpdateResourcePositionResponse
$creadPrec :: ReadPrec UpdateResourcePositionResponse
readList :: ReadS [UpdateResourcePositionResponse]
$creadList :: ReadS [UpdateResourcePositionResponse]
readsPrec :: Int -> ReadS UpdateResourcePositionResponse
$creadsPrec :: Int -> ReadS UpdateResourcePositionResponse
Prelude.Read, Int -> UpdateResourcePositionResponse -> ShowS
[UpdateResourcePositionResponse] -> ShowS
UpdateResourcePositionResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [UpdateResourcePositionResponse] -> ShowS
$cshowList :: [UpdateResourcePositionResponse] -> ShowS
show :: UpdateResourcePositionResponse -> String
$cshow :: UpdateResourcePositionResponse -> String
showsPrec :: Int -> UpdateResourcePositionResponse -> ShowS
$cshowsPrec :: Int -> UpdateResourcePositionResponse -> ShowS
Prelude.Show, forall x.
Rep UpdateResourcePositionResponse x
-> UpdateResourcePositionResponse
forall x.
UpdateResourcePositionResponse
-> Rep UpdateResourcePositionResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep UpdateResourcePositionResponse x
-> UpdateResourcePositionResponse
$cfrom :: forall x.
UpdateResourcePositionResponse
-> Rep UpdateResourcePositionResponse x
Prelude.Generic)

-- |
-- Create a value of 'UpdateResourcePositionResponse' with all optional fields omitted.
--
-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
--
-- The following record fields are available, with the corresponding lenses provided
-- for backwards compatibility:
--
-- 'httpStatus', 'updateResourcePositionResponse_httpStatus' - The response's http status code.
newUpdateResourcePositionResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  UpdateResourcePositionResponse
newUpdateResourcePositionResponse :: Int -> UpdateResourcePositionResponse
newUpdateResourcePositionResponse Int
pHttpStatus_ =
  UpdateResourcePositionResponse'
    { $sel:httpStatus:UpdateResourcePositionResponse' :: Int
httpStatus =
        Int
pHttpStatus_
    }

-- | The response's http status code.
updateResourcePositionResponse_httpStatus :: Lens.Lens' UpdateResourcePositionResponse Prelude.Int
updateResourcePositionResponse_httpStatus :: Lens' UpdateResourcePositionResponse Int
updateResourcePositionResponse_httpStatus = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\UpdateResourcePositionResponse' {Int
httpStatus :: Int
$sel:httpStatus:UpdateResourcePositionResponse' :: UpdateResourcePositionResponse -> Int
httpStatus} -> Int
httpStatus) (\s :: UpdateResourcePositionResponse
s@UpdateResourcePositionResponse' {} Int
a -> UpdateResourcePositionResponse
s {$sel:httpStatus:UpdateResourcePositionResponse' :: Int
httpStatus = Int
a} :: UpdateResourcePositionResponse)

instance
  Prelude.NFData
    UpdateResourcePositionResponse
  where
  rnf :: UpdateResourcePositionResponse -> ()
rnf UpdateResourcePositionResponse' {Int
httpStatus :: Int
$sel:httpStatus:UpdateResourcePositionResponse' :: UpdateResourcePositionResponse -> Int
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Int
httpStatus