content: {-# LANGUAGE DataKinds #-}
  {-# LANGUAGE DerivingStrategies #-}
  {-# LANGUAGE DuplicateRecordFields #-}
  {-# LANGUAGE ImportQualifiedPost #-}
  {-# LANGUAGE LambdaCase #-}
  {-# LANGUAGE OverloadedStrings #-}
  {-# LANGUAGE PatternSynonyms #-}
  {-# LANGUAGE RecordWildCards #-}
  {-# LANGUAGE StrictData #-}
  {-# LANGUAGE TypeFamilies #-}
  {-# LANGUAGE NoImplicitPrelude #-}
  {-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
  {-# OPTIONS_GHC -fno-warn-name-shadowing #-}
  {-# OPTIONS_GHC -fno-warn-unused-binds #-}
  {-# OPTIONS_GHC -fno-warn-unused-imports #-}
  {-# OPTIONS_GHC -fno-warn-unused-matches #-}
  
  -- |
  -- Module      : Gogol.AppsLicensing.Internal.Product
  -- Copyright   : (c) 2015-2025 Brendan Hay
  -- License     : Mozilla Public License, v. 2.0.
  -- Maintainer  : Brendan Hay <brendan.g.hay+gogol@gmail.com>
  --               Toni Cebrián <toni@tonicebrian.com>
  -- Stability   : auto-generated
  -- Portability : non-portable (GHC extensions)
  module Gogol.AppsLicensing.Internal.Product
    ( -- * Empty
      Empty (..),
      newEmpty,
  
      -- * LicenseAssignment
      LicenseAssignment (..),
      newLicenseAssignment,
  
      -- * LicenseAssignmentInsert
      LicenseAssignmentInsert (..),
      newLicenseAssignmentInsert,
  
      -- * LicenseAssignmentList
      LicenseAssignmentList (..),
      newLicenseAssignmentList,
    )
  where
  
  import Gogol.AppsLicensing.Internal.Sum
  import Gogol.Prelude qualified as Core
  
  -- | A generic empty message that you can re-use to avoid defining duplicated empty messages in your APIs. A typical example is to use it as the request or the response type of an API method. For instance: service Foo { rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); }
  --
  -- /See:/ 'newEmpty' smart constructor.
  data Empty = Empty
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Empty' with the minimum fields required to make a request.
  newEmpty ::
    Empty
  newEmpty = Empty
  
  instance Core.FromJSON Empty where
    parseJSON = Core.withObject "Empty" (\o -> Core.pure Empty)
  
  instance Core.ToJSON Empty where
    toJSON = Core.const Core.emptyObject
  
  -- | Representation of a license assignment.
  --
  -- /See:/ 'newLicenseAssignment' smart constructor.
  data LicenseAssignment = LicenseAssignment
    { -- | ETag of the resource.
      etags :: (Core.Maybe Core.Text),
      -- | Identifies the resource as a LicenseAssignment, which is @licensing#licenseAssignment@.
      kind :: Core.Text,
      -- | A product\'s unique identifier. For more information about products in this version of the API, see Product and SKU IDs.
      productId :: (Core.Maybe Core.Text),
      -- | Display Name of the product.
      productName :: (Core.Maybe Core.Text),
      -- | Link to this page.
      selfLink :: (Core.Maybe Core.Text),
      -- | A product SKU\'s unique identifier. For more information about available SKUs in this version of the API, see Products and SKUs.
      skuId :: (Core.Maybe Core.Text),
      -- | Display Name of the sku of the product.
      skuName :: (Core.Maybe Core.Text),
      -- | The user\'s current primary email address. If the user\'s email address changes, use the new email address in your API requests. Since a @userId@ is subject to change, do not use a @userId@ value as a key for persistent data. This key could break if the current user\'s email address changes. If the @userId@ is suspended, the license status changes.
      userId :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'LicenseAssignment' with the minimum fields required to make a request.
  newLicenseAssignment ::
    LicenseAssignment
  newLicenseAssignment =
    LicenseAssignment
      { etags = Core.Nothing,
        kind = "licensing#licenseAssignment",
        productId = Core.Nothing,
        productName = Core.Nothing,
        selfLink = Core.Nothing,
        skuId = Core.Nothing,
        skuName = Core.Nothing,
        userId = Core.Nothing
      }
  
  instance Core.FromJSON LicenseAssignment where
    parseJSON =
      Core.withObject
        "LicenseAssignment"
        ( \o ->
            LicenseAssignment
              Core.<$> (o Core..:? "etags")
              Core.<*> (o Core..:? "kind" Core..!= "licensing#licenseAssignment")
              Core.<*> (o Core..:? "productId")
              Core.<*> (o Core..:? "productName")
              Core.<*> (o Core..:? "selfLink")
              Core.<*> (o Core..:? "skuId")
              Core.<*> (o Core..:? "skuName")
              Core.<*> (o Core..:? "userId")
        )
  
  instance Core.ToJSON LicenseAssignment where
    toJSON LicenseAssignment {..} =
      Core.object
        ( Core.catMaybes
            [ ("etags" Core..=) Core.<$> etags,
              Core.Just ("kind" Core..= kind),
              ("productId" Core..=) Core.<$> productId,
              ("productName" Core..=) Core.<$> productName,
              ("selfLink" Core..=) Core.<$> selfLink,
              ("skuId" Core..=) Core.<$> skuId,
              ("skuName" Core..=) Core.<$> skuName,
              ("userId" Core..=) Core.<$> userId
            ]
        )
  
  -- | Representation of a license assignment.
  --
  -- /See:/ 'newLicenseAssignmentInsert' smart constructor.
  newtype LicenseAssignmentInsert = LicenseAssignmentInsert
    { -- | Email id of the user
      userId :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'LicenseAssignmentInsert' with the minimum fields required to make a request.
  newLicenseAssignmentInsert ::
    LicenseAssignmentInsert
  newLicenseAssignmentInsert =
    LicenseAssignmentInsert {userId = Core.Nothing}
  
  instance Core.FromJSON LicenseAssignmentInsert where
    parseJSON =
      Core.withObject
        "LicenseAssignmentInsert"
        (\o -> LicenseAssignmentInsert Core.<$> (o Core..:? "userId"))
  
  instance Core.ToJSON LicenseAssignmentInsert where
    toJSON LicenseAssignmentInsert {..} =
      Core.object (Core.catMaybes [("userId" Core..=) Core.<$> userId])
  
  --
  -- /See:/ 'newLicenseAssignmentList' smart constructor.
  data LicenseAssignmentList = LicenseAssignmentList
    { -- | ETag of the resource.
      etag :: (Core.Maybe Core.Text),
      -- | The LicenseAssignments in this page of results.
      items :: (Core.Maybe [LicenseAssignment]),
      -- | Identifies the resource as a collection of LicenseAssignments.
      kind :: Core.Text,
      -- | The token that you must submit in a subsequent request to retrieve additional license results matching your query parameters. The @maxResults@ query string is related to the @nextPageToken@ since @maxResults@ determines how many entries are returned on each next page.
      nextPageToken :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'LicenseAssignmentList' with the minimum fields required to make a request.
  newLicenseAssignmentList ::
    LicenseAssignmentList
  newLicenseAssignmentList =
    LicenseAssignmentList
      { etag = Core.Nothing,
        items = Core.Nothing,
        kind = "licensing#licenseAssignmentList",
        nextPageToken = Core.Nothing
      }
  
  instance Core.FromJSON LicenseAssignmentList where
    parseJSON =
      Core.withObject
        "LicenseAssignmentList"
        ( \o ->
            LicenseAssignmentList
              Core.<$> (o Core..:? "etag")
              Core.<*> (o Core..:? "items")
              Core.<*> (o Core..:? "kind" Core..!= "licensing#licenseAssignmentList")
              Core.<*> (o Core..:? "nextPageToken")
        )
  
  instance Core.ToJSON LicenseAssignmentList where
    toJSON LicenseAssignmentList {..} =
      Core.object
        ( Core.catMaybes
            [ ("etag" Core..=) Core.<$> etag,
              ("items" Core..=) Core.<$> items,
              Core.Just ("kind" Core..= kind),
              ("nextPageToken" Core..=) Core.<$> nextPageToken
            ]
        )
  