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

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

-- |
-- Module      : Amazonka.Wisdom.Types.RecommendationData
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
module Amazonka.Wisdom.Types.RecommendationData where

import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import qualified Amazonka.Data as Data
import qualified Amazonka.Prelude as Prelude
import Amazonka.Wisdom.Types.Document
import Amazonka.Wisdom.Types.RecommendationType
import Amazonka.Wisdom.Types.RelevanceLevel

-- | Information about the recommendation.
--
-- /See:/ 'newRecommendationData' smart constructor.
data RecommendationData = RecommendationData'
  { -- | The relevance level of the recommendation.
    RecommendationData -> Maybe RelevanceLevel
relevanceLevel :: Prelude.Maybe RelevanceLevel,
    -- | The relevance score of the recommendation.
    RecommendationData -> Maybe Double
relevanceScore :: Prelude.Maybe Prelude.Double,
    -- | The type of recommendation.
    RecommendationData -> Maybe RecommendationType
type' :: Prelude.Maybe RecommendationType,
    -- | The recommended document.
    RecommendationData -> Document
document :: Document,
    -- | The identifier of the recommendation.
    RecommendationData -> Text
recommendationId :: Prelude.Text
  }
  deriving (RecommendationData -> RecommendationData -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: RecommendationData -> RecommendationData -> Bool
$c/= :: RecommendationData -> RecommendationData -> Bool
== :: RecommendationData -> RecommendationData -> Bool
$c== :: RecommendationData -> RecommendationData -> Bool
Prelude.Eq, Int -> RecommendationData -> ShowS
[RecommendationData] -> ShowS
RecommendationData -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RecommendationData] -> ShowS
$cshowList :: [RecommendationData] -> ShowS
show :: RecommendationData -> String
$cshow :: RecommendationData -> String
showsPrec :: Int -> RecommendationData -> ShowS
$cshowsPrec :: Int -> RecommendationData -> ShowS
Prelude.Show, forall x. Rep RecommendationData x -> RecommendationData
forall x. RecommendationData -> Rep RecommendationData x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep RecommendationData x -> RecommendationData
$cfrom :: forall x. RecommendationData -> Rep RecommendationData x
Prelude.Generic)

-- |
-- Create a value of 'RecommendationData' 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:
--
-- 'relevanceLevel', 'recommendationData_relevanceLevel' - The relevance level of the recommendation.
--
-- 'relevanceScore', 'recommendationData_relevanceScore' - The relevance score of the recommendation.
--
-- 'type'', 'recommendationData_type' - The type of recommendation.
--
-- 'document', 'recommendationData_document' - The recommended document.
--
-- 'recommendationId', 'recommendationData_recommendationId' - The identifier of the recommendation.
newRecommendationData ::
  -- | 'document'
  Document ->
  -- | 'recommendationId'
  Prelude.Text ->
  RecommendationData
newRecommendationData :: Document -> Text -> RecommendationData
newRecommendationData Document
pDocument_ Text
pRecommendationId_ =
  RecommendationData'
    { $sel:relevanceLevel:RecommendationData' :: Maybe RelevanceLevel
relevanceLevel =
        forall a. Maybe a
Prelude.Nothing,
      $sel:relevanceScore:RecommendationData' :: Maybe Double
relevanceScore = forall a. Maybe a
Prelude.Nothing,
      $sel:type':RecommendationData' :: Maybe RecommendationType
type' = forall a. Maybe a
Prelude.Nothing,
      $sel:document:RecommendationData' :: Document
document = Document
pDocument_,
      $sel:recommendationId:RecommendationData' :: Text
recommendationId = Text
pRecommendationId_
    }

-- | The relevance level of the recommendation.
recommendationData_relevanceLevel :: Lens.Lens' RecommendationData (Prelude.Maybe RelevanceLevel)
recommendationData_relevanceLevel :: Lens' RecommendationData (Maybe RelevanceLevel)
recommendationData_relevanceLevel = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\RecommendationData' {Maybe RelevanceLevel
relevanceLevel :: Maybe RelevanceLevel
$sel:relevanceLevel:RecommendationData' :: RecommendationData -> Maybe RelevanceLevel
relevanceLevel} -> Maybe RelevanceLevel
relevanceLevel) (\s :: RecommendationData
s@RecommendationData' {} Maybe RelevanceLevel
a -> RecommendationData
s {$sel:relevanceLevel:RecommendationData' :: Maybe RelevanceLevel
relevanceLevel = Maybe RelevanceLevel
a} :: RecommendationData)

-- | The relevance score of the recommendation.
recommendationData_relevanceScore :: Lens.Lens' RecommendationData (Prelude.Maybe Prelude.Double)
recommendationData_relevanceScore :: Lens' RecommendationData (Maybe Double)
recommendationData_relevanceScore = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\RecommendationData' {Maybe Double
relevanceScore :: Maybe Double
$sel:relevanceScore:RecommendationData' :: RecommendationData -> Maybe Double
relevanceScore} -> Maybe Double
relevanceScore) (\s :: RecommendationData
s@RecommendationData' {} Maybe Double
a -> RecommendationData
s {$sel:relevanceScore:RecommendationData' :: Maybe Double
relevanceScore = Maybe Double
a} :: RecommendationData)

-- | The type of recommendation.
recommendationData_type :: Lens.Lens' RecommendationData (Prelude.Maybe RecommendationType)
recommendationData_type :: Lens' RecommendationData (Maybe RecommendationType)
recommendationData_type = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\RecommendationData' {Maybe RecommendationType
type' :: Maybe RecommendationType
$sel:type':RecommendationData' :: RecommendationData -> Maybe RecommendationType
type'} -> Maybe RecommendationType
type') (\s :: RecommendationData
s@RecommendationData' {} Maybe RecommendationType
a -> RecommendationData
s {$sel:type':RecommendationData' :: Maybe RecommendationType
type' = Maybe RecommendationType
a} :: RecommendationData)

-- | The recommended document.
recommendationData_document :: Lens.Lens' RecommendationData Document
recommendationData_document :: Lens' RecommendationData Document
recommendationData_document = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\RecommendationData' {Document
document :: Document
$sel:document:RecommendationData' :: RecommendationData -> Document
document} -> Document
document) (\s :: RecommendationData
s@RecommendationData' {} Document
a -> RecommendationData
s {$sel:document:RecommendationData' :: Document
document = Document
a} :: RecommendationData)

-- | The identifier of the recommendation.
recommendationData_recommendationId :: Lens.Lens' RecommendationData Prelude.Text
recommendationData_recommendationId :: Lens' RecommendationData Text
recommendationData_recommendationId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\RecommendationData' {Text
recommendationId :: Text
$sel:recommendationId:RecommendationData' :: RecommendationData -> Text
recommendationId} -> Text
recommendationId) (\s :: RecommendationData
s@RecommendationData' {} Text
a -> RecommendationData
s {$sel:recommendationId:RecommendationData' :: Text
recommendationId = Text
a} :: RecommendationData)

instance Data.FromJSON RecommendationData where
  parseJSON :: Value -> Parser RecommendationData
parseJSON =
    forall a. String -> (Object -> Parser a) -> Value -> Parser a
Data.withObject
      String
"RecommendationData"
      ( \Object
x ->
          Maybe RelevanceLevel
-> Maybe Double
-> Maybe RecommendationType
-> Document
-> Text
-> RecommendationData
RecommendationData'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"relevanceLevel")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"relevanceScore")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"type")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser a
Data..: Key
"document")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser a
Data..: Key
"recommendationId")
      )

instance Prelude.Hashable RecommendationData where
  hashWithSalt :: Int -> RecommendationData -> Int
hashWithSalt Int
_salt RecommendationData' {Maybe Double
Maybe RecommendationType
Maybe RelevanceLevel
Text
Document
recommendationId :: Text
document :: Document
type' :: Maybe RecommendationType
relevanceScore :: Maybe Double
relevanceLevel :: Maybe RelevanceLevel
$sel:recommendationId:RecommendationData' :: RecommendationData -> Text
$sel:document:RecommendationData' :: RecommendationData -> Document
$sel:type':RecommendationData' :: RecommendationData -> Maybe RecommendationType
$sel:relevanceScore:RecommendationData' :: RecommendationData -> Maybe Double
$sel:relevanceLevel:RecommendationData' :: RecommendationData -> Maybe RelevanceLevel
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe RelevanceLevel
relevanceLevel
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Double
relevanceScore
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe RecommendationType
type'
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Document
document
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
recommendationId

instance Prelude.NFData RecommendationData where
  rnf :: RecommendationData -> ()
rnf RecommendationData' {Maybe Double
Maybe RecommendationType
Maybe RelevanceLevel
Text
Document
recommendationId :: Text
document :: Document
type' :: Maybe RecommendationType
relevanceScore :: Maybe Double
relevanceLevel :: Maybe RelevanceLevel
$sel:recommendationId:RecommendationData' :: RecommendationData -> Text
$sel:document:RecommendationData' :: RecommendationData -> Document
$sel:type':RecommendationData' :: RecommendationData -> Maybe RecommendationType
$sel:relevanceScore:RecommendationData' :: RecommendationData -> Maybe Double
$sel:relevanceLevel:RecommendationData' :: RecommendationData -> Maybe RelevanceLevel
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe RelevanceLevel
relevanceLevel
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Double
relevanceScore
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe RecommendationType
type'
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Document
document
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
recommendationId