packages feed

gogol-admin-directory-1.0.0: gen/Gogol/Admin/Directory/Internal/Product.hs

{-# 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.Admin.Directory.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.Admin.Directory.Internal.Product
  ( -- * Alias
    Alias (..),
    newAlias,

    -- * Aliases
    Aliases (..),
    newAliases,

    -- * Asp
    Asp (..),
    newAsp,

    -- * Asps
    Asps (..),
    newAsps,

    -- * AuxiliaryMessage
    AuxiliaryMessage (..),
    newAuxiliaryMessage,

    -- * BacklightInfo
    BacklightInfo (..),
    newBacklightInfo,

    -- * BatchChangeChromeOsDeviceStatusRequest
    BatchChangeChromeOsDeviceStatusRequest (..),
    newBatchChangeChromeOsDeviceStatusRequest,

    -- * BatchChangeChromeOsDeviceStatusResponse
    BatchChangeChromeOsDeviceStatusResponse (..),
    newBatchChangeChromeOsDeviceStatusResponse,

    -- * BatchCreatePrintServersRequest
    BatchCreatePrintServersRequest (..),
    newBatchCreatePrintServersRequest,

    -- * BatchCreatePrintServersResponse
    BatchCreatePrintServersResponse (..),
    newBatchCreatePrintServersResponse,

    -- * BatchCreatePrintersRequest
    BatchCreatePrintersRequest (..),
    newBatchCreatePrintersRequest,

    -- * BatchCreatePrintersResponse
    BatchCreatePrintersResponse (..),
    newBatchCreatePrintersResponse,

    -- * BatchDeletePrintServersRequest
    BatchDeletePrintServersRequest (..),
    newBatchDeletePrintServersRequest,

    -- * BatchDeletePrintServersResponse
    BatchDeletePrintServersResponse (..),
    newBatchDeletePrintServersResponse,

    -- * BatchDeletePrintersRequest
    BatchDeletePrintersRequest (..),
    newBatchDeletePrintersRequest,

    -- * BatchDeletePrintersResponse
    BatchDeletePrintersResponse (..),
    newBatchDeletePrintersResponse,

    -- * Building
    Building (..),
    newBuilding,

    -- * BuildingAddress
    BuildingAddress (..),
    newBuildingAddress,

    -- * BuildingCoordinates
    BuildingCoordinates (..),
    newBuildingCoordinates,

    -- * Buildings
    Buildings (..),
    newBuildings,

    -- * ByteUsage
    ByteUsage (..),
    newByteUsage,

    -- * CalendarResource
    CalendarResource (..),
    newCalendarResource,

    -- * CalendarResources
    CalendarResources (..),
    newCalendarResources,

    -- * ChangeChromeOsDeviceStatusResult
    ChangeChromeOsDeviceStatusResult (..),
    newChangeChromeOsDeviceStatusResult,

    -- * ChangeChromeOsDeviceStatusSucceeded
    ChangeChromeOsDeviceStatusSucceeded (..),
    newChangeChromeOsDeviceStatusSucceeded,

    -- * Channel
    Channel (..),
    newChannel,

    -- * Channel_Params
    Channel_Params (..),
    newChannel_Params,

    -- * ChromeOsDevice
    ChromeOsDevice (..),
    newChromeOsDevice,

    -- * ChromeOsDevice_ActiveTimeRangesItem
    ChromeOsDevice_ActiveTimeRangesItem (..),
    newChromeOsDevice_ActiveTimeRangesItem,

    -- * ChromeOsDevice_CpuInfoItem
    ChromeOsDevice_CpuInfoItem (..),
    newChromeOsDevice_CpuInfoItem,

    -- * ChromeOsDevice_CpuInfoItem_LogicalCpusItem
    ChromeOsDevice_CpuInfoItem_LogicalCpusItem (..),
    newChromeOsDevice_CpuInfoItem_LogicalCpusItem,

    -- * ChromeOsDevice_CpuInfoItem_LogicalCpusItem_CStatesItem
    ChromeOsDevice_CpuInfoItem_LogicalCpusItem_CStatesItem (..),
    newChromeOsDevice_CpuInfoItem_LogicalCpusItem_CStatesItem,

    -- * ChromeOsDevice_CpuStatusReportsItem
    ChromeOsDevice_CpuStatusReportsItem (..),
    newChromeOsDevice_CpuStatusReportsItem,

    -- * ChromeOsDevice_CpuStatusReportsItem_CpuTemperatureInfoItem
    ChromeOsDevice_CpuStatusReportsItem_CpuTemperatureInfoItem (..),
    newChromeOsDevice_CpuStatusReportsItem_CpuTemperatureInfoItem,

    -- * ChromeOsDevice_DeviceFilesItem
    ChromeOsDevice_DeviceFilesItem (..),
    newChromeOsDevice_DeviceFilesItem,

    -- * ChromeOsDevice_DiskVolumeReportsItem
    ChromeOsDevice_DiskVolumeReportsItem (..),
    newChromeOsDevice_DiskVolumeReportsItem,

    -- * ChromeOsDevice_DiskVolumeReportsItem_VolumeInfoItem
    ChromeOsDevice_DiskVolumeReportsItem_VolumeInfoItem (..),
    newChromeOsDevice_DiskVolumeReportsItem_VolumeInfoItem,

    -- * ChromeOsDevice_LastKnownNetworkItem
    ChromeOsDevice_LastKnownNetworkItem (..),
    newChromeOsDevice_LastKnownNetworkItem,

    -- * ChromeOsDevice_RecentUsersItem
    ChromeOsDevice_RecentUsersItem (..),
    newChromeOsDevice_RecentUsersItem,

    -- * ChromeOsDevice_ScreenshotFilesItem
    ChromeOsDevice_ScreenshotFilesItem (..),
    newChromeOsDevice_ScreenshotFilesItem,

    -- * ChromeOsDevice_SystemRamFreeReportsItem
    ChromeOsDevice_SystemRamFreeReportsItem (..),
    newChromeOsDevice_SystemRamFreeReportsItem,

    -- * ChromeOsDevice_TpmVersionInfo
    ChromeOsDevice_TpmVersionInfo (..),
    newChromeOsDevice_TpmVersionInfo,

    -- * ChromeOsDeviceAction
    ChromeOsDeviceAction (..),
    newChromeOsDeviceAction,

    -- * ChromeOsDevices
    ChromeOsDevices (..),
    newChromeOsDevices,

    -- * ChromeOsMoveDevicesToOu
    ChromeOsMoveDevicesToOu (..),
    newChromeOsMoveDevicesToOu,

    -- * CreatePrintServerRequest
    CreatePrintServerRequest (..),
    newCreatePrintServerRequest,

    -- * CreatePrinterRequest
    CreatePrinterRequest (..),
    newCreatePrinterRequest,

    -- * Customer
    Customer (..),
    newCustomer,

    -- * CustomerPostalAddress
    CustomerPostalAddress (..),
    newCustomerPostalAddress,

    -- * DirectoryChromeosdevicesCommand
    DirectoryChromeosdevicesCommand (..),
    newDirectoryChromeosdevicesCommand,

    -- * DirectoryChromeosdevicesCommandResult
    DirectoryChromeosdevicesCommandResult (..),
    newDirectoryChromeosdevicesCommandResult,

    -- * DirectoryChromeosdevicesIssueCommandRequest
    DirectoryChromeosdevicesIssueCommandRequest (..),
    newDirectoryChromeosdevicesIssueCommandRequest,

    -- * DirectoryChromeosdevicesIssueCommandResponse
    DirectoryChromeosdevicesIssueCommandResponse (..),
    newDirectoryChromeosdevicesIssueCommandResponse,

    -- * DomainAlias
    DomainAlias (..),
    newDomainAlias,

    -- * DomainAliases
    DomainAliases (..),
    newDomainAliases,

    -- * Domains
    Domains (..),
    newDomains,

    -- * Domains2
    Domains2 (..),
    newDomains2,

    -- * Empty
    Empty (..),
    newEmpty,

    -- * FailureInfo
    FailureInfo (..),
    newFailureInfo,

    -- * FanInfo
    FanInfo (..),
    newFanInfo,

    -- * Feature
    Feature (..),
    newFeature,

    -- * FeatureInstance
    FeatureInstance (..),
    newFeatureInstance,

    -- * FeatureRename
    FeatureRename (..),
    newFeatureRename,

    -- * Features
    Features (..),
    newFeatures,

    -- * Group
    Group (..),
    newGroup,

    -- * GroupAlias
    GroupAlias (..),
    newGroupAlias,

    -- * Groups
    Groups (..),
    newGroups,

    -- * ListPrintServersResponse
    ListPrintServersResponse (..),
    newListPrintServersResponse,

    -- * ListPrinterModelsResponse
    ListPrinterModelsResponse (..),
    newListPrinterModelsResponse,

    -- * ListPrintersResponse
    ListPrintersResponse (..),
    newListPrintersResponse,

    -- * Member
    Member (..),
    newMember,

    -- * Members
    Members (..),
    newMembers,

    -- * MembersHasMember
    MembersHasMember (..),
    newMembersHasMember,

    -- * MobileDevice
    MobileDevice (..),
    newMobileDevice,

    -- * MobileDevice_ApplicationsItem
    MobileDevice_ApplicationsItem (..),
    newMobileDevice_ApplicationsItem,

    -- * MobileDeviceAction
    MobileDeviceAction (..),
    newMobileDeviceAction,

    -- * MobileDevices
    MobileDevices (..),
    newMobileDevices,

    -- * OrgUnit
    OrgUnit (..),
    newOrgUnit,

    -- * OrgUnits
    OrgUnits (..),
    newOrgUnits,

    -- * OsUpdateStatus
    OsUpdateStatus (..),
    newOsUpdateStatus,

    -- * PrintServer
    PrintServer (..),
    newPrintServer,

    -- * PrintServerFailureInfo
    PrintServerFailureInfo (..),
    newPrintServerFailureInfo,

    -- * Printer
    Printer (..),
    newPrinter,

    -- * PrinterModel
    PrinterModel (..),
    newPrinterModel,

    -- * Privilege
    Privilege (..),
    newPrivilege,

    -- * Privileges
    Privileges (..),
    newPrivileges,

    -- * Role
    Role (..),
    newRole,

    -- * Role_RolePrivilegesItem
    Role_RolePrivilegesItem (..),
    newRole_RolePrivilegesItem,

    -- * RoleAssignment
    RoleAssignment (..),
    newRoleAssignment,

    -- * RoleAssignments
    RoleAssignments (..),
    newRoleAssignments,

    -- * Roles
    Roles (..),
    newRoles,

    -- * Schema
    Schema (..),
    newSchema,

    -- * SchemaFieldSpec
    SchemaFieldSpec (..),
    newSchemaFieldSpec,

    -- * SchemaFieldSpec_NumericIndexingSpec
    SchemaFieldSpec_NumericIndexingSpec (..),
    newSchemaFieldSpec_NumericIndexingSpec,

    -- * Schemas
    Schemas (..),
    newSchemas,

    -- * Status
    Status (..),
    newStatus,

    -- * Status_DetailsItem
    Status_DetailsItem (..),
    newStatus_DetailsItem,

    -- * Token
    Token (..),
    newToken,

    -- * Tokens
    Tokens (..),
    newTokens,

    -- * User
    User (..),
    newUser,

    -- * User_CustomSchemas
    User_CustomSchemas (..),
    newUser_CustomSchemas,

    -- * UserAbout
    UserAbout (..),
    newUserAbout,

    -- * UserAddress
    UserAddress (..),
    newUserAddress,

    -- * UserAlias
    UserAlias (..),
    newUserAlias,

    -- * UserCustomProperties
    UserCustomProperties (..),
    newUserCustomProperties,

    -- * UserEmail
    UserEmail (..),
    newUserEmail,

    -- * UserEmail_Public_key_encryption_certificates
    UserEmail_Public_key_encryption_certificates (..),
    newUserEmail_Public_key_encryption_certificates,

    -- * UserExternalId
    UserExternalId (..),
    newUserExternalId,

    -- * UserGender
    UserGender (..),
    newUserGender,

    -- * UserIm
    UserIm (..),
    newUserIm,

    -- * UserKeyword
    UserKeyword (..),
    newUserKeyword,

    -- * UserLanguage
    UserLanguage (..),
    newUserLanguage,

    -- * UserLocation
    UserLocation (..),
    newUserLocation,

    -- * UserMakeAdmin
    UserMakeAdmin (..),
    newUserMakeAdmin,

    -- * UserName
    UserName (..),
    newUserName,

    -- * UserOrganization
    UserOrganization (..),
    newUserOrganization,

    -- * UserPhone
    UserPhone (..),
    newUserPhone,

    -- * UserPhoto
    UserPhoto (..),
    newUserPhoto,

    -- * UserPosixAccount
    UserPosixAccount (..),
    newUserPosixAccount,

    -- * UserRelation
    UserRelation (..),
    newUserRelation,

    -- * UserSshPublicKey
    UserSshPublicKey (..),
    newUserSshPublicKey,

    -- * UserUndelete
    UserUndelete (..),
    newUserUndelete,

    -- * UserWebsite
    UserWebsite (..),
    newUserWebsite,

    -- * Users
    Users (..),
    newUsers,

    -- * VerificationCode
    VerificationCode (..),
    newVerificationCode,

    -- * VerificationCodes
    VerificationCodes (..),
    newVerificationCodes,
  )
where

import Gogol.Admin.Directory.Internal.Sum
import Gogol.Prelude qualified as Core

-- | JSON template for Alias object in Directory API.
--
-- /See:/ 'newAlias' smart constructor.
data Alias = Alias
  { alias :: (Core.Maybe Core.Text),
    etag :: (Core.Maybe Core.Text),
    id :: (Core.Maybe Core.Text),
    kind :: Core.Text,
    primaryEmail :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Alias' with the minimum fields required to make a request.
newAlias ::
  Alias
newAlias =
  Alias
    { alias = Core.Nothing,
      etag = Core.Nothing,
      id = Core.Nothing,
      kind = "admin#directory#alias",
      primaryEmail = Core.Nothing
    }

instance Core.FromJSON Alias where
  parseJSON =
    Core.withObject
      "Alias"
      ( \o ->
          Alias
            Core.<$> (o Core..:? "alias")
            Core.<*> (o Core..:? "etag")
            Core.<*> (o Core..:? "id")
            Core.<*> (o Core..:? "kind" Core..!= "admin#directory#alias")
            Core.<*> (o Core..:? "primaryEmail")
      )

instance Core.ToJSON Alias where
  toJSON Alias {..} =
    Core.object
      ( Core.catMaybes
          [ ("alias" Core..=) Core.<$> alias,
            ("etag" Core..=) Core.<$> etag,
            ("id" Core..=) Core.<$> id,
            Core.Just ("kind" Core..= kind),
            ("primaryEmail" Core..=) Core.<$> primaryEmail
          ]
      )

-- | JSON response template to list aliases in Directory API.
--
-- /See:/ 'newAliases' smart constructor.
data Aliases = Aliases
  { aliases :: (Core.Maybe [Core.Value]),
    etag :: (Core.Maybe Core.Text),
    kind :: Core.Text
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Aliases' with the minimum fields required to make a request.
newAliases ::
  Aliases
newAliases =
  Aliases
    { aliases = Core.Nothing,
      etag = Core.Nothing,
      kind = "admin#directory#aliases"
    }

instance Core.FromJSON Aliases where
  parseJSON =
    Core.withObject
      "Aliases"
      ( \o ->
          Aliases
            Core.<$> (o Core..:? "aliases")
            Core.<*> (o Core..:? "etag")
            Core.<*> (o Core..:? "kind" Core..!= "admin#directory#aliases")
      )

instance Core.ToJSON Aliases where
  toJSON Aliases {..} =
    Core.object
      ( Core.catMaybes
          [ ("aliases" Core..=) Core.<$> aliases,
            ("etag" Core..=) Core.<$> etag,
            Core.Just ("kind" Core..= kind)
          ]
      )

-- | An application-specific password (ASP) is used with applications that do not accept a verification code when logging into the application on certain devices. The ASP access code is used instead of the login and password you commonly use when accessing an application through a browser. For more information about ASPs and how to create one, see the <https://support.google.com/a/answer/2537800#asp help center>.
--
-- /See:/ 'newAsp' smart constructor.
data Asp = Asp
  { -- | The unique ID of the ASP.
    codeId :: (Core.Maybe Core.Int32),
    -- | The time when the ASP was created. Expressed in <https://en.wikipedia.org/wiki/Epoch_time Unix time> format.
    creationTime :: (Core.Maybe Core.Int64),
    -- | ETag of the ASP.
    etag :: (Core.Maybe Core.Text),
    -- | The type of the API resource. This is always @admin#directory#asp@.
    kind :: Core.Text,
    -- | The time when the ASP was last used. Expressed in <https://en.wikipedia.org/wiki/Epoch_time Unix time> format.
    lastTimeUsed :: (Core.Maybe Core.Int64),
    -- | The name of the application that the user, represented by their @userId@, entered when the ASP was created.
    name :: (Core.Maybe Core.Text),
    -- | The unique ID of the user who issued the ASP.
    userKey :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Asp' with the minimum fields required to make a request.
newAsp ::
  Asp
newAsp =
  Asp
    { codeId = Core.Nothing,
      creationTime = Core.Nothing,
      etag = Core.Nothing,
      kind = "admin#directory#asp",
      lastTimeUsed = Core.Nothing,
      name = Core.Nothing,
      userKey = Core.Nothing
    }

instance Core.FromJSON Asp where
  parseJSON =
    Core.withObject
      "Asp"
      ( \o ->
          Asp
            Core.<$> (o Core..:? "codeId")
            Core.<*> (o Core..:? "creationTime" Core.<&> Core.fmap Core.fromAsText)
            Core.<*> (o Core..:? "etag")
            Core.<*> (o Core..:? "kind" Core..!= "admin#directory#asp")
            Core.<*> (o Core..:? "lastTimeUsed" Core.<&> Core.fmap Core.fromAsText)
            Core.<*> (o Core..:? "name")
            Core.<*> (o Core..:? "userKey")
      )

instance Core.ToJSON Asp where
  toJSON Asp {..} =
    Core.object
      ( Core.catMaybes
          [ ("codeId" Core..=) Core.<$> codeId,
            ("creationTime" Core..=) Core.. Core.AsText Core.<$> creationTime,
            ("etag" Core..=) Core.<$> etag,
            Core.Just ("kind" Core..= kind),
            ("lastTimeUsed" Core..=) Core.. Core.AsText Core.<$> lastTimeUsed,
            ("name" Core..=) Core.<$> name,
            ("userKey" Core..=) Core.<$> userKey
          ]
      )

--
-- /See:/ 'newAsps' smart constructor.
data Asps = Asps
  { -- | ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | A list of ASP resources.
    items :: (Core.Maybe [Asp]),
    -- | The type of the API resource. This is always @admin#directory#aspList@.
    kind :: Core.Text
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Asps' with the minimum fields required to make a request.
newAsps ::
  Asps
newAsps =
  Asps
    { etag = Core.Nothing,
      items = Core.Nothing,
      kind = "admin#directory#aspList"
    }

instance Core.FromJSON Asps where
  parseJSON =
    Core.withObject
      "Asps"
      ( \o ->
          Asps
            Core.<$> (o Core..:? "etag")
            Core.<*> (o Core..:? "items")
            Core.<*> (o Core..:? "kind" Core..!= "admin#directory#aspList")
      )

instance Core.ToJSON Asps where
  toJSON Asps {..} =
    Core.object
      ( Core.catMaybes
          [ ("etag" Core..=) Core.<$> etag,
            ("items" Core..=) Core.<$> items,
            Core.Just ("kind" Core..= kind)
          ]
      )

-- | Auxiliary message about issues with printers or settings. Example: {message/type:AUXILIARY/MESSAGE/WARNING, field/mask:make/and/model, message:\"Given printer is invalid or no longer supported.\"}
--
-- /See:/ 'newAuxiliaryMessage' smart constructor.
data AuxiliaryMessage = AuxiliaryMessage
  { -- | Human readable message in English. Example: \"Given printer is invalid or no longer supported.\"
    auxiliaryMessage :: (Core.Maybe Core.Text),
    -- | Field that this message concerns.
    fieldMask :: (Core.Maybe Core.FieldMask),
    -- | Message severity
    severity :: (Core.Maybe AuxiliaryMessage_Severity)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'AuxiliaryMessage' with the minimum fields required to make a request.
newAuxiliaryMessage ::
  AuxiliaryMessage
newAuxiliaryMessage =
  AuxiliaryMessage
    { auxiliaryMessage = Core.Nothing,
      fieldMask = Core.Nothing,
      severity = Core.Nothing
    }

instance Core.FromJSON AuxiliaryMessage where
  parseJSON =
    Core.withObject
      "AuxiliaryMessage"
      ( \o ->
          AuxiliaryMessage
            Core.<$> (o Core..:? "auxiliaryMessage")
            Core.<*> (o Core..:? "fieldMask")
            Core.<*> (o Core..:? "severity")
      )

instance Core.ToJSON AuxiliaryMessage where
  toJSON AuxiliaryMessage {..} =
    Core.object
      ( Core.catMaybes
          [ ("auxiliaryMessage" Core..=) Core.<$> auxiliaryMessage,
            ("fieldMask" Core..=) Core.<$> fieldMask,
            ("severity" Core..=) Core.<$> severity
          ]
      )

-- | Information about the device\'s backlights.
--
-- /See:/ 'newBacklightInfo' smart constructor.
data BacklightInfo = BacklightInfo
  { -- | Output only. Current brightness of the backlight, between 0 and max_brightness.
    brightness :: (Core.Maybe Core.Int32),
    -- | Output only. Maximum brightness for the backlight.
    maxBrightness :: (Core.Maybe Core.Int32),
    -- | Output only. Path to this backlight on the system. Useful if the caller needs to correlate with other information.
    path :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'BacklightInfo' with the minimum fields required to make a request.
newBacklightInfo ::
  BacklightInfo
newBacklightInfo =
  BacklightInfo
    { brightness = Core.Nothing,
      maxBrightness = Core.Nothing,
      path = Core.Nothing
    }

instance Core.FromJSON BacklightInfo where
  parseJSON =
    Core.withObject
      "BacklightInfo"
      ( \o ->
          BacklightInfo
            Core.<$> (o Core..:? "brightness")
            Core.<*> (o Core..:? "maxBrightness")
            Core.<*> (o Core..:? "path")
      )

instance Core.ToJSON BacklightInfo where
  toJSON BacklightInfo {..} =
    Core.object
      ( Core.catMaybes
          [ ("brightness" Core..=) Core.<$> brightness,
            ("maxBrightness" Core..=) Core.<$> maxBrightness,
            ("path" Core..=) Core.<$> path
          ]
      )

-- | A request for changing the status of a batch of ChromeOS devices.
--
-- /See:/ 'newBatchChangeChromeOsDeviceStatusRequest' smart constructor.
data BatchChangeChromeOsDeviceStatusRequest = BatchChangeChromeOsDeviceStatusRequest
  { -- | Required. The action to take on the ChromeOS device in order to change its status.
    changeChromeOsDeviceStatusAction ::
      ( Core.Maybe
          BatchChangeChromeOsDeviceStatusRequest_ChangeChromeOsDeviceStatusAction
      ),
    -- | Optional. The reason behind a device deprovision. Must be provided if \'changeChromeOsDeviceStatusAction\' is set to \'CHANGE/CHROME/OS/DEVICE/STATUS/ACTION/DEPROVISION\'. Otherwise, omit this field.
    deprovisionReason ::
      ( Core.Maybe
          BatchChangeChromeOsDeviceStatusRequest_DeprovisionReason
      ),
    -- | Required. List of the IDs of the ChromeOS devices to change. Maximum 50.
    deviceIds :: (Core.Maybe [Core.Text])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'BatchChangeChromeOsDeviceStatusRequest' with the minimum fields required to make a request.
newBatchChangeChromeOsDeviceStatusRequest ::
  BatchChangeChromeOsDeviceStatusRequest
newBatchChangeChromeOsDeviceStatusRequest =
  BatchChangeChromeOsDeviceStatusRequest
    { changeChromeOsDeviceStatusAction =
        Core.Nothing,
      deprovisionReason = Core.Nothing,
      deviceIds = Core.Nothing
    }

instance Core.FromJSON BatchChangeChromeOsDeviceStatusRequest where
  parseJSON =
    Core.withObject
      "BatchChangeChromeOsDeviceStatusRequest"
      ( \o ->
          BatchChangeChromeOsDeviceStatusRequest
            Core.<$> (o Core..:? "changeChromeOsDeviceStatusAction")
            Core.<*> (o Core..:? "deprovisionReason")
            Core.<*> (o Core..:? "deviceIds")
      )

instance Core.ToJSON BatchChangeChromeOsDeviceStatusRequest where
  toJSON BatchChangeChromeOsDeviceStatusRequest {..} =
    Core.object
      ( Core.catMaybes
          [ ("changeChromeOsDeviceStatusAction" Core..=)
              Core.<$> changeChromeOsDeviceStatusAction,
            ("deprovisionReason" Core..=) Core.<$> deprovisionReason,
            ("deviceIds" Core..=) Core.<$> deviceIds
          ]
      )

-- | The response of changing the status of a batch of ChromeOS devices.
--
-- /See:/ 'newBatchChangeChromeOsDeviceStatusResponse' smart constructor.
newtype BatchChangeChromeOsDeviceStatusResponse = BatchChangeChromeOsDeviceStatusResponse
  { -- | The results for each of the ChromeOS devices provided in the request.
    changeChromeOsDeviceStatusResults :: (Core.Maybe [ChangeChromeOsDeviceStatusResult])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'BatchChangeChromeOsDeviceStatusResponse' with the minimum fields required to make a request.
newBatchChangeChromeOsDeviceStatusResponse ::
  BatchChangeChromeOsDeviceStatusResponse
newBatchChangeChromeOsDeviceStatusResponse =
  BatchChangeChromeOsDeviceStatusResponse
    { changeChromeOsDeviceStatusResults =
        Core.Nothing
    }

instance Core.FromJSON BatchChangeChromeOsDeviceStatusResponse where
  parseJSON =
    Core.withObject
      "BatchChangeChromeOsDeviceStatusResponse"
      ( \o ->
          BatchChangeChromeOsDeviceStatusResponse
            Core.<$> (o Core..:? "changeChromeOsDeviceStatusResults")
      )

instance Core.ToJSON BatchChangeChromeOsDeviceStatusResponse where
  toJSON BatchChangeChromeOsDeviceStatusResponse {..} =
    Core.object
      ( Core.catMaybes
          [ ("changeChromeOsDeviceStatusResults" Core..=)
              Core.<$> changeChromeOsDeviceStatusResults
          ]
      )

-- | Request to add multiple new print servers in a batch.
--
-- /See:/ 'newBatchCreatePrintServersRequest' smart constructor.
newtype BatchCreatePrintServersRequest = BatchCreatePrintServersRequest
  { -- | Required. A list of @PrintServer@ resources to be created (max @50@ per batch).
    requests :: (Core.Maybe [CreatePrintServerRequest])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'BatchCreatePrintServersRequest' with the minimum fields required to make a request.
newBatchCreatePrintServersRequest ::
  BatchCreatePrintServersRequest
newBatchCreatePrintServersRequest =
  BatchCreatePrintServersRequest {requests = Core.Nothing}

instance Core.FromJSON BatchCreatePrintServersRequest where
  parseJSON =
    Core.withObject
      "BatchCreatePrintServersRequest"
      ( \o ->
          BatchCreatePrintServersRequest Core.<$> (o Core..:? "requests")
      )

instance Core.ToJSON BatchCreatePrintServersRequest where
  toJSON BatchCreatePrintServersRequest {..} =
    Core.object
      (Core.catMaybes [("requests" Core..=) Core.<$> requests])

--
-- /See:/ 'newBatchCreatePrintServersResponse' smart constructor.
data BatchCreatePrintServersResponse = BatchCreatePrintServersResponse
  { -- | A list of create failures. @PrintServer@ IDs are not populated, as print servers were not created.
    failures :: (Core.Maybe [PrintServerFailureInfo]),
    -- | A list of successfully created print servers with their IDs populated.
    printServers :: (Core.Maybe [PrintServer])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'BatchCreatePrintServersResponse' with the minimum fields required to make a request.
newBatchCreatePrintServersResponse ::
  BatchCreatePrintServersResponse
newBatchCreatePrintServersResponse =
  BatchCreatePrintServersResponse
    { failures = Core.Nothing,
      printServers = Core.Nothing
    }

instance Core.FromJSON BatchCreatePrintServersResponse where
  parseJSON =
    Core.withObject
      "BatchCreatePrintServersResponse"
      ( \o ->
          BatchCreatePrintServersResponse
            Core.<$> (o Core..:? "failures")
            Core.<*> (o Core..:? "printServers")
      )

instance Core.ToJSON BatchCreatePrintServersResponse where
  toJSON BatchCreatePrintServersResponse {..} =
    Core.object
      ( Core.catMaybes
          [ ("failures" Core..=) Core.<$> failures,
            ("printServers" Core..=) Core.<$> printServers
          ]
      )

-- | Request for adding new printers in batch.
--
-- /See:/ 'newBatchCreatePrintersRequest' smart constructor.
newtype BatchCreatePrintersRequest = BatchCreatePrintersRequest
  { -- | A list of Printers to be created. Max 50 at a time.
    requests :: (Core.Maybe [CreatePrinterRequest])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'BatchCreatePrintersRequest' with the minimum fields required to make a request.
newBatchCreatePrintersRequest ::
  BatchCreatePrintersRequest
newBatchCreatePrintersRequest =
  BatchCreatePrintersRequest {requests = Core.Nothing}

instance Core.FromJSON BatchCreatePrintersRequest where
  parseJSON =
    Core.withObject
      "BatchCreatePrintersRequest"
      ( \o ->
          BatchCreatePrintersRequest Core.<$> (o Core..:? "requests")
      )

instance Core.ToJSON BatchCreatePrintersRequest where
  toJSON BatchCreatePrintersRequest {..} =
    Core.object
      (Core.catMaybes [("requests" Core..=) Core.<$> requests])

-- | Response for adding new printers in batch.
--
-- /See:/ 'newBatchCreatePrintersResponse' smart constructor.
data BatchCreatePrintersResponse = BatchCreatePrintersResponse
  { -- | A list of create failures. Printer IDs are not populated, as printer were not created.
    failures :: (Core.Maybe [FailureInfo]),
    -- | A list of successfully created printers with their IDs populated.
    printers :: (Core.Maybe [Printer])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'BatchCreatePrintersResponse' with the minimum fields required to make a request.
newBatchCreatePrintersResponse ::
  BatchCreatePrintersResponse
newBatchCreatePrintersResponse =
  BatchCreatePrintersResponse
    { failures = Core.Nothing,
      printers = Core.Nothing
    }

instance Core.FromJSON BatchCreatePrintersResponse where
  parseJSON =
    Core.withObject
      "BatchCreatePrintersResponse"
      ( \o ->
          BatchCreatePrintersResponse
            Core.<$> (o Core..:? "failures")
            Core.<*> (o Core..:? "printers")
      )

instance Core.ToJSON BatchCreatePrintersResponse where
  toJSON BatchCreatePrintersResponse {..} =
    Core.object
      ( Core.catMaybes
          [ ("failures" Core..=) Core.<$> failures,
            ("printers" Core..=) Core.<$> printers
          ]
      )

-- | Request to delete multiple existing print servers in a batch.
--
-- /See:/ 'newBatchDeletePrintServersRequest' smart constructor.
newtype BatchDeletePrintServersRequest = BatchDeletePrintServersRequest
  { -- | A list of print server IDs that should be deleted (max @100@ per batch).
    printServerIds :: (Core.Maybe [Core.Text])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'BatchDeletePrintServersRequest' with the minimum fields required to make a request.
newBatchDeletePrintServersRequest ::
  BatchDeletePrintServersRequest
newBatchDeletePrintServersRequest =
  BatchDeletePrintServersRequest {printServerIds = Core.Nothing}

instance Core.FromJSON BatchDeletePrintServersRequest where
  parseJSON =
    Core.withObject
      "BatchDeletePrintServersRequest"
      ( \o ->
          BatchDeletePrintServersRequest
            Core.<$> (o Core..:? "printServerIds")
      )

instance Core.ToJSON BatchDeletePrintServersRequest where
  toJSON BatchDeletePrintServersRequest {..} =
    Core.object
      ( Core.catMaybes
          [("printServerIds" Core..=) Core.<$> printServerIds]
      )

--
-- /See:/ 'newBatchDeletePrintServersResponse' smart constructor.
data BatchDeletePrintServersResponse = BatchDeletePrintServersResponse
  { -- | A list of update failures.
    failedPrintServers :: (Core.Maybe [PrintServerFailureInfo]),
    -- | A list of print server IDs that were successfully deleted.
    printServerIds :: (Core.Maybe [Core.Text])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'BatchDeletePrintServersResponse' with the minimum fields required to make a request.
newBatchDeletePrintServersResponse ::
  BatchDeletePrintServersResponse
newBatchDeletePrintServersResponse =
  BatchDeletePrintServersResponse
    { failedPrintServers =
        Core.Nothing,
      printServerIds = Core.Nothing
    }

instance Core.FromJSON BatchDeletePrintServersResponse where
  parseJSON =
    Core.withObject
      "BatchDeletePrintServersResponse"
      ( \o ->
          BatchDeletePrintServersResponse
            Core.<$> (o Core..:? "failedPrintServers")
            Core.<*> (o Core..:? "printServerIds")
      )

instance Core.ToJSON BatchDeletePrintServersResponse where
  toJSON BatchDeletePrintServersResponse {..} =
    Core.object
      ( Core.catMaybes
          [ ("failedPrintServers" Core..=) Core.<$> failedPrintServers,
            ("printServerIds" Core..=) Core.<$> printServerIds
          ]
      )

-- | Request for deleting existing printers in batch.
--
-- /See:/ 'newBatchDeletePrintersRequest' smart constructor.
newtype BatchDeletePrintersRequest = BatchDeletePrintersRequest
  { -- | A list of Printer.id that should be deleted. Max 100 at a time.
    printerIds :: (Core.Maybe [Core.Text])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'BatchDeletePrintersRequest' with the minimum fields required to make a request.
newBatchDeletePrintersRequest ::
  BatchDeletePrintersRequest
newBatchDeletePrintersRequest =
  BatchDeletePrintersRequest {printerIds = Core.Nothing}

instance Core.FromJSON BatchDeletePrintersRequest where
  parseJSON =
    Core.withObject
      "BatchDeletePrintersRequest"
      ( \o ->
          BatchDeletePrintersRequest Core.<$> (o Core..:? "printerIds")
      )

instance Core.ToJSON BatchDeletePrintersRequest where
  toJSON BatchDeletePrintersRequest {..} =
    Core.object
      (Core.catMaybes [("printerIds" Core..=) Core.<$> printerIds])

-- | Response for deleting existing printers in batch.
--
-- /See:/ 'newBatchDeletePrintersResponse' smart constructor.
data BatchDeletePrintersResponse = BatchDeletePrintersResponse
  { -- | A list of update failures.
    failedPrinters :: (Core.Maybe [FailureInfo]),
    -- | A list of Printer.id that were successfully deleted.
    printerIds :: (Core.Maybe [Core.Text])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'BatchDeletePrintersResponse' with the minimum fields required to make a request.
newBatchDeletePrintersResponse ::
  BatchDeletePrintersResponse
newBatchDeletePrintersResponse =
  BatchDeletePrintersResponse
    { failedPrinters = Core.Nothing,
      printerIds = Core.Nothing
    }

instance Core.FromJSON BatchDeletePrintersResponse where
  parseJSON =
    Core.withObject
      "BatchDeletePrintersResponse"
      ( \o ->
          BatchDeletePrintersResponse
            Core.<$> (o Core..:? "failedPrinters")
            Core.<*> (o Core..:? "printerIds")
      )

instance Core.ToJSON BatchDeletePrintersResponse where
  toJSON BatchDeletePrintersResponse {..} =
    Core.object
      ( Core.catMaybes
          [ ("failedPrinters" Core..=) Core.<$> failedPrinters,
            ("printerIds" Core..=) Core.<$> printerIds
          ]
      )

-- | Public API: Resources.buildings
--
-- /See:/ 'newBuilding' smart constructor.
data Building = Building
  { -- | The postal address of the building. See </my-business/reference/rest/v4/PostalAddress PostalAddress> for details. Note that only a single address line and region code are required.
    address :: (Core.Maybe BuildingAddress),
    -- | Unique identifier for the building. The maximum length is 100 characters.
    buildingId :: (Core.Maybe Core.Text),
    -- | The building name as seen by users in Calendar. Must be unique for the customer. For example, \"NYC-CHEL\". The maximum length is 100 characters.
    buildingName :: (Core.Maybe Core.Text),
    -- | The geographic coordinates of the center of the building, expressed as latitude and longitude in decimal degrees.
    coordinates :: (Core.Maybe BuildingCoordinates),
    -- | A brief description of the building. For example, \"Chelsea Market\".
    description :: (Core.Maybe Core.Text),
    -- | ETag of the resource.
    etags :: (Core.Maybe Core.Text),
    -- | The display names for all floors in this building. The floors are expected to be sorted in ascending order, from lowest floor to highest floor. For example, [\"B2\", \"B1\", \"L\", \"1\", \"2\", \"2M\", \"3\", \"PH\"] Must contain at least one entry.
    floorNames :: (Core.Maybe [Core.Text]),
    -- | Kind of resource this is.
    kind :: Core.Text
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Building' with the minimum fields required to make a request.
newBuilding ::
  Building
newBuilding =
  Building
    { address = Core.Nothing,
      buildingId = Core.Nothing,
      buildingName = Core.Nothing,
      coordinates = Core.Nothing,
      description = Core.Nothing,
      etags = Core.Nothing,
      floorNames = Core.Nothing,
      kind = "admin#directory#resources#buildings#Building"
    }

instance Core.FromJSON Building where
  parseJSON =
    Core.withObject
      "Building"
      ( \o ->
          Building
            Core.<$> (o Core..:? "address")
            Core.<*> (o Core..:? "buildingId")
            Core.<*> (o Core..:? "buildingName")
            Core.<*> (o Core..:? "coordinates")
            Core.<*> (o Core..:? "description")
            Core.<*> (o Core..:? "etags")
            Core.<*> (o Core..:? "floorNames")
            Core.<*> ( o
                         Core..:? "kind"
                         Core..!= "admin#directory#resources#buildings#Building"
                     )
      )

instance Core.ToJSON Building where
  toJSON Building {..} =
    Core.object
      ( Core.catMaybes
          [ ("address" Core..=) Core.<$> address,
            ("buildingId" Core..=) Core.<$> buildingId,
            ("buildingName" Core..=) Core.<$> buildingName,
            ("coordinates" Core..=) Core.<$> coordinates,
            ("description" Core..=) Core.<$> description,
            ("etags" Core..=) Core.<$> etags,
            ("floorNames" Core..=) Core.<$> floorNames,
            Core.Just ("kind" Core..= kind)
          ]
      )

-- | Public API: Resources.buildings
--
-- /See:/ 'newBuildingAddress' smart constructor.
data BuildingAddress = BuildingAddress
  { -- | Unstructured address lines describing the lower levels of an address.
    addressLines :: (Core.Maybe [Core.Text]),
    -- | Optional. Highest administrative subdivision which is used for postal addresses of a country or region.
    administrativeArea :: (Core.Maybe Core.Text),
    -- | Optional. BCP-47 language code of the contents of this address (if known).
    languageCode :: (Core.Maybe Core.Text),
    -- | Optional. Generally refers to the city\/town portion of the address. Examples: US city, IT comune, UK post town. In regions of the world where localities are not well defined or do not fit into this structure well, leave locality empty and use addressLines.
    locality :: (Core.Maybe Core.Text),
    -- | Optional. Postal code of the address.
    postalCode :: (Core.Maybe Core.Text),
    -- | Required. CLDR region code of the country\/region of the address.
    regionCode :: (Core.Maybe Core.Text),
    -- | Optional. Sublocality of the address.
    sublocality :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'BuildingAddress' with the minimum fields required to make a request.
newBuildingAddress ::
  BuildingAddress
newBuildingAddress =
  BuildingAddress
    { addressLines = Core.Nothing,
      administrativeArea = Core.Nothing,
      languageCode = Core.Nothing,
      locality = Core.Nothing,
      postalCode = Core.Nothing,
      regionCode = Core.Nothing,
      sublocality = Core.Nothing
    }

instance Core.FromJSON BuildingAddress where
  parseJSON =
    Core.withObject
      "BuildingAddress"
      ( \o ->
          BuildingAddress
            Core.<$> (o Core..:? "addressLines")
            Core.<*> (o Core..:? "administrativeArea")
            Core.<*> (o Core..:? "languageCode")
            Core.<*> (o Core..:? "locality")
            Core.<*> (o Core..:? "postalCode")
            Core.<*> (o Core..:? "regionCode")
            Core.<*> (o Core..:? "sublocality")
      )

instance Core.ToJSON BuildingAddress where
  toJSON BuildingAddress {..} =
    Core.object
      ( Core.catMaybes
          [ ("addressLines" Core..=) Core.<$> addressLines,
            ("administrativeArea" Core..=) Core.<$> administrativeArea,
            ("languageCode" Core..=) Core.<$> languageCode,
            ("locality" Core..=) Core.<$> locality,
            ("postalCode" Core..=) Core.<$> postalCode,
            ("regionCode" Core..=) Core.<$> regionCode,
            ("sublocality" Core..=) Core.<$> sublocality
          ]
      )

-- | Public API: Resources.buildings
--
-- /See:/ 'newBuildingCoordinates' smart constructor.
data BuildingCoordinates = BuildingCoordinates
  { -- | Latitude in decimal degrees.
    latitude :: (Core.Maybe Core.Double),
    -- | Longitude in decimal degrees.
    longitude :: (Core.Maybe Core.Double)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'BuildingCoordinates' with the minimum fields required to make a request.
newBuildingCoordinates ::
  BuildingCoordinates
newBuildingCoordinates =
  BuildingCoordinates
    { latitude = Core.Nothing,
      longitude = Core.Nothing
    }

instance Core.FromJSON BuildingCoordinates where
  parseJSON =
    Core.withObject
      "BuildingCoordinates"
      ( \o ->
          BuildingCoordinates
            Core.<$> (o Core..:? "latitude")
            Core.<*> (o Core..:? "longitude")
      )

instance Core.ToJSON BuildingCoordinates where
  toJSON BuildingCoordinates {..} =
    Core.object
      ( Core.catMaybes
          [ ("latitude" Core..=) Core.<$> latitude,
            ("longitude" Core..=) Core.<$> longitude
          ]
      )

-- | Public API: Resources.buildings
--
-- /See:/ 'newBuildings' smart constructor.
data Buildings = Buildings
  { -- | The Buildings in this page of results.
    buildings :: (Core.Maybe [Building]),
    -- | ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | Kind of resource this is.
    kind :: Core.Text,
    -- | The continuation token, used to page through large result sets. Provide this value in a subsequent request to return the next page of results.
    nextPageToken :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Buildings' with the minimum fields required to make a request.
newBuildings ::
  Buildings
newBuildings =
  Buildings
    { buildings = Core.Nothing,
      etag = Core.Nothing,
      kind = "admin#directory#resources#buildings#buildingsList",
      nextPageToken = Core.Nothing
    }

instance Core.FromJSON Buildings where
  parseJSON =
    Core.withObject
      "Buildings"
      ( \o ->
          Buildings
            Core.<$> (o Core..:? "buildings")
            Core.<*> (o Core..:? "etag")
            Core.<*> ( o
                         Core..:? "kind"
                         Core..!= "admin#directory#resources#buildings#buildingsList"
                     )
            Core.<*> (o Core..:? "nextPageToken")
      )

instance Core.ToJSON Buildings where
  toJSON Buildings {..} =
    Core.object
      ( Core.catMaybes
          [ ("buildings" Core..=) Core.<$> buildings,
            ("etag" Core..=) Core.<$> etag,
            Core.Just ("kind" Core..= kind),
            ("nextPageToken" Core..=) Core.<$> nextPageToken
          ]
      )

-- | Represents a data capacity with some amount of current usage in bytes.
--
-- /See:/ 'newByteUsage' smart constructor.
data ByteUsage = ByteUsage
  { -- | Output only. The total capacity value, in bytes.
    capacityBytes :: (Core.Maybe Core.Int64),
    -- | Output only. The current usage value, in bytes.
    usedBytes :: (Core.Maybe Core.Int64)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ByteUsage' with the minimum fields required to make a request.
newByteUsage ::
  ByteUsage
newByteUsage =
  ByteUsage {capacityBytes = Core.Nothing, usedBytes = Core.Nothing}

instance Core.FromJSON ByteUsage where
  parseJSON =
    Core.withObject
      "ByteUsage"
      ( \o ->
          ByteUsage
            Core.<$> (o Core..:? "capacityBytes" Core.<&> Core.fmap Core.fromAsText)
            Core.<*> (o Core..:? "usedBytes" Core.<&> Core.fmap Core.fromAsText)
      )

instance Core.ToJSON ByteUsage where
  toJSON ByteUsage {..} =
    Core.object
      ( Core.catMaybes
          [ ("capacityBytes" Core..=)
              Core.. Core.AsText
              Core.<$> capacityBytes,
            ("usedBytes" Core..=) Core.. Core.AsText Core.<$> usedBytes
          ]
      )

-- | Public API: Resources.calendars
--
-- /See:/ 'newCalendarResource' smart constructor.
data CalendarResource = CalendarResource
  { -- | Unique ID for the building a resource is located in.
    buildingId :: (Core.Maybe Core.Text),
    -- | Capacity of a resource, number of seats in a room.
    capacity :: (Core.Maybe Core.Int32),
    -- | ETag of the resource.
    etags :: (Core.Maybe Core.Text),
    -- | Instances of features for the calendar resource.
    featureInstances :: (Core.Maybe Core.Value),
    -- | Name of the floor a resource is located on.
    floorName :: (Core.Maybe Core.Text),
    -- | Name of the section within a floor a resource is located in.
    floorSection :: (Core.Maybe Core.Text),
    -- | The read-only auto-generated name of the calendar resource which includes metadata about the resource such as building name, floor, capacity, etc. For example, \"NYC-2-Training Room 1A (16)\".
    generatedResourceName :: (Core.Maybe Core.Text),
    -- | The type of the resource. For calendar resources, the value is @admin#directory#resources#calendars#CalendarResource@.
    kind :: Core.Text,
    -- | The category of the calendar resource. Either CONFERENCE/ROOM or OTHER. Legacy data is set to CATEGORY/UNKNOWN.
    resourceCategory :: (Core.Maybe Core.Text),
    -- | Description of the resource, visible only to admins.
    resourceDescription :: (Core.Maybe Core.Text),
    -- | The read-only email for the calendar resource. Generated as part of creating a new calendar resource.
    resourceEmail :: (Core.Maybe Core.Text),
    -- | The unique ID for the calendar resource.
    resourceId :: (Core.Maybe Core.Text),
    -- | The name of the calendar resource. For example, \"Training Room 1A\".
    resourceName :: (Core.Maybe Core.Text),
    -- | The type of the calendar resource, intended for non-room resources.
    resourceType :: (Core.Maybe Core.Text),
    -- | Description of the resource, visible to users and admins.
    userVisibleDescription :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'CalendarResource' with the minimum fields required to make a request.
newCalendarResource ::
  CalendarResource
newCalendarResource =
  CalendarResource
    { buildingId = Core.Nothing,
      capacity = Core.Nothing,
      etags = Core.Nothing,
      featureInstances = Core.Nothing,
      floorName = Core.Nothing,
      floorSection = Core.Nothing,
      generatedResourceName = Core.Nothing,
      kind = "admin#directory#resources#calendars#CalendarResource",
      resourceCategory = Core.Nothing,
      resourceDescription = Core.Nothing,
      resourceEmail = Core.Nothing,
      resourceId = Core.Nothing,
      resourceName = Core.Nothing,
      resourceType = Core.Nothing,
      userVisibleDescription = Core.Nothing
    }

instance Core.FromJSON CalendarResource where
  parseJSON =
    Core.withObject
      "CalendarResource"
      ( \o ->
          CalendarResource
            Core.<$> (o Core..:? "buildingId")
            Core.<*> (o Core..:? "capacity")
            Core.<*> (o Core..:? "etags")
            Core.<*> (o Core..:? "featureInstances")
            Core.<*> (o Core..:? "floorName")
            Core.<*> (o Core..:? "floorSection")
            Core.<*> (o Core..:? "generatedResourceName")
            Core.<*> ( o
                         Core..:? "kind"
                         Core..!= "admin#directory#resources#calendars#CalendarResource"
                     )
            Core.<*> (o Core..:? "resourceCategory")
            Core.<*> (o Core..:? "resourceDescription")
            Core.<*> (o Core..:? "resourceEmail")
            Core.<*> (o Core..:? "resourceId")
            Core.<*> (o Core..:? "resourceName")
            Core.<*> (o Core..:? "resourceType")
            Core.<*> (o Core..:? "userVisibleDescription")
      )

instance Core.ToJSON CalendarResource where
  toJSON CalendarResource {..} =
    Core.object
      ( Core.catMaybes
          [ ("buildingId" Core..=) Core.<$> buildingId,
            ("capacity" Core..=) Core.<$> capacity,
            ("etags" Core..=) Core.<$> etags,
            ("featureInstances" Core..=) Core.<$> featureInstances,
            ("floorName" Core..=) Core.<$> floorName,
            ("floorSection" Core..=) Core.<$> floorSection,
            ("generatedResourceName" Core..=) Core.<$> generatedResourceName,
            Core.Just ("kind" Core..= kind),
            ("resourceCategory" Core..=) Core.<$> resourceCategory,
            ("resourceDescription" Core..=) Core.<$> resourceDescription,
            ("resourceEmail" Core..=) Core.<$> resourceEmail,
            ("resourceId" Core..=) Core.<$> resourceId,
            ("resourceName" Core..=) Core.<$> resourceName,
            ("resourceType" Core..=) Core.<$> resourceType,
            ("userVisibleDescription" Core..=)
              Core.<$> userVisibleDescription
          ]
      )

-- | Public API: Resources.calendars
--
-- /See:/ 'newCalendarResources' smart constructor.
data CalendarResources = CalendarResources
  { -- | ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | The CalendarResources in this page of results.
    items :: (Core.Maybe [CalendarResource]),
    -- | Identifies this as a collection of CalendarResources. This is always @admin#directory#resources#calendars#calendarResourcesList@.
    kind :: Core.Text,
    -- | The continuation token, used to page through large result sets. Provide this value in a subsequent request to return the next page of results.
    nextPageToken :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'CalendarResources' with the minimum fields required to make a request.
newCalendarResources ::
  CalendarResources
newCalendarResources =
  CalendarResources
    { etag = Core.Nothing,
      items = Core.Nothing,
      kind = "admin#directory#resources#calendars#calendarResourcesList",
      nextPageToken = Core.Nothing
    }

instance Core.FromJSON CalendarResources where
  parseJSON =
    Core.withObject
      "CalendarResources"
      ( \o ->
          CalendarResources
            Core.<$> (o Core..:? "etag")
            Core.<*> (o Core..:? "items")
            Core.<*> ( o
                         Core..:? "kind"
                         Core..!= "admin#directory#resources#calendars#calendarResourcesList"
                     )
            Core.<*> (o Core..:? "nextPageToken")
      )

instance Core.ToJSON CalendarResources where
  toJSON CalendarResources {..} =
    Core.object
      ( Core.catMaybes
          [ ("etag" Core..=) Core.<$> etag,
            ("items" Core..=) Core.<$> items,
            Core.Just ("kind" Core..= kind),
            ("nextPageToken" Core..=) Core.<$> nextPageToken
          ]
      )

-- | The result of a single ChromeOS device for a Change state operation.
--
-- /See:/ 'newChangeChromeOsDeviceStatusResult' smart constructor.
data ChangeChromeOsDeviceStatusResult = ChangeChromeOsDeviceStatusResult
  { -- | The unique ID of the ChromeOS device.
    deviceId :: (Core.Maybe Core.Text),
    -- | The error result of the operation in case of failure.
    error :: (Core.Maybe Status),
    -- | The device could change its status successfully.
    response :: (Core.Maybe ChangeChromeOsDeviceStatusSucceeded)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ChangeChromeOsDeviceStatusResult' with the minimum fields required to make a request.
newChangeChromeOsDeviceStatusResult ::
  ChangeChromeOsDeviceStatusResult
newChangeChromeOsDeviceStatusResult =
  ChangeChromeOsDeviceStatusResult
    { deviceId = Core.Nothing,
      error = Core.Nothing,
      response = Core.Nothing
    }

instance Core.FromJSON ChangeChromeOsDeviceStatusResult where
  parseJSON =
    Core.withObject
      "ChangeChromeOsDeviceStatusResult"
      ( \o ->
          ChangeChromeOsDeviceStatusResult
            Core.<$> (o Core..:? "deviceId")
            Core.<*> (o Core..:? "error")
            Core.<*> (o Core..:? "response")
      )

instance Core.ToJSON ChangeChromeOsDeviceStatusResult where
  toJSON ChangeChromeOsDeviceStatusResult {..} =
    Core.object
      ( Core.catMaybes
          [ ("deviceId" Core..=) Core.<$> deviceId,
            ("error" Core..=) Core.<$> error,
            ("response" Core..=) Core.<$> response
          ]
      )

-- | Response for a successful ChromeOS device status change.
--
-- /See:/ 'newChangeChromeOsDeviceStatusSucceeded' smart constructor.
data ChangeChromeOsDeviceStatusSucceeded = ChangeChromeOsDeviceStatusSucceeded
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ChangeChromeOsDeviceStatusSucceeded' with the minimum fields required to make a request.
newChangeChromeOsDeviceStatusSucceeded ::
  ChangeChromeOsDeviceStatusSucceeded
newChangeChromeOsDeviceStatusSucceeded =
  ChangeChromeOsDeviceStatusSucceeded

instance Core.FromJSON ChangeChromeOsDeviceStatusSucceeded where
  parseJSON =
    Core.withObject
      "ChangeChromeOsDeviceStatusSucceeded"
      (\o -> Core.pure ChangeChromeOsDeviceStatusSucceeded)

instance Core.ToJSON ChangeChromeOsDeviceStatusSucceeded where
  toJSON = Core.const Core.emptyObject

-- | An notification channel used to watch for resource changes.
--
-- /See:/ 'newChannel' smart constructor.
data Channel = Channel
  { -- | The address where notifications are delivered for this channel.
    address :: (Core.Maybe Core.Text),
    -- | Date and time of notification channel expiration, expressed as a Unix timestamp, in milliseconds. Optional.
    expiration :: (Core.Maybe Core.Int64),
    -- | A UUID or similar unique string that identifies this channel.
    id :: (Core.Maybe Core.Text),
    -- | Identifies this as a notification channel used to watch for changes to a resource, which is @api#channel@.
    kind :: Core.Text,
    -- | Additional parameters controlling delivery channel behavior. Optional. For example, @params.ttl@ specifies the time-to-live in seconds for the notification channel, where the default is 2 hours and the maximum TTL is 2 days.
    params :: (Core.Maybe Channel_Params),
    -- | A Boolean value to indicate whether payload is wanted. Optional.
    payload :: (Core.Maybe Core.Bool),
    -- | An opaque ID that identifies the resource being watched on this channel. Stable across different API versions.
    resourceId :: (Core.Maybe Core.Text),
    -- | A version-specific identifier for the watched resource.
    resourceUri :: (Core.Maybe Core.Text),
    -- | An arbitrary string delivered to the target address with each notification delivered over this channel. Optional.
    token :: (Core.Maybe Core.Text),
    -- | The type of delivery mechanism used for this channel.
    type' :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Channel' with the minimum fields required to make a request.
newChannel ::
  Channel
newChannel =
  Channel
    { address = Core.Nothing,
      expiration = Core.Nothing,
      id = Core.Nothing,
      kind = "api#channel",
      params = Core.Nothing,
      payload = Core.Nothing,
      resourceId = Core.Nothing,
      resourceUri = Core.Nothing,
      token = Core.Nothing,
      type' = Core.Nothing
    }

instance Core.FromJSON Channel where
  parseJSON =
    Core.withObject
      "Channel"
      ( \o ->
          Channel
            Core.<$> (o Core..:? "address")
            Core.<*> (o Core..:? "expiration" Core.<&> Core.fmap Core.fromAsText)
            Core.<*> (o Core..:? "id")
            Core.<*> (o Core..:? "kind" Core..!= "api#channel")
            Core.<*> (o Core..:? "params")
            Core.<*> (o Core..:? "payload")
            Core.<*> (o Core..:? "resourceId")
            Core.<*> (o Core..:? "resourceUri")
            Core.<*> (o Core..:? "token")
            Core.<*> (o Core..:? "type")
      )

instance Core.ToJSON Channel where
  toJSON Channel {..} =
    Core.object
      ( Core.catMaybes
          [ ("address" Core..=) Core.<$> address,
            ("expiration" Core..=) Core.. Core.AsText Core.<$> expiration,
            ("id" Core..=) Core.<$> id,
            Core.Just ("kind" Core..= kind),
            ("params" Core..=) Core.<$> params,
            ("payload" Core..=) Core.<$> payload,
            ("resourceId" Core..=) Core.<$> resourceId,
            ("resourceUri" Core..=) Core.<$> resourceUri,
            ("token" Core..=) Core.<$> token,
            ("type" Core..=) Core.<$> type'
          ]
      )

-- | Additional parameters controlling delivery channel behavior. Optional. For example, @params.ttl@ specifies the time-to-live in seconds for the notification channel, where the default is 2 hours and the maximum TTL is 2 days.
--
-- /See:/ 'newChannel_Params' smart constructor.
newtype Channel_Params = Channel_Params
  { additional :: (Core.HashMap Core.Text Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Channel_Params' with the minimum fields required to make a request.
newChannel_Params ::
  -- |  See 'additional'.
  Core.HashMap Core.Text Core.Text ->
  Channel_Params
newChannel_Params additional =
  Channel_Params {additional = additional}

instance Core.FromJSON Channel_Params where
  parseJSON =
    Core.withObject
      "Channel_Params"
      (\o -> Channel_Params Core.<$> (Core.parseJSONObject o))

instance Core.ToJSON Channel_Params where
  toJSON Channel_Params {..} = Core.toJSON additional

-- | Google Chrome devices run on the <https://support.google.com/chromeos Chrome OS>. For more information about common API tasks, see the </admin-sdk/directory/v1/guides/manage-chrome-devices Developer\'s Guide>.
--
-- /See:/ 'newChromeOsDevice' smart constructor.
data ChromeOsDevice = ChromeOsDevice
  { -- | A list of active time ranges (Read-only).
    activeTimeRanges :: (Core.Maybe [ChromeOsDevice_ActiveTimeRangesItem]),
    -- | The asset identifier as noted by an administrator or specified during enrollment.
    annotatedAssetId :: (Core.Maybe Core.Text),
    -- | The address or location of the device as noted by the administrator. Maximum length is @200@ characters. Empty values are allowed.
    annotatedLocation :: (Core.Maybe Core.Text),
    -- | The user of the device as noted by the administrator. Maximum length is 100 characters. Empty values are allowed.
    annotatedUser :: (Core.Maybe Core.Text),
    -- | (Read-only) The timestamp after which the device will stop receiving Chrome updates or support. Please use \"autoUpdateThrough\" instead.
    autoUpdateExpiration :: (Core.Maybe Core.Int64),
    -- | Output only. The timestamp after which the device will stop receiving Chrome updates or support.
    autoUpdateThrough :: (Core.Maybe Core.Text),
    -- | Output only. Contains backlight information for the device.
    backlightInfo :: (Core.Maybe [BacklightInfo]),
    -- | The boot mode for the device. The possible values are: * @Verified@: The device is running a valid version of the Chrome OS. * @Dev@: The devices\'s developer hardware switch is enabled. When booted, the device has a command line shell. For an example of a developer switch, see the <https://www.chromium.org/chromium-os/developer-information-for-chrome-os-devices/samsung-series-5-chromebook#TOC-Developer-switch Chromebook developer information>.
    bootMode :: (Core.Maybe Core.Text),
    -- | Output only. Chrome OS type of the device.
    chromeOsType :: (Core.Maybe ChromeOsDevice_ChromeOsType),
    -- | Information regarding CPU specs in the device.
    cpuInfo :: (Core.Maybe [ChromeOsDevice_CpuInfoItem]),
    -- | Reports of CPU utilization and temperature (Read-only)
    cpuStatusReports :: (Core.Maybe [ChromeOsDevice_CpuStatusReportsItem]),
    -- | (Read-only) Deprovision reason.
    deprovisionReason :: (Core.Maybe ChromeOsDevice_DeprovisionReason),
    -- | A list of device files to download (Read-only)
    deviceFiles :: (Core.Maybe [ChromeOsDevice_DeviceFilesItem]),
    -- | The unique ID of the Chrome device.
    deviceId :: (Core.Maybe Core.Text),
    -- | Output only. Device license type.
    deviceLicenseType :: (Core.Maybe ChromeOsDevice_DeviceLicenseType),
    -- | Output only. How much disk space the device has available and is currently using.
    diskSpaceUsage :: (Core.Maybe ByteUsage),
    -- | Reports of disk space and other info about mounted\/connected volumes.
    diskVolumeReports :: (Core.Maybe [ChromeOsDevice_DiskVolumeReportsItem]),
    -- | (Read-only) Built-in MAC address for the docking station that the device connected to. Factory sets Media access control address (MAC address) assigned for use by a dock. It is reserved specifically for MAC pass through device policy. The format is twelve (12) hexadecimal digits without any delimiter (uppercase letters). This is only relevant for some devices.
    dockMacAddress :: (Core.Maybe Core.Text),
    -- | ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | The device\'s MAC address on the ethernet network interface.
    ethernetMacAddress :: (Core.Maybe Core.Text),
    -- | (Read-only) MAC address used by the Chromebook’s internal ethernet port, and for onboard network (ethernet) interface. The format is twelve (12) hexadecimal digits without any delimiter (uppercase letters). This is only relevant for some devices.
    ethernetMacAddress0 :: (Core.Maybe Core.Text),
    -- | Output only. Whether or not the device requires the extended support opt in.
    extendedSupportEligible :: (Core.Maybe Core.Bool),
    -- | Output only. Whether extended support policy is enabled on the device.
    extendedSupportEnabled :: (Core.Maybe Core.Bool),
    -- | Output only. Date of the device when extended support policy for automatic updates starts.
    extendedSupportStart :: (Core.Maybe Core.Text),
    -- | Output only. Fan information for the device.
    fanInfo :: (Core.Maybe [FanInfo]),
    -- | The Chrome device\'s firmware version.
    firmwareVersion :: (Core.Maybe Core.Text),
    -- | Date and time for the first time the device was enrolled.
    firstEnrollmentTime :: (Core.Maybe Core.Text),
    -- | The type of resource. For the Chromeosdevices resource, the value is @admin#directory#chromeosdevice@.
    kind :: Core.Text,
    -- | (Read-only) Date and time for the last deprovision of the device.
    lastDeprovisionTimestamp :: (Core.Maybe Core.Text),
    -- | Date and time the device was last enrolled (Read-only)
    lastEnrollmentTime :: (Core.Maybe Core.DateTime),
    -- | Contains last known network (Read-only)
    lastKnownNetwork :: (Core.Maybe [ChromeOsDevice_LastKnownNetworkItem]),
    -- | Date and time the device was last synchronized with the policy settings in the G Suite administrator control panel (Read-only)
    lastSync :: (Core.Maybe Core.DateTime),
    -- | The device\'s wireless MAC address. If the device does not have this information, it is not included in the response.
    macAddress :: (Core.Maybe Core.Text),
    -- | (Read-only) The date the device was manufactured in yyyy-mm-dd format.
    manufactureDate :: (Core.Maybe Core.Text),
    -- | The Mobile Equipment Identifier (MEID) or the International Mobile Equipment Identity (IMEI) for the 3G mobile card in a mobile device. A MEID\/IMEI is typically used when adding a device to a wireless carrier\'s post-pay service plan. If the device does not have this information, this property is not included in the response. For more information on how to export a MEID\/IMEI list, see the </admin-sdk/directory/v1/guides/manage-chrome-devices.html#export_meid Developer\'s Guide>.
    meid :: (Core.Maybe Core.Text),
    -- | The device\'s model information. If the device does not have this information, this property is not included in the response.
    model :: (Core.Maybe Core.Text),
    -- | Notes about this device added by the administrator. This property can be <https://support.google.com/chrome/a/answer/1698333 searched> with the </admin-sdk/directory/v1/reference/chromeosdevices/list list> method\'s @query@ parameter. Maximum length is 500 characters. Empty values are allowed.
    notes :: (Core.Maybe Core.Text),
    -- | The device\'s order number. Only devices directly purchased from Google have an order number.
    orderNumber :: (Core.Maybe Core.Text),
    -- | The unique ID of the organizational unit. orgUnitPath is the human readable version of orgUnitId. While orgUnitPath may change by renaming an organizational unit within the path, orgUnitId is unchangeable for one organizational unit. This property can be </admin-sdk/directory/v1/guides/manage-chrome-devices#move_chrome_devices_to_ou updated> using the API. For more information about how to create an organizational structure for your device, see the <https://support.google.com/a/answer/182433 administration help center>.
    orgUnitId :: (Core.Maybe Core.Text),
    -- | The full parent path with the organizational unit\'s name associated with the device. Path names are case insensitive. If the parent organizational unit is the top-level organization, it is represented as a forward slash, @\/@. This property can be </admin-sdk/directory/v1/guides/manage-chrome-devices#move_chrome_devices_to_ou updated> using the API. For more information about how to create an organizational structure for your device, see the <https://support.google.com/a/answer/182433 administration help center>.
    orgUnitPath :: (Core.Maybe Core.Text),
    -- | The status of the OS updates for the device.
    osUpdateStatus :: (Core.Maybe OsUpdateStatus),
    -- | The Chrome device\'s operating system version.
    osVersion :: (Core.Maybe Core.Text),
    -- | The Chrome device\'s platform version.
    platformVersion :: (Core.Maybe Core.Text),
    -- | A list of recent device users, in descending order, by last login time.
    recentUsers :: (Core.Maybe [ChromeOsDevice_RecentUsersItem]),
    -- | A list of screenshot files to download. Type is always \"SCREENSHOT_FILE\". (Read-only)
    screenshotFiles :: (Core.Maybe [ChromeOsDevice_ScreenshotFilesItem]),
    -- | The Chrome device serial number entered when the device was enabled. This value is the same as the Admin console\'s /Serial Number/ in the /Chrome OS Devices/ tab.
    serialNumber :: (Core.Maybe Core.Text),
    -- | The status of the device.
    status :: (Core.Maybe Core.Text),
    -- | Final date the device will be supported (Read-only)
    supportEndDate :: (Core.Maybe Core.DateTime),
    -- | Reports of amounts of available RAM memory (Read-only)
    systemRamFreeReports :: (Core.Maybe [ChromeOsDevice_SystemRamFreeReportsItem]),
    -- | Total RAM on the device [in bytes] (Read-only)
    systemRamTotal :: (Core.Maybe Core.Int64),
    -- | Trusted Platform Module (TPM) (Read-only)
    tpmVersionInfo :: (Core.Maybe ChromeOsDevice_TpmVersionInfo),
    -- | Determines if the device will auto renew its support after the support end date. This is a read-only property.
    willAutoRenew :: (Core.Maybe Core.Bool)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ChromeOsDevice' with the minimum fields required to make a request.
newChromeOsDevice ::
  ChromeOsDevice
newChromeOsDevice =
  ChromeOsDevice
    { activeTimeRanges = Core.Nothing,
      annotatedAssetId = Core.Nothing,
      annotatedLocation = Core.Nothing,
      annotatedUser = Core.Nothing,
      autoUpdateExpiration = Core.Nothing,
      autoUpdateThrough = Core.Nothing,
      backlightInfo = Core.Nothing,
      bootMode = Core.Nothing,
      chromeOsType = Core.Nothing,
      cpuInfo = Core.Nothing,
      cpuStatusReports = Core.Nothing,
      deprovisionReason = Core.Nothing,
      deviceFiles = Core.Nothing,
      deviceId = Core.Nothing,
      deviceLicenseType = Core.Nothing,
      diskSpaceUsage = Core.Nothing,
      diskVolumeReports = Core.Nothing,
      dockMacAddress = Core.Nothing,
      etag = Core.Nothing,
      ethernetMacAddress = Core.Nothing,
      ethernetMacAddress0 = Core.Nothing,
      extendedSupportEligible = Core.Nothing,
      extendedSupportEnabled = Core.Nothing,
      extendedSupportStart = Core.Nothing,
      fanInfo = Core.Nothing,
      firmwareVersion = Core.Nothing,
      firstEnrollmentTime = Core.Nothing,
      kind = "admin#directory#chromeosdevice",
      lastDeprovisionTimestamp = Core.Nothing,
      lastEnrollmentTime = Core.Nothing,
      lastKnownNetwork = Core.Nothing,
      lastSync = Core.Nothing,
      macAddress = Core.Nothing,
      manufactureDate = Core.Nothing,
      meid = Core.Nothing,
      model = Core.Nothing,
      notes = Core.Nothing,
      orderNumber = Core.Nothing,
      orgUnitId = Core.Nothing,
      orgUnitPath = Core.Nothing,
      osUpdateStatus = Core.Nothing,
      osVersion = Core.Nothing,
      platformVersion = Core.Nothing,
      recentUsers = Core.Nothing,
      screenshotFiles = Core.Nothing,
      serialNumber = Core.Nothing,
      status = Core.Nothing,
      supportEndDate = Core.Nothing,
      systemRamFreeReports = Core.Nothing,
      systemRamTotal = Core.Nothing,
      tpmVersionInfo = Core.Nothing,
      willAutoRenew = Core.Nothing
    }

instance Core.FromJSON ChromeOsDevice where
  parseJSON =
    Core.withObject
      "ChromeOsDevice"
      ( \o ->
          ChromeOsDevice
            Core.<$> (o Core..:? "activeTimeRanges")
            Core.<*> (o Core..:? "annotatedAssetId")
            Core.<*> (o Core..:? "annotatedLocation")
            Core.<*> (o Core..:? "annotatedUser")
            Core.<*> ( o
                         Core..:? "autoUpdateExpiration"
                         Core.<&> Core.fmap Core.fromAsText
                     )
            Core.<*> (o Core..:? "autoUpdateThrough")
            Core.<*> (o Core..:? "backlightInfo")
            Core.<*> (o Core..:? "bootMode")
            Core.<*> (o Core..:? "chromeOsType")
            Core.<*> (o Core..:? "cpuInfo")
            Core.<*> (o Core..:? "cpuStatusReports")
            Core.<*> (o Core..:? "deprovisionReason")
            Core.<*> (o Core..:? "deviceFiles")
            Core.<*> (o Core..:? "deviceId")
            Core.<*> (o Core..:? "deviceLicenseType")
            Core.<*> (o Core..:? "diskSpaceUsage")
            Core.<*> (o Core..:? "diskVolumeReports")
            Core.<*> (o Core..:? "dockMacAddress")
            Core.<*> (o Core..:? "etag")
            Core.<*> (o Core..:? "ethernetMacAddress")
            Core.<*> (o Core..:? "ethernetMacAddress0")
            Core.<*> (o Core..:? "extendedSupportEligible")
            Core.<*> (o Core..:? "extendedSupportEnabled")
            Core.<*> (o Core..:? "extendedSupportStart")
            Core.<*> (o Core..:? "fanInfo")
            Core.<*> (o Core..:? "firmwareVersion")
            Core.<*> (o Core..:? "firstEnrollmentTime")
            Core.<*> (o Core..:? "kind" Core..!= "admin#directory#chromeosdevice")
            Core.<*> (o Core..:? "lastDeprovisionTimestamp")
            Core.<*> (o Core..:? "lastEnrollmentTime")
            Core.<*> (o Core..:? "lastKnownNetwork")
            Core.<*> (o Core..:? "lastSync")
            Core.<*> (o Core..:? "macAddress")
            Core.<*> (o Core..:? "manufactureDate")
            Core.<*> (o Core..:? "meid")
            Core.<*> (o Core..:? "model")
            Core.<*> (o Core..:? "notes")
            Core.<*> (o Core..:? "orderNumber")
            Core.<*> (o Core..:? "orgUnitId")
            Core.<*> (o Core..:? "orgUnitPath")
            Core.<*> (o Core..:? "osUpdateStatus")
            Core.<*> (o Core..:? "osVersion")
            Core.<*> (o Core..:? "platformVersion")
            Core.<*> (o Core..:? "recentUsers")
            Core.<*> (o Core..:? "screenshotFiles")
            Core.<*> (o Core..:? "serialNumber")
            Core.<*> (o Core..:? "status")
            Core.<*> (o Core..:? "supportEndDate")
            Core.<*> (o Core..:? "systemRamFreeReports")
            Core.<*> (o Core..:? "systemRamTotal" Core.<&> Core.fmap Core.fromAsText)
            Core.<*> (o Core..:? "tpmVersionInfo")
            Core.<*> (o Core..:? "willAutoRenew")
      )

instance Core.ToJSON ChromeOsDevice where
  toJSON ChromeOsDevice {..} =
    Core.object
      ( Core.catMaybes
          [ ("activeTimeRanges" Core..=) Core.<$> activeTimeRanges,
            ("annotatedAssetId" Core..=) Core.<$> annotatedAssetId,
            ("annotatedLocation" Core..=) Core.<$> annotatedLocation,
            ("annotatedUser" Core..=) Core.<$> annotatedUser,
            ("autoUpdateExpiration" Core..=)
              Core.. Core.AsText
              Core.<$> autoUpdateExpiration,
            ("autoUpdateThrough" Core..=) Core.<$> autoUpdateThrough,
            ("backlightInfo" Core..=) Core.<$> backlightInfo,
            ("bootMode" Core..=) Core.<$> bootMode,
            ("chromeOsType" Core..=) Core.<$> chromeOsType,
            ("cpuInfo" Core..=) Core.<$> cpuInfo,
            ("cpuStatusReports" Core..=) Core.<$> cpuStatusReports,
            ("deprovisionReason" Core..=) Core.<$> deprovisionReason,
            ("deviceFiles" Core..=) Core.<$> deviceFiles,
            ("deviceId" Core..=) Core.<$> deviceId,
            ("deviceLicenseType" Core..=) Core.<$> deviceLicenseType,
            ("diskSpaceUsage" Core..=) Core.<$> diskSpaceUsage,
            ("diskVolumeReports" Core..=) Core.<$> diskVolumeReports,
            ("dockMacAddress" Core..=) Core.<$> dockMacAddress,
            ("etag" Core..=) Core.<$> etag,
            ("ethernetMacAddress" Core..=) Core.<$> ethernetMacAddress,
            ("ethernetMacAddress0" Core..=) Core.<$> ethernetMacAddress0,
            ("extendedSupportEligible" Core..=)
              Core.<$> extendedSupportEligible,
            ("extendedSupportEnabled" Core..=) Core.<$> extendedSupportEnabled,
            ("extendedSupportStart" Core..=) Core.<$> extendedSupportStart,
            ("fanInfo" Core..=) Core.<$> fanInfo,
            ("firmwareVersion" Core..=) Core.<$> firmwareVersion,
            ("firstEnrollmentTime" Core..=) Core.<$> firstEnrollmentTime,
            Core.Just ("kind" Core..= kind),
            ("lastDeprovisionTimestamp" Core..=)
              Core.<$> lastDeprovisionTimestamp,
            ("lastEnrollmentTime" Core..=) Core.<$> lastEnrollmentTime,
            ("lastKnownNetwork" Core..=) Core.<$> lastKnownNetwork,
            ("lastSync" Core..=) Core.<$> lastSync,
            ("macAddress" Core..=) Core.<$> macAddress,
            ("manufactureDate" Core..=) Core.<$> manufactureDate,
            ("meid" Core..=) Core.<$> meid,
            ("model" Core..=) Core.<$> model,
            ("notes" Core..=) Core.<$> notes,
            ("orderNumber" Core..=) Core.<$> orderNumber,
            ("orgUnitId" Core..=) Core.<$> orgUnitId,
            ("orgUnitPath" Core..=) Core.<$> orgUnitPath,
            ("osUpdateStatus" Core..=) Core.<$> osUpdateStatus,
            ("osVersion" Core..=) Core.<$> osVersion,
            ("platformVersion" Core..=) Core.<$> platformVersion,
            ("recentUsers" Core..=) Core.<$> recentUsers,
            ("screenshotFiles" Core..=) Core.<$> screenshotFiles,
            ("serialNumber" Core..=) Core.<$> serialNumber,
            ("status" Core..=) Core.<$> status,
            ("supportEndDate" Core..=) Core.<$> supportEndDate,
            ("systemRamFreeReports" Core..=) Core.<$> systemRamFreeReports,
            ("systemRamTotal" Core..=)
              Core.. Core.AsText
              Core.<$> systemRamTotal,
            ("tpmVersionInfo" Core..=) Core.<$> tpmVersionInfo,
            ("willAutoRenew" Core..=) Core.<$> willAutoRenew
          ]
      )

--
-- /See:/ 'newChromeOsDevice_ActiveTimeRangesItem' smart constructor.
data ChromeOsDevice_ActiveTimeRangesItem = ChromeOsDevice_ActiveTimeRangesItem
  { -- | Duration of usage in milliseconds.
    activeTime :: (Core.Maybe Core.Int32),
    -- | Date of usage
    date :: (Core.Maybe Core.Date)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ChromeOsDevice_ActiveTimeRangesItem' with the minimum fields required to make a request.
newChromeOsDevice_ActiveTimeRangesItem ::
  ChromeOsDevice_ActiveTimeRangesItem
newChromeOsDevice_ActiveTimeRangesItem =
  ChromeOsDevice_ActiveTimeRangesItem
    { activeTime = Core.Nothing,
      date = Core.Nothing
    }

instance Core.FromJSON ChromeOsDevice_ActiveTimeRangesItem where
  parseJSON =
    Core.withObject
      "ChromeOsDevice_ActiveTimeRangesItem"
      ( \o ->
          ChromeOsDevice_ActiveTimeRangesItem
            Core.<$> (o Core..:? "activeTime")
            Core.<*> (o Core..:? "date")
      )

instance Core.ToJSON ChromeOsDevice_ActiveTimeRangesItem where
  toJSON ChromeOsDevice_ActiveTimeRangesItem {..} =
    Core.object
      ( Core.catMaybes
          [ ("activeTime" Core..=) Core.<$> activeTime,
            ("date" Core..=) Core.<$> date
          ]
      )

-- | CPU specs for a CPU.
--
-- /See:/ 'newChromeOsDevice_CpuInfoItem' smart constructor.
data ChromeOsDevice_CpuInfoItem = ChromeOsDevice_CpuInfoItem
  { -- | The CPU architecture.
    architecture :: (Core.Maybe Core.Text),
    -- | Information for the Logical CPUs
    logicalCpus :: (Core.Maybe [ChromeOsDevice_CpuInfoItem_LogicalCpusItem]),
    -- | The max CPU clock speed in kHz.
    maxClockSpeedKhz :: (Core.Maybe Core.Int32),
    -- | The CPU model name.
    model :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ChromeOsDevice_CpuInfoItem' with the minimum fields required to make a request.
newChromeOsDevice_CpuInfoItem ::
  ChromeOsDevice_CpuInfoItem
newChromeOsDevice_CpuInfoItem =
  ChromeOsDevice_CpuInfoItem
    { architecture = Core.Nothing,
      logicalCpus = Core.Nothing,
      maxClockSpeedKhz = Core.Nothing,
      model = Core.Nothing
    }

instance Core.FromJSON ChromeOsDevice_CpuInfoItem where
  parseJSON =
    Core.withObject
      "ChromeOsDevice_CpuInfoItem"
      ( \o ->
          ChromeOsDevice_CpuInfoItem
            Core.<$> (o Core..:? "architecture")
            Core.<*> (o Core..:? "logicalCpus")
            Core.<*> (o Core..:? "maxClockSpeedKhz")
            Core.<*> (o Core..:? "model")
      )

instance Core.ToJSON ChromeOsDevice_CpuInfoItem where
  toJSON ChromeOsDevice_CpuInfoItem {..} =
    Core.object
      ( Core.catMaybes
          [ ("architecture" Core..=) Core.<$> architecture,
            ("logicalCpus" Core..=) Core.<$> logicalCpus,
            ("maxClockSpeedKhz" Core..=) Core.<$> maxClockSpeedKhz,
            ("model" Core..=) Core.<$> model
          ]
      )

-- | Status of a single logical CPU.
--
-- /See:/ 'newChromeOsDevice_CpuInfoItem_LogicalCpusItem' smart constructor.
data ChromeOsDevice_CpuInfoItem_LogicalCpusItem = ChromeOsDevice_CpuInfoItem_LogicalCpusItem
  { -- | C-States indicate the power consumption state of the CPU. For more information look at documentation published by the CPU maker.
    cStates ::
      ( Core.Maybe
          [ChromeOsDevice_CpuInfoItem_LogicalCpusItem_CStatesItem]
      ),
    -- | Current frequency the CPU is running at.
    currentScalingFrequencyKhz :: (Core.Maybe Core.Int32),
    -- | Idle time since last boot.
    idleDuration :: (Core.Maybe Core.Duration),
    -- | Maximum frequency the CPU is allowed to run at, by policy.
    maxScalingFrequencyKhz :: (Core.Maybe Core.Int32)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ChromeOsDevice_CpuInfoItem_LogicalCpusItem' with the minimum fields required to make a request.
newChromeOsDevice_CpuInfoItem_LogicalCpusItem ::
  ChromeOsDevice_CpuInfoItem_LogicalCpusItem
newChromeOsDevice_CpuInfoItem_LogicalCpusItem =
  ChromeOsDevice_CpuInfoItem_LogicalCpusItem
    { cStates =
        Core.Nothing,
      currentScalingFrequencyKhz = Core.Nothing,
      idleDuration = Core.Nothing,
      maxScalingFrequencyKhz = Core.Nothing
    }

instance Core.FromJSON ChromeOsDevice_CpuInfoItem_LogicalCpusItem where
  parseJSON =
    Core.withObject
      "ChromeOsDevice_CpuInfoItem_LogicalCpusItem"
      ( \o ->
          ChromeOsDevice_CpuInfoItem_LogicalCpusItem
            Core.<$> (o Core..:? "cStates")
            Core.<*> (o Core..:? "currentScalingFrequencyKhz")
            Core.<*> (o Core..:? "idleDuration")
            Core.<*> (o Core..:? "maxScalingFrequencyKhz")
      )

instance Core.ToJSON ChromeOsDevice_CpuInfoItem_LogicalCpusItem where
  toJSON ChromeOsDevice_CpuInfoItem_LogicalCpusItem {..} =
    Core.object
      ( Core.catMaybes
          [ ("cStates" Core..=) Core.<$> cStates,
            ("currentScalingFrequencyKhz" Core..=)
              Core.<$> currentScalingFrequencyKhz,
            ("idleDuration" Core..=) Core.<$> idleDuration,
            ("maxScalingFrequencyKhz" Core..=)
              Core.<$> maxScalingFrequencyKhz
          ]
      )

-- | Status of a single C-state. C-states are various modes the CPU can transition to in order to use more or less power.
--
-- /See:/ 'newChromeOsDevice_CpuInfoItem_LogicalCpusItem_CStatesItem' smart constructor.
data ChromeOsDevice_CpuInfoItem_LogicalCpusItem_CStatesItem = ChromeOsDevice_CpuInfoItem_LogicalCpusItem_CStatesItem
  { -- | Name of the state.
    displayName :: (Core.Maybe Core.Text),
    -- | Time spent in the state since the last reboot.
    sessionDuration :: (Core.Maybe Core.Duration)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ChromeOsDevice_CpuInfoItem_LogicalCpusItem_CStatesItem' with the minimum fields required to make a request.
newChromeOsDevice_CpuInfoItem_LogicalCpusItem_CStatesItem ::
  ChromeOsDevice_CpuInfoItem_LogicalCpusItem_CStatesItem
newChromeOsDevice_CpuInfoItem_LogicalCpusItem_CStatesItem =
  ChromeOsDevice_CpuInfoItem_LogicalCpusItem_CStatesItem
    { displayName =
        Core.Nothing,
      sessionDuration = Core.Nothing
    }

instance
  Core.FromJSON
    ChromeOsDevice_CpuInfoItem_LogicalCpusItem_CStatesItem
  where
  parseJSON =
    Core.withObject
      "ChromeOsDevice_CpuInfoItem_LogicalCpusItem_CStatesItem"
      ( \o ->
          ChromeOsDevice_CpuInfoItem_LogicalCpusItem_CStatesItem
            Core.<$> (o Core..:? "displayName")
            Core.<*> (o Core..:? "sessionDuration")
      )

instance
  Core.ToJSON
    ChromeOsDevice_CpuInfoItem_LogicalCpusItem_CStatesItem
  where
  toJSON ChromeOsDevice_CpuInfoItem_LogicalCpusItem_CStatesItem {..} =
    Core.object
      ( Core.catMaybes
          [ ("displayName" Core..=) Core.<$> displayName,
            ("sessionDuration" Core..=) Core.<$> sessionDuration
          ]
      )

--
-- /See:/ 'newChromeOsDevice_CpuStatusReportsItem' smart constructor.
data ChromeOsDevice_CpuStatusReportsItem = ChromeOsDevice_CpuStatusReportsItem
  { -- | A list of CPU temperature samples.
    cpuTemperatureInfo ::
      ( Core.Maybe
          [ChromeOsDevice_CpuStatusReportsItem_CpuTemperatureInfoItem]
      ),
    cpuUtilizationPercentageInfo :: (Core.Maybe [Core.Int32]),
    -- | Date and time the report was received.
    reportTime :: (Core.Maybe Core.DateTime)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ChromeOsDevice_CpuStatusReportsItem' with the minimum fields required to make a request.
newChromeOsDevice_CpuStatusReportsItem ::
  ChromeOsDevice_CpuStatusReportsItem
newChromeOsDevice_CpuStatusReportsItem =
  ChromeOsDevice_CpuStatusReportsItem
    { cpuTemperatureInfo =
        Core.Nothing,
      cpuUtilizationPercentageInfo = Core.Nothing,
      reportTime = Core.Nothing
    }

instance Core.FromJSON ChromeOsDevice_CpuStatusReportsItem where
  parseJSON =
    Core.withObject
      "ChromeOsDevice_CpuStatusReportsItem"
      ( \o ->
          ChromeOsDevice_CpuStatusReportsItem
            Core.<$> (o Core..:? "cpuTemperatureInfo")
            Core.<*> (o Core..:? "cpuUtilizationPercentageInfo")
            Core.<*> (o Core..:? "reportTime")
      )

instance Core.ToJSON ChromeOsDevice_CpuStatusReportsItem where
  toJSON ChromeOsDevice_CpuStatusReportsItem {..} =
    Core.object
      ( Core.catMaybes
          [ ("cpuTemperatureInfo" Core..=) Core.<$> cpuTemperatureInfo,
            ("cpuUtilizationPercentageInfo" Core..=)
              Core.<$> cpuUtilizationPercentageInfo,
            ("reportTime" Core..=) Core.<$> reportTime
          ]
      )

--
-- /See:/ 'newChromeOsDevice_CpuStatusReportsItem_CpuTemperatureInfoItem' smart constructor.
data ChromeOsDevice_CpuStatusReportsItem_CpuTemperatureInfoItem = ChromeOsDevice_CpuStatusReportsItem_CpuTemperatureInfoItem
  { -- | CPU label
    label :: (Core.Maybe Core.Text),
    -- | Temperature in Celsius degrees.
    temperature :: (Core.Maybe Core.Int32)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ChromeOsDevice_CpuStatusReportsItem_CpuTemperatureInfoItem' with the minimum fields required to make a request.
newChromeOsDevice_CpuStatusReportsItem_CpuTemperatureInfoItem ::
  ChromeOsDevice_CpuStatusReportsItem_CpuTemperatureInfoItem
newChromeOsDevice_CpuStatusReportsItem_CpuTemperatureInfoItem =
  ChromeOsDevice_CpuStatusReportsItem_CpuTemperatureInfoItem
    { label =
        Core.Nothing,
      temperature = Core.Nothing
    }

instance
  Core.FromJSON
    ChromeOsDevice_CpuStatusReportsItem_CpuTemperatureInfoItem
  where
  parseJSON =
    Core.withObject
      "ChromeOsDevice_CpuStatusReportsItem_CpuTemperatureInfoItem"
      ( \o ->
          ChromeOsDevice_CpuStatusReportsItem_CpuTemperatureInfoItem
            Core.<$> (o Core..:? "label")
            Core.<*> (o Core..:? "temperature")
      )

instance
  Core.ToJSON
    ChromeOsDevice_CpuStatusReportsItem_CpuTemperatureInfoItem
  where
  toJSON
    ChromeOsDevice_CpuStatusReportsItem_CpuTemperatureInfoItem {..} =
      Core.object
        ( Core.catMaybes
            [ ("label" Core..=) Core.<$> label,
              ("temperature" Core..=) Core.<$> temperature
            ]
        )

--
-- /See:/ 'newChromeOsDevice_DeviceFilesItem' smart constructor.
data ChromeOsDevice_DeviceFilesItem = ChromeOsDevice_DeviceFilesItem
  { -- | Date and time the file was created
    createTime :: (Core.Maybe Core.DateTime),
    -- | File download URL
    downloadUrl :: (Core.Maybe Core.Text),
    -- | File name
    name :: (Core.Maybe Core.Text),
    -- | File type
    type' :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ChromeOsDevice_DeviceFilesItem' with the minimum fields required to make a request.
newChromeOsDevice_DeviceFilesItem ::
  ChromeOsDevice_DeviceFilesItem
newChromeOsDevice_DeviceFilesItem =
  ChromeOsDevice_DeviceFilesItem
    { createTime = Core.Nothing,
      downloadUrl = Core.Nothing,
      name = Core.Nothing,
      type' = Core.Nothing
    }

instance Core.FromJSON ChromeOsDevice_DeviceFilesItem where
  parseJSON =
    Core.withObject
      "ChromeOsDevice_DeviceFilesItem"
      ( \o ->
          ChromeOsDevice_DeviceFilesItem
            Core.<$> (o Core..:? "createTime")
            Core.<*> (o Core..:? "downloadUrl")
            Core.<*> (o Core..:? "name")
            Core.<*> (o Core..:? "type")
      )

instance Core.ToJSON ChromeOsDevice_DeviceFilesItem where
  toJSON ChromeOsDevice_DeviceFilesItem {..} =
    Core.object
      ( Core.catMaybes
          [ ("createTime" Core..=) Core.<$> createTime,
            ("downloadUrl" Core..=) Core.<$> downloadUrl,
            ("name" Core..=) Core.<$> name,
            ("type" Core..=) Core.<$> type'
          ]
      )

--
-- /See:/ 'newChromeOsDevice_DiskVolumeReportsItem' smart constructor.
newtype ChromeOsDevice_DiskVolumeReportsItem = ChromeOsDevice_DiskVolumeReportsItem
  { -- | Disk volumes
    volumeInfo :: (Core.Maybe [ChromeOsDevice_DiskVolumeReportsItem_VolumeInfoItem])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ChromeOsDevice_DiskVolumeReportsItem' with the minimum fields required to make a request.
newChromeOsDevice_DiskVolumeReportsItem ::
  ChromeOsDevice_DiskVolumeReportsItem
newChromeOsDevice_DiskVolumeReportsItem =
  ChromeOsDevice_DiskVolumeReportsItem {volumeInfo = Core.Nothing}

instance Core.FromJSON ChromeOsDevice_DiskVolumeReportsItem where
  parseJSON =
    Core.withObject
      "ChromeOsDevice_DiskVolumeReportsItem"
      ( \o ->
          ChromeOsDevice_DiskVolumeReportsItem
            Core.<$> (o Core..:? "volumeInfo")
      )

instance Core.ToJSON ChromeOsDevice_DiskVolumeReportsItem where
  toJSON ChromeOsDevice_DiskVolumeReportsItem {..} =
    Core.object
      (Core.catMaybes [("volumeInfo" Core..=) Core.<$> volumeInfo])

--
-- /See:/ 'newChromeOsDevice_DiskVolumeReportsItem_VolumeInfoItem' smart constructor.
data ChromeOsDevice_DiskVolumeReportsItem_VolumeInfoItem = ChromeOsDevice_DiskVolumeReportsItem_VolumeInfoItem
  { -- | Free disk space [in bytes]
    storageFree :: (Core.Maybe Core.Int64),
    -- | Total disk space [in bytes]
    storageTotal :: (Core.Maybe Core.Int64),
    -- | Volume id
    volumeId :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ChromeOsDevice_DiskVolumeReportsItem_VolumeInfoItem' with the minimum fields required to make a request.
newChromeOsDevice_DiskVolumeReportsItem_VolumeInfoItem ::
  ChromeOsDevice_DiskVolumeReportsItem_VolumeInfoItem
newChromeOsDevice_DiskVolumeReportsItem_VolumeInfoItem =
  ChromeOsDevice_DiskVolumeReportsItem_VolumeInfoItem
    { storageFree =
        Core.Nothing,
      storageTotal = Core.Nothing,
      volumeId = Core.Nothing
    }

instance
  Core.FromJSON
    ChromeOsDevice_DiskVolumeReportsItem_VolumeInfoItem
  where
  parseJSON =
    Core.withObject
      "ChromeOsDevice_DiskVolumeReportsItem_VolumeInfoItem"
      ( \o ->
          ChromeOsDevice_DiskVolumeReportsItem_VolumeInfoItem
            Core.<$> (o Core..:? "storageFree" Core.<&> Core.fmap Core.fromAsText)
            Core.<*> (o Core..:? "storageTotal" Core.<&> Core.fmap Core.fromAsText)
            Core.<*> (o Core..:? "volumeId")
      )

instance
  Core.ToJSON
    ChromeOsDevice_DiskVolumeReportsItem_VolumeInfoItem
  where
  toJSON ChromeOsDevice_DiskVolumeReportsItem_VolumeInfoItem {..} =
    Core.object
      ( Core.catMaybes
          [ ("storageFree" Core..=) Core.. Core.AsText Core.<$> storageFree,
            ("storageTotal" Core..=) Core.. Core.AsText Core.<$> storageTotal,
            ("volumeId" Core..=) Core.<$> volumeId
          ]
      )

-- | Information for an ip address.
--
-- /See:/ 'newChromeOsDevice_LastKnownNetworkItem' smart constructor.
data ChromeOsDevice_LastKnownNetworkItem = ChromeOsDevice_LastKnownNetworkItem
  { -- | The IP address.
    ipAddress :: (Core.Maybe Core.Text),
    -- | The WAN IP address.
    wanIpAddress :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ChromeOsDevice_LastKnownNetworkItem' with the minimum fields required to make a request.
newChromeOsDevice_LastKnownNetworkItem ::
  ChromeOsDevice_LastKnownNetworkItem
newChromeOsDevice_LastKnownNetworkItem =
  ChromeOsDevice_LastKnownNetworkItem
    { ipAddress = Core.Nothing,
      wanIpAddress = Core.Nothing
    }

instance Core.FromJSON ChromeOsDevice_LastKnownNetworkItem where
  parseJSON =
    Core.withObject
      "ChromeOsDevice_LastKnownNetworkItem"
      ( \o ->
          ChromeOsDevice_LastKnownNetworkItem
            Core.<$> (o Core..:? "ipAddress")
            Core.<*> (o Core..:? "wanIpAddress")
      )

instance Core.ToJSON ChromeOsDevice_LastKnownNetworkItem where
  toJSON ChromeOsDevice_LastKnownNetworkItem {..} =
    Core.object
      ( Core.catMaybes
          [ ("ipAddress" Core..=) Core.<$> ipAddress,
            ("wanIpAddress" Core..=) Core.<$> wanIpAddress
          ]
      )

-- | A list of recent device users, in descending order, by last login time.
--
-- /See:/ 'newChromeOsDevice_RecentUsersItem' smart constructor.
data ChromeOsDevice_RecentUsersItem = ChromeOsDevice_RecentUsersItem
  { -- | The user\'s email address. This is only present if the user type is @USER_TYPE_MANAGED@.
    email :: (Core.Maybe Core.Text),
    -- | The type of the user.
    type' :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ChromeOsDevice_RecentUsersItem' with the minimum fields required to make a request.
newChromeOsDevice_RecentUsersItem ::
  ChromeOsDevice_RecentUsersItem
newChromeOsDevice_RecentUsersItem =
  ChromeOsDevice_RecentUsersItem
    { email = Core.Nothing,
      type' = Core.Nothing
    }

instance Core.FromJSON ChromeOsDevice_RecentUsersItem where
  parseJSON =
    Core.withObject
      "ChromeOsDevice_RecentUsersItem"
      ( \o ->
          ChromeOsDevice_RecentUsersItem
            Core.<$> (o Core..:? "email")
            Core.<*> (o Core..:? "type")
      )

instance Core.ToJSON ChromeOsDevice_RecentUsersItem where
  toJSON ChromeOsDevice_RecentUsersItem {..} =
    Core.object
      ( Core.catMaybes
          [ ("email" Core..=) Core.<$> email,
            ("type" Core..=) Core.<$> type'
          ]
      )

--
-- /See:/ 'newChromeOsDevice_ScreenshotFilesItem' smart constructor.
data ChromeOsDevice_ScreenshotFilesItem = ChromeOsDevice_ScreenshotFilesItem
  { -- | Date and time the file was created
    createTime :: (Core.Maybe Core.DateTime),
    -- | File download URL
    downloadUrl :: (Core.Maybe Core.Text),
    -- | File name
    name :: (Core.Maybe Core.Text),
    -- | File type
    type' :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ChromeOsDevice_ScreenshotFilesItem' with the minimum fields required to make a request.
newChromeOsDevice_ScreenshotFilesItem ::
  ChromeOsDevice_ScreenshotFilesItem
newChromeOsDevice_ScreenshotFilesItem =
  ChromeOsDevice_ScreenshotFilesItem
    { createTime = Core.Nothing,
      downloadUrl = Core.Nothing,
      name = Core.Nothing,
      type' = Core.Nothing
    }

instance Core.FromJSON ChromeOsDevice_ScreenshotFilesItem where
  parseJSON =
    Core.withObject
      "ChromeOsDevice_ScreenshotFilesItem"
      ( \o ->
          ChromeOsDevice_ScreenshotFilesItem
            Core.<$> (o Core..:? "createTime")
            Core.<*> (o Core..:? "downloadUrl")
            Core.<*> (o Core..:? "name")
            Core.<*> (o Core..:? "type")
      )

instance Core.ToJSON ChromeOsDevice_ScreenshotFilesItem where
  toJSON ChromeOsDevice_ScreenshotFilesItem {..} =
    Core.object
      ( Core.catMaybes
          [ ("createTime" Core..=) Core.<$> createTime,
            ("downloadUrl" Core..=) Core.<$> downloadUrl,
            ("name" Core..=) Core.<$> name,
            ("type" Core..=) Core.<$> type'
          ]
      )

--
-- /See:/ 'newChromeOsDevice_SystemRamFreeReportsItem' smart constructor.
data ChromeOsDevice_SystemRamFreeReportsItem = ChromeOsDevice_SystemRamFreeReportsItem
  { -- | Date and time the report was received.
    reportTime :: (Core.Maybe Core.DateTime),
    systemRamFreeInfo :: (Core.Maybe [Core.Int64])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ChromeOsDevice_SystemRamFreeReportsItem' with the minimum fields required to make a request.
newChromeOsDevice_SystemRamFreeReportsItem ::
  ChromeOsDevice_SystemRamFreeReportsItem
newChromeOsDevice_SystemRamFreeReportsItem =
  ChromeOsDevice_SystemRamFreeReportsItem
    { reportTime =
        Core.Nothing,
      systemRamFreeInfo = Core.Nothing
    }

instance Core.FromJSON ChromeOsDevice_SystemRamFreeReportsItem where
  parseJSON =
    Core.withObject
      "ChromeOsDevice_SystemRamFreeReportsItem"
      ( \o ->
          ChromeOsDevice_SystemRamFreeReportsItem
            Core.<$> (o Core..:? "reportTime")
            Core.<*> ( o
                         Core..:? "systemRamFreeInfo"
                         Core.<&> Core.fmap (Core.fmap Core.fromAsText)
                     )
      )

instance Core.ToJSON ChromeOsDevice_SystemRamFreeReportsItem where
  toJSON ChromeOsDevice_SystemRamFreeReportsItem {..} =
    Core.object
      ( Core.catMaybes
          [ ("reportTime" Core..=) Core.<$> reportTime,
            ("systemRamFreeInfo" Core..=)
              Core.. Core.fmap Core.AsText
              Core.<$> systemRamFreeInfo
          ]
      )

-- | Trusted Platform Module (TPM) (Read-only)
--
-- /See:/ 'newChromeOsDevice_TpmVersionInfo' smart constructor.
data ChromeOsDevice_TpmVersionInfo = ChromeOsDevice_TpmVersionInfo
  { -- | TPM family. We use the TPM 2.0 style encoding, e.g.: TPM 1.2: \"1.2\" -> 312e3200 TPM 2.0: \"2.0\" -> 322e3000
    family :: (Core.Maybe Core.Text),
    -- | TPM firmware version.
    firmwareVersion :: (Core.Maybe Core.Text),
    -- | TPM manufacturer code.
    manufacturer :: (Core.Maybe Core.Text),
    -- | TPM specification level. See Library Specification for TPM 2.0 and Main Specification for TPM 1.2.
    specLevel :: (Core.Maybe Core.Text),
    -- | TPM model number.
    tpmModel :: (Core.Maybe Core.Text),
    -- | Vendor-specific information such as Vendor ID.
    vendorSpecific :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ChromeOsDevice_TpmVersionInfo' with the minimum fields required to make a request.
newChromeOsDevice_TpmVersionInfo ::
  ChromeOsDevice_TpmVersionInfo
newChromeOsDevice_TpmVersionInfo =
  ChromeOsDevice_TpmVersionInfo
    { family = Core.Nothing,
      firmwareVersion = Core.Nothing,
      manufacturer = Core.Nothing,
      specLevel = Core.Nothing,
      tpmModel = Core.Nothing,
      vendorSpecific = Core.Nothing
    }

instance Core.FromJSON ChromeOsDevice_TpmVersionInfo where
  parseJSON =
    Core.withObject
      "ChromeOsDevice_TpmVersionInfo"
      ( \o ->
          ChromeOsDevice_TpmVersionInfo
            Core.<$> (o Core..:? "family")
            Core.<*> (o Core..:? "firmwareVersion")
            Core.<*> (o Core..:? "manufacturer")
            Core.<*> (o Core..:? "specLevel")
            Core.<*> (o Core..:? "tpmModel")
            Core.<*> (o Core..:? "vendorSpecific")
      )

instance Core.ToJSON ChromeOsDevice_TpmVersionInfo where
  toJSON ChromeOsDevice_TpmVersionInfo {..} =
    Core.object
      ( Core.catMaybes
          [ ("family" Core..=) Core.<$> family,
            ("firmwareVersion" Core..=) Core.<$> firmwareVersion,
            ("manufacturer" Core..=) Core.<$> manufacturer,
            ("specLevel" Core..=) Core.<$> specLevel,
            ("tpmModel" Core..=) Core.<$> tpmModel,
            ("vendorSpecific" Core..=) Core.<$> vendorSpecific
          ]
      )

-- | Data about an update to the status of a Chrome OS device.
--
-- /See:/ 'newChromeOsDeviceAction' smart constructor.
data ChromeOsDeviceAction = ChromeOsDeviceAction
  { -- | Action to be taken on the Chrome OS device.
    action :: (Core.Maybe Core.Text),
    -- | Only used when the action is @deprovision@. With the @deprovision@ action, this field is required. /Note/: The deprovision reason is audited because it might have implications on licenses for perpetual subscription customers.
    deprovisionReason :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ChromeOsDeviceAction' with the minimum fields required to make a request.
newChromeOsDeviceAction ::
  ChromeOsDeviceAction
newChromeOsDeviceAction =
  ChromeOsDeviceAction
    { action = Core.Nothing,
      deprovisionReason = Core.Nothing
    }

instance Core.FromJSON ChromeOsDeviceAction where
  parseJSON =
    Core.withObject
      "ChromeOsDeviceAction"
      ( \o ->
          ChromeOsDeviceAction
            Core.<$> (o Core..:? "action")
            Core.<*> (o Core..:? "deprovisionReason")
      )

instance Core.ToJSON ChromeOsDeviceAction where
  toJSON ChromeOsDeviceAction {..} =
    Core.object
      ( Core.catMaybes
          [ ("action" Core..=) Core.<$> action,
            ("deprovisionReason" Core..=) Core.<$> deprovisionReason
          ]
      )

--
-- /See:/ 'newChromeOsDevices' smart constructor.
data ChromeOsDevices = ChromeOsDevices
  { -- | A list of Chrome OS Device objects.
    chromeosdevices :: (Core.Maybe [ChromeOsDevice]),
    -- | ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | Kind of resource this is.
    kind :: Core.Text,
    -- | Token used to access the next page of this result. To access the next page, use this token\'s value in the @pageToken@ query string of this request.
    nextPageToken :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ChromeOsDevices' with the minimum fields required to make a request.
newChromeOsDevices ::
  ChromeOsDevices
newChromeOsDevices =
  ChromeOsDevices
    { chromeosdevices = Core.Nothing,
      etag = Core.Nothing,
      kind = "admin#directory#chromeosdevices",
      nextPageToken = Core.Nothing
    }

instance Core.FromJSON ChromeOsDevices where
  parseJSON =
    Core.withObject
      "ChromeOsDevices"
      ( \o ->
          ChromeOsDevices
            Core.<$> (o Core..:? "chromeosdevices")
            Core.<*> (o Core..:? "etag")
            Core.<*> (o Core..:? "kind" Core..!= "admin#directory#chromeosdevices")
            Core.<*> (o Core..:? "nextPageToken")
      )

instance Core.ToJSON ChromeOsDevices where
  toJSON ChromeOsDevices {..} =
    Core.object
      ( Core.catMaybes
          [ ("chromeosdevices" Core..=) Core.<$> chromeosdevices,
            ("etag" Core..=) Core.<$> etag,
            Core.Just ("kind" Core..= kind),
            ("nextPageToken" Core..=) Core.<$> nextPageToken
          ]
      )

--
-- /See:/ 'newChromeOsMoveDevicesToOu' smart constructor.
newtype ChromeOsMoveDevicesToOu = ChromeOsMoveDevicesToOu
  { -- | Chrome OS devices to be moved to OU
    deviceIds :: (Core.Maybe [Core.Text])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ChromeOsMoveDevicesToOu' with the minimum fields required to make a request.
newChromeOsMoveDevicesToOu ::
  ChromeOsMoveDevicesToOu
newChromeOsMoveDevicesToOu =
  ChromeOsMoveDevicesToOu {deviceIds = Core.Nothing}

instance Core.FromJSON ChromeOsMoveDevicesToOu where
  parseJSON =
    Core.withObject
      "ChromeOsMoveDevicesToOu"
      (\o -> ChromeOsMoveDevicesToOu Core.<$> (o Core..:? "deviceIds"))

instance Core.ToJSON ChromeOsMoveDevicesToOu where
  toJSON ChromeOsMoveDevicesToOu {..} =
    Core.object
      (Core.catMaybes [("deviceIds" Core..=) Core.<$> deviceIds])

-- | Request for adding a new print server.
--
-- /See:/ 'newCreatePrintServerRequest' smart constructor.
data CreatePrintServerRequest = CreatePrintServerRequest
  { -- | Required. The <https://developers.google.com/admin-sdk/directory/reference/rest/v1/customers unique ID> of the customer\'s Google Workspace account. Format: @customers\/{id}@
    parent :: (Core.Maybe Core.Text),
    -- | Required. A print server to create. If you want to place the print server under a specific organizational unit (OU), then populate the @org_unit_id@. Otherwise the print server is created under the root OU. The @org_unit_id@ can be retrieved using the <https://developers.google.com/admin-sdk/directory/v1/guides/manage-org-units Directory API>.
    printServer :: (Core.Maybe PrintServer)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'CreatePrintServerRequest' with the minimum fields required to make a request.
newCreatePrintServerRequest ::
  CreatePrintServerRequest
newCreatePrintServerRequest =
  CreatePrintServerRequest
    { parent = Core.Nothing,
      printServer = Core.Nothing
    }

instance Core.FromJSON CreatePrintServerRequest where
  parseJSON =
    Core.withObject
      "CreatePrintServerRequest"
      ( \o ->
          CreatePrintServerRequest
            Core.<$> (o Core..:? "parent")
            Core.<*> (o Core..:? "printServer")
      )

instance Core.ToJSON CreatePrintServerRequest where
  toJSON CreatePrintServerRequest {..} =
    Core.object
      ( Core.catMaybes
          [ ("parent" Core..=) Core.<$> parent,
            ("printServer" Core..=) Core.<$> printServer
          ]
      )

-- | Request for adding a new printer.
--
-- /See:/ 'newCreatePrinterRequest' smart constructor.
data CreatePrinterRequest = CreatePrinterRequest
  { -- | Required. The name of the customer. Format: customers\/{customer_id}
    parent :: (Core.Maybe Core.Text),
    -- | Required. A printer to create. If you want to place the printer under particular OU then populate printer.org/unit/id filed. Otherwise the printer will be placed under root OU.
    printer :: (Core.Maybe Printer)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'CreatePrinterRequest' with the minimum fields required to make a request.
newCreatePrinterRequest ::
  CreatePrinterRequest
newCreatePrinterRequest =
  CreatePrinterRequest
    { parent = Core.Nothing,
      printer = Core.Nothing
    }

instance Core.FromJSON CreatePrinterRequest where
  parseJSON =
    Core.withObject
      "CreatePrinterRequest"
      ( \o ->
          CreatePrinterRequest
            Core.<$> (o Core..:? "parent")
            Core.<*> (o Core..:? "printer")
      )

instance Core.ToJSON CreatePrinterRequest where
  toJSON CreatePrinterRequest {..} =
    Core.object
      ( Core.catMaybes
          [ ("parent" Core..=) Core.<$> parent,
            ("printer" Core..=) Core.<$> printer
          ]
      )

--
-- /See:/ 'newCustomer' smart constructor.
data Customer = Customer
  { -- | The customer\'s secondary contact email address. This email address cannot be on the same domain as the @customerDomain@
    alternateEmail :: (Core.Maybe Core.Text),
    -- | The customer\'s creation time (Readonly)
    customerCreationTime :: (Core.Maybe Core.DateTime),
    -- | The customer\'s primary domain name string. Do not include the @www@ prefix when creating a new customer.
    customerDomain :: (Core.Maybe Core.Text),
    -- | ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | The unique ID for the customer\'s Google Workspace account. (Readonly)
    id :: (Core.Maybe Core.Text),
    -- | Identifies the resource as a customer. Value: @admin#directory#customer@
    kind :: Core.Text,
    -- | The customer\'s ISO 639-2 language code. See the </admin-sdk/directory/v1/languages Language Codes> page for the list of supported codes. Valid language codes outside the supported set will be accepted by the API but may lead to unexpected behavior. The default value is @en@.
    language :: (Core.Maybe Core.Text),
    -- | The customer\'s contact phone number in <https://en.wikipedia.org/wiki/E.164 E.164> format.
    phoneNumber :: (Core.Maybe Core.Text),
    -- | The customer\'s postal address information.
    postalAddress :: (Core.Maybe CustomerPostalAddress)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Customer' with the minimum fields required to make a request.
newCustomer ::
  Customer
newCustomer =
  Customer
    { alternateEmail = Core.Nothing,
      customerCreationTime = Core.Nothing,
      customerDomain = Core.Nothing,
      etag = Core.Nothing,
      id = Core.Nothing,
      kind = "admin#directory#customer",
      language = Core.Nothing,
      phoneNumber = Core.Nothing,
      postalAddress = Core.Nothing
    }

instance Core.FromJSON Customer where
  parseJSON =
    Core.withObject
      "Customer"
      ( \o ->
          Customer
            Core.<$> (o Core..:? "alternateEmail")
            Core.<*> (o Core..:? "customerCreationTime")
            Core.<*> (o Core..:? "customerDomain")
            Core.<*> (o Core..:? "etag")
            Core.<*> (o Core..:? "id")
            Core.<*> (o Core..:? "kind" Core..!= "admin#directory#customer")
            Core.<*> (o Core..:? "language")
            Core.<*> (o Core..:? "phoneNumber")
            Core.<*> (o Core..:? "postalAddress")
      )

instance Core.ToJSON Customer where
  toJSON Customer {..} =
    Core.object
      ( Core.catMaybes
          [ ("alternateEmail" Core..=) Core.<$> alternateEmail,
            ("customerCreationTime" Core..=) Core.<$> customerCreationTime,
            ("customerDomain" Core..=) Core.<$> customerDomain,
            ("etag" Core..=) Core.<$> etag,
            ("id" Core..=) Core.<$> id,
            Core.Just ("kind" Core..= kind),
            ("language" Core..=) Core.<$> language,
            ("phoneNumber" Core..=) Core.<$> phoneNumber,
            ("postalAddress" Core..=) Core.<$> postalAddress
          ]
      )

--
-- /See:/ 'newCustomerPostalAddress' smart constructor.
data CustomerPostalAddress = CustomerPostalAddress
  { -- | A customer\'s physical address. The address can be composed of one to three lines.
    addressLine1 :: (Core.Maybe Core.Text),
    -- | Address line 2 of the address.
    addressLine2 :: (Core.Maybe Core.Text),
    -- | Address line 3 of the address.
    addressLine3 :: (Core.Maybe Core.Text),
    -- | The customer contact\'s name.
    contactName :: (Core.Maybe Core.Text),
    -- | This is a required property. For @countryCode@ information see the <https://www.iso.org/iso/country_codes.htm ISO 3166 country code elements>.
    countryCode :: (Core.Maybe Core.Text),
    -- | Name of the locality. An example of a locality value is the city of @San Francisco@.
    locality :: (Core.Maybe Core.Text),
    -- | The company or company division name.
    organizationName :: (Core.Maybe Core.Text),
    -- | The postal code. A postalCode example is a postal zip code such as @10009@. This is in accordance with - http: \/\/portablecontacts.net\/draft-spec.html#address_element.
    postalCode :: (Core.Maybe Core.Text),
    -- | Name of the region. An example of a region value is @NY@ for the state of New York.
    region :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'CustomerPostalAddress' with the minimum fields required to make a request.
newCustomerPostalAddress ::
  CustomerPostalAddress
newCustomerPostalAddress =
  CustomerPostalAddress
    { addressLine1 = Core.Nothing,
      addressLine2 = Core.Nothing,
      addressLine3 = Core.Nothing,
      contactName = Core.Nothing,
      countryCode = Core.Nothing,
      locality = Core.Nothing,
      organizationName = Core.Nothing,
      postalCode = Core.Nothing,
      region = Core.Nothing
    }

instance Core.FromJSON CustomerPostalAddress where
  parseJSON =
    Core.withObject
      "CustomerPostalAddress"
      ( \o ->
          CustomerPostalAddress
            Core.<$> (o Core..:? "addressLine1")
            Core.<*> (o Core..:? "addressLine2")
            Core.<*> (o Core..:? "addressLine3")
            Core.<*> (o Core..:? "contactName")
            Core.<*> (o Core..:? "countryCode")
            Core.<*> (o Core..:? "locality")
            Core.<*> (o Core..:? "organizationName")
            Core.<*> (o Core..:? "postalCode")
            Core.<*> (o Core..:? "region")
      )

instance Core.ToJSON CustomerPostalAddress where
  toJSON CustomerPostalAddress {..} =
    Core.object
      ( Core.catMaybes
          [ ("addressLine1" Core..=) Core.<$> addressLine1,
            ("addressLine2" Core..=) Core.<$> addressLine2,
            ("addressLine3" Core..=) Core.<$> addressLine3,
            ("contactName" Core..=) Core.<$> contactName,
            ("countryCode" Core..=) Core.<$> countryCode,
            ("locality" Core..=) Core.<$> locality,
            ("organizationName" Core..=) Core.<$> organizationName,
            ("postalCode" Core..=) Core.<$> postalCode,
            ("region" Core..=) Core.<$> region
          ]
      )

-- | Information regarding a command that was issued to a device.
--
-- /See:/ 'newDirectoryChromeosdevicesCommand' smart constructor.
data DirectoryChromeosdevicesCommand = DirectoryChromeosdevicesCommand
  { -- | The time at which the command will expire. If the device doesn\'t execute the command within this time the command will become expired.
    commandExpireTime :: (Core.Maybe Core.DateTime),
    -- | Unique ID of a device command.
    commandId :: (Core.Maybe Core.Int64),
    -- | The result of the command execution.
    commandResult :: (Core.Maybe DirectoryChromeosdevicesCommandResult),
    -- | The timestamp when the command was issued by the admin.
    issueTime :: (Core.Maybe Core.DateTime),
    -- | The payload that the command specified, if any.
    payload :: (Core.Maybe Core.Text),
    -- | Indicates the command state.
    state :: (Core.Maybe DirectoryChromeosdevicesCommand_State),
    -- | The type of the command.
    type' :: (Core.Maybe DirectoryChromeosdevicesCommand_Type)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'DirectoryChromeosdevicesCommand' with the minimum fields required to make a request.
newDirectoryChromeosdevicesCommand ::
  DirectoryChromeosdevicesCommand
newDirectoryChromeosdevicesCommand =
  DirectoryChromeosdevicesCommand
    { commandExpireTime = Core.Nothing,
      commandId = Core.Nothing,
      commandResult = Core.Nothing,
      issueTime = Core.Nothing,
      payload = Core.Nothing,
      state = Core.Nothing,
      type' = Core.Nothing
    }

instance Core.FromJSON DirectoryChromeosdevicesCommand where
  parseJSON =
    Core.withObject
      "DirectoryChromeosdevicesCommand"
      ( \o ->
          DirectoryChromeosdevicesCommand
            Core.<$> (o Core..:? "commandExpireTime")
            Core.<*> (o Core..:? "commandId" Core.<&> Core.fmap Core.fromAsText)
            Core.<*> (o Core..:? "commandResult")
            Core.<*> (o Core..:? "issueTime")
            Core.<*> (o Core..:? "payload")
            Core.<*> (o Core..:? "state")
            Core.<*> (o Core..:? "type")
      )

instance Core.ToJSON DirectoryChromeosdevicesCommand where
  toJSON DirectoryChromeosdevicesCommand {..} =
    Core.object
      ( Core.catMaybes
          [ ("commandExpireTime" Core..=) Core.<$> commandExpireTime,
            ("commandId" Core..=) Core.. Core.AsText Core.<$> commandId,
            ("commandResult" Core..=) Core.<$> commandResult,
            ("issueTime" Core..=) Core.<$> issueTime,
            ("payload" Core..=) Core.<$> payload,
            ("state" Core..=) Core.<$> state,
            ("type" Core..=) Core.<$> type'
          ]
      )

-- | The result of executing a command.
--
-- /See:/ 'newDirectoryChromeosdevicesCommandResult' smart constructor.
data DirectoryChromeosdevicesCommandResult = DirectoryChromeosdevicesCommandResult
  { -- | The payload for the command result. The following commands respond with a payload: * @DEVICE_START_CRD_SESSION@: Payload is a stringified JSON object in the form: { \"url\": url }. The URL provides a link to the Chrome Remote Desktop session.
    commandResultPayload :: (Core.Maybe Core.Text),
    -- | The error message with a short explanation as to why the command failed. Only present if the command failed.
    errorMessage :: (Core.Maybe Core.Text),
    -- | The time at which the command was executed or failed to execute.
    executeTime :: (Core.Maybe Core.DateTime),
    -- | The result of the command.
    result :: (Core.Maybe DirectoryChromeosdevicesCommandResult_Result)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'DirectoryChromeosdevicesCommandResult' with the minimum fields required to make a request.
newDirectoryChromeosdevicesCommandResult ::
  DirectoryChromeosdevicesCommandResult
newDirectoryChromeosdevicesCommandResult =
  DirectoryChromeosdevicesCommandResult
    { commandResultPayload =
        Core.Nothing,
      errorMessage = Core.Nothing,
      executeTime = Core.Nothing,
      result = Core.Nothing
    }

instance Core.FromJSON DirectoryChromeosdevicesCommandResult where
  parseJSON =
    Core.withObject
      "DirectoryChromeosdevicesCommandResult"
      ( \o ->
          DirectoryChromeosdevicesCommandResult
            Core.<$> (o Core..:? "commandResultPayload")
            Core.<*> (o Core..:? "errorMessage")
            Core.<*> (o Core..:? "executeTime")
            Core.<*> (o Core..:? "result")
      )

instance Core.ToJSON DirectoryChromeosdevicesCommandResult where
  toJSON DirectoryChromeosdevicesCommandResult {..} =
    Core.object
      ( Core.catMaybes
          [ ("commandResultPayload" Core..=) Core.<$> commandResultPayload,
            ("errorMessage" Core..=) Core.<$> errorMessage,
            ("executeTime" Core..=) Core.<$> executeTime,
            ("result" Core..=) Core.<$> result
          ]
      )

-- | A request for issuing a command.
--
-- /See:/ 'newDirectoryChromeosdevicesIssueCommandRequest' smart constructor.
data DirectoryChromeosdevicesIssueCommandRequest = DirectoryChromeosdevicesIssueCommandRequest
  { -- | The type of command.
    commandType ::
      ( Core.Maybe
          DirectoryChromeosdevicesIssueCommandRequest_CommandType
      ),
    -- | The payload for the command, provide it only if command supports it. The following commands support adding payload: * @SET_VOLUME@: Payload is a stringified JSON object in the form: { \"volume\": 50 }. The volume has to be an integer in the range [0,100]. * @DEVICE_START_CRD_SESSION@: Payload is optionally a stringified JSON object in the form: { \"ackedUserPresence\": true, \"crdSessionType\": string }. @ackedUserPresence@ is a boolean. By default, @ackedUserPresence@ is set to @false@. To start a Chrome Remote Desktop session for an active device, set @ackedUserPresence@ to @true@. @crdSessionType@ can only select from values @private@ (which grants the remote admin exclusive control of the ChromeOS device) or @shared@ (which allows the admin and the local user to share control of the ChromeOS device). If not set, @crdSessionType@ defaults to @shared@. * @REBOOT@: Payload is a stringified JSON object in the form: { \"user/session/delay/seconds\": 300 }. The @user_session_delay_seconds@ is the amount of
    -- seconds to wait before rebooting the device if a user is logged in. It has to be an integer in the range [0,300]. When payload is not present for reboot, 0 delay is the default. Note: This only applies if an actual user is logged in, including a Guest. If the device is in the login screen or in Kiosk mode the value is not respected and the device immediately reboots. * @FETCH_SUPPORT_PACKET@: Payload is optionally a stringified JSON object in the form: {\"supportPacketDetails\":{ \"issueCaseId\": optional/support/case/id/string, \"issueDescription\": optional/issue/description/string, \"requestedDataCollectors\": []}} The list of available @data_collector_enums@ are as following: Chrome System Information (1), Crash IDs (2), Memory Details (3), UI Hierarchy (4), Additional ChromeOS Platform Logs (5), Device Event (6), Intel WiFi NICs Debug Dump (7), Touch Events (8), Lacros (9), Lacros System Information (10), ChromeOS Flex Logs (11), DBus Details (12), ChromeOS Network Routes (13), ChromeOS Shill (Connection
    -- Manager) Logs (14), Policies (15), ChromeOS System State and Logs (16), ChromeOS System Logs (17), ChromeOS Chrome User Logs (18), ChromeOS Bluetooth (19), ChromeOS Connected Input Devices (20), ChromeOS Traffic Counters (21), ChromeOS Virtual Keyboard (22), ChromeOS Network Health (23). See more details in <https://support.google.com/chrome/a?p=remote-log help article>.
    payload :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'DirectoryChromeosdevicesIssueCommandRequest' with the minimum fields required to make a request.
newDirectoryChromeosdevicesIssueCommandRequest ::
  DirectoryChromeosdevicesIssueCommandRequest
newDirectoryChromeosdevicesIssueCommandRequest =
  DirectoryChromeosdevicesIssueCommandRequest
    { commandType =
        Core.Nothing,
      payload = Core.Nothing
    }

instance Core.FromJSON DirectoryChromeosdevicesIssueCommandRequest where
  parseJSON =
    Core.withObject
      "DirectoryChromeosdevicesIssueCommandRequest"
      ( \o ->
          DirectoryChromeosdevicesIssueCommandRequest
            Core.<$> (o Core..:? "commandType")
            Core.<*> (o Core..:? "payload")
      )

instance Core.ToJSON DirectoryChromeosdevicesIssueCommandRequest where
  toJSON DirectoryChromeosdevicesIssueCommandRequest {..} =
    Core.object
      ( Core.catMaybes
          [ ("commandType" Core..=) Core.<$> commandType,
            ("payload" Core..=) Core.<$> payload
          ]
      )

-- | A response for issuing a command.
--
-- /See:/ 'newDirectoryChromeosdevicesIssueCommandResponse' smart constructor.
newtype DirectoryChromeosdevicesIssueCommandResponse = DirectoryChromeosdevicesIssueCommandResponse
  { -- | The unique ID of the issued command, used to retrieve the command status.
    commandId :: (Core.Maybe Core.Int64)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'DirectoryChromeosdevicesIssueCommandResponse' with the minimum fields required to make a request.
newDirectoryChromeosdevicesIssueCommandResponse ::
  DirectoryChromeosdevicesIssueCommandResponse
newDirectoryChromeosdevicesIssueCommandResponse =
  DirectoryChromeosdevicesIssueCommandResponse
    { commandId =
        Core.Nothing
    }

instance Core.FromJSON DirectoryChromeosdevicesIssueCommandResponse where
  parseJSON =
    Core.withObject
      "DirectoryChromeosdevicesIssueCommandResponse"
      ( \o ->
          DirectoryChromeosdevicesIssueCommandResponse
            Core.<$> (o Core..:? "commandId" Core.<&> Core.fmap Core.fromAsText)
      )

instance Core.ToJSON DirectoryChromeosdevicesIssueCommandResponse where
  toJSON DirectoryChromeosdevicesIssueCommandResponse {..} =
    Core.object
      ( Core.catMaybes
          [("commandId" Core..=) Core.. Core.AsText Core.<$> commandId]
      )

--
-- /See:/ 'newDomainAlias' smart constructor.
data DomainAlias = DomainAlias
  { -- | The creation time of the domain alias. (Read-only).
    creationTime :: (Core.Maybe Core.Int64),
    -- | The domain alias name.
    domainAliasName :: (Core.Maybe Core.Text),
    -- | ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | Kind of resource this is.
    kind :: Core.Text,
    -- | The parent domain name that the domain alias is associated with. This can either be a primary or secondary domain name within a customer.
    parentDomainName :: (Core.Maybe Core.Text),
    -- | Indicates the verification state of a domain alias. (Read-only)
    verified :: (Core.Maybe Core.Bool)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'DomainAlias' with the minimum fields required to make a request.
newDomainAlias ::
  DomainAlias
newDomainAlias =
  DomainAlias
    { creationTime = Core.Nothing,
      domainAliasName = Core.Nothing,
      etag = Core.Nothing,
      kind = "admin#directory#domainAlias",
      parentDomainName = Core.Nothing,
      verified = Core.Nothing
    }

instance Core.FromJSON DomainAlias where
  parseJSON =
    Core.withObject
      "DomainAlias"
      ( \o ->
          DomainAlias
            Core.<$> (o Core..:? "creationTime" Core.<&> Core.fmap Core.fromAsText)
            Core.<*> (o Core..:? "domainAliasName")
            Core.<*> (o Core..:? "etag")
            Core.<*> (o Core..:? "kind" Core..!= "admin#directory#domainAlias")
            Core.<*> (o Core..:? "parentDomainName")
            Core.<*> (o Core..:? "verified")
      )

instance Core.ToJSON DomainAlias where
  toJSON DomainAlias {..} =
    Core.object
      ( Core.catMaybes
          [ ("creationTime" Core..=) Core.. Core.AsText Core.<$> creationTime,
            ("domainAliasName" Core..=) Core.<$> domainAliasName,
            ("etag" Core..=) Core.<$> etag,
            Core.Just ("kind" Core..= kind),
            ("parentDomainName" Core..=) Core.<$> parentDomainName,
            ("verified" Core..=) Core.<$> verified
          ]
      )

--
-- /See:/ 'newDomainAliases' smart constructor.
data DomainAliases = DomainAliases
  { -- | A list of domain alias objects.
    domainAliases :: (Core.Maybe [DomainAlias]),
    -- | ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | Kind of resource this is.
    kind :: Core.Text
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'DomainAliases' with the minimum fields required to make a request.
newDomainAliases ::
  DomainAliases
newDomainAliases =
  DomainAliases
    { domainAliases = Core.Nothing,
      etag = Core.Nothing,
      kind = "admin#directory#domainAliases"
    }

instance Core.FromJSON DomainAliases where
  parseJSON =
    Core.withObject
      "DomainAliases"
      ( \o ->
          DomainAliases
            Core.<$> (o Core..:? "domainAliases")
            Core.<*> (o Core..:? "etag")
            Core.<*> (o Core..:? "kind" Core..!= "admin#directory#domainAliases")
      )

instance Core.ToJSON DomainAliases where
  toJSON DomainAliases {..} =
    Core.object
      ( Core.catMaybes
          [ ("domainAliases" Core..=) Core.<$> domainAliases,
            ("etag" Core..=) Core.<$> etag,
            Core.Just ("kind" Core..= kind)
          ]
      )

--
-- /See:/ 'newDomains' smart constructor.
data Domains = Domains
  { -- | Creation time of the domain. Expressed in <https://en.wikipedia.org/wiki/Epoch_time Unix time> format. (Read-only).
    creationTime :: (Core.Maybe Core.Int64),
    -- | A list of domain alias objects. (Read-only)
    domainAliases :: (Core.Maybe [DomainAlias]),
    -- | The domain name of the customer.
    domainName :: (Core.Maybe Core.Text),
    -- | ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | Indicates if the domain is a primary domain (Read-only).
    isPrimary :: (Core.Maybe Core.Bool),
    -- | Kind of resource this is.
    kind :: Core.Text,
    -- | Indicates the verification state of a domain. (Read-only).
    verified :: (Core.Maybe Core.Bool)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Domains' with the minimum fields required to make a request.
newDomains ::
  Domains
newDomains =
  Domains
    { creationTime = Core.Nothing,
      domainAliases = Core.Nothing,
      domainName = Core.Nothing,
      etag = Core.Nothing,
      isPrimary = Core.Nothing,
      kind = "admin#directory#domain",
      verified = Core.Nothing
    }

instance Core.FromJSON Domains where
  parseJSON =
    Core.withObject
      "Domains"
      ( \o ->
          Domains
            Core.<$> (o Core..:? "creationTime" Core.<&> Core.fmap Core.fromAsText)
            Core.<*> (o Core..:? "domainAliases")
            Core.<*> (o Core..:? "domainName")
            Core.<*> (o Core..:? "etag")
            Core.<*> (o Core..:? "isPrimary")
            Core.<*> (o Core..:? "kind" Core..!= "admin#directory#domain")
            Core.<*> (o Core..:? "verified")
      )

instance Core.ToJSON Domains where
  toJSON Domains {..} =
    Core.object
      ( Core.catMaybes
          [ ("creationTime" Core..=) Core.. Core.AsText Core.<$> creationTime,
            ("domainAliases" Core..=) Core.<$> domainAliases,
            ("domainName" Core..=) Core.<$> domainName,
            ("etag" Core..=) Core.<$> etag,
            ("isPrimary" Core..=) Core.<$> isPrimary,
            Core.Just ("kind" Core..= kind),
            ("verified" Core..=) Core.<$> verified
          ]
      )

--
-- /See:/ 'newDomains2' smart constructor.
data Domains2 = Domains2
  { -- | A list of domain objects.
    domains :: (Core.Maybe [Domains]),
    -- | ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | Kind of resource this is.
    kind :: Core.Text
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Domains2' with the minimum fields required to make a request.
newDomains2 ::
  Domains2
newDomains2 =
  Domains2
    { domains = Core.Nothing,
      etag = Core.Nothing,
      kind = "admin#directory#domains"
    }

instance Core.FromJSON Domains2 where
  parseJSON =
    Core.withObject
      "Domains2"
      ( \o ->
          Domains2
            Core.<$> (o Core..:? "domains")
            Core.<*> (o Core..:? "etag")
            Core.<*> (o Core..:? "kind" Core..!= "admin#directory#domains")
      )

instance Core.ToJSON Domains2 where
  toJSON Domains2 {..} =
    Core.object
      ( Core.catMaybes
          [ ("domains" Core..=) Core.<$> domains,
            ("etag" Core..=) Core.<$> etag,
            Core.Just ("kind" Core..= kind)
          ]
      )

-- | 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

-- | Info about failures
--
-- /See:/ 'newFailureInfo' smart constructor.
data FailureInfo = FailureInfo
  { -- | Canonical code for why the update failed to apply.
    errorCode :: (Core.Maybe FailureInfo_ErrorCode),
    -- | Failure reason message.
    errorMessage :: (Core.Maybe Core.Text),
    -- | Failed printer.
    printer :: (Core.Maybe Printer),
    -- | Id of a failed printer.
    printerId :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'FailureInfo' with the minimum fields required to make a request.
newFailureInfo ::
  FailureInfo
newFailureInfo =
  FailureInfo
    { errorCode = Core.Nothing,
      errorMessage = Core.Nothing,
      printer = Core.Nothing,
      printerId = Core.Nothing
    }

instance Core.FromJSON FailureInfo where
  parseJSON =
    Core.withObject
      "FailureInfo"
      ( \o ->
          FailureInfo
            Core.<$> (o Core..:? "errorCode")
            Core.<*> (o Core..:? "errorMessage")
            Core.<*> (o Core..:? "printer")
            Core.<*> (o Core..:? "printerId")
      )

instance Core.ToJSON FailureInfo where
  toJSON FailureInfo {..} =
    Core.object
      ( Core.catMaybes
          [ ("errorCode" Core..=) Core.<$> errorCode,
            ("errorMessage" Core..=) Core.<$> errorMessage,
            ("printer" Core..=) Core.<$> printer,
            ("printerId" Core..=) Core.<$> printerId
          ]
      )

-- | Information about the device\'s fan.
--
-- /See:/ 'newFanInfo' smart constructor.
newtype FanInfo = FanInfo
  { -- | Output only. Fan speed in RPM.
    speedRpm :: (Core.Maybe Core.Int32)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'FanInfo' with the minimum fields required to make a request.
newFanInfo ::
  FanInfo
newFanInfo = FanInfo {speedRpm = Core.Nothing}

instance Core.FromJSON FanInfo where
  parseJSON =
    Core.withObject
      "FanInfo"
      (\o -> FanInfo Core.<$> (o Core..:? "speedRpm"))

instance Core.ToJSON FanInfo where
  toJSON FanInfo {..} =
    Core.object
      (Core.catMaybes [("speedRpm" Core..=) Core.<$> speedRpm])

-- | JSON template for Feature object in Directory API.
--
-- /See:/ 'newFeature' smart constructor.
data Feature = Feature
  { -- | ETag of the resource.
    etags :: (Core.Maybe Core.Text),
    -- | Kind of resource this is.
    kind :: Core.Text,
    -- | The name of the feature.
    name :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Feature' with the minimum fields required to make a request.
newFeature ::
  Feature
newFeature =
  Feature
    { etags = Core.Nothing,
      kind = "admin#directory#resources#features#Feature",
      name = Core.Nothing
    }

instance Core.FromJSON Feature where
  parseJSON =
    Core.withObject
      "Feature"
      ( \o ->
          Feature
            Core.<$> (o Core..:? "etags")
            Core.<*> ( o
                         Core..:? "kind"
                         Core..!= "admin#directory#resources#features#Feature"
                     )
            Core.<*> (o Core..:? "name")
      )

instance Core.ToJSON Feature where
  toJSON Feature {..} =
    Core.object
      ( Core.catMaybes
          [ ("etags" Core..=) Core.<$> etags,
            Core.Just ("kind" Core..= kind),
            ("name" Core..=) Core.<$> name
          ]
      )

-- | JSON template for a feature instance.
--
-- /See:/ 'newFeatureInstance' smart constructor.
newtype FeatureInstance = FeatureInstance
  { -- | The feature that this is an instance of. A calendar resource may have multiple instances of a feature.
    feature :: (Core.Maybe Feature)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'FeatureInstance' with the minimum fields required to make a request.
newFeatureInstance ::
  FeatureInstance
newFeatureInstance = FeatureInstance {feature = Core.Nothing}

instance Core.FromJSON FeatureInstance where
  parseJSON =
    Core.withObject
      "FeatureInstance"
      (\o -> FeatureInstance Core.<$> (o Core..:? "feature"))

instance Core.ToJSON FeatureInstance where
  toJSON FeatureInstance {..} =
    Core.object
      (Core.catMaybes [("feature" Core..=) Core.<$> feature])

--
-- /See:/ 'newFeatureRename' smart constructor.
newtype FeatureRename = FeatureRename
  { -- | New name of the feature.
    newName' :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'FeatureRename' with the minimum fields required to make a request.
newFeatureRename ::
  FeatureRename
newFeatureRename = FeatureRename {newName' = Core.Nothing}

instance Core.FromJSON FeatureRename where
  parseJSON =
    Core.withObject
      "FeatureRename"
      (\o -> FeatureRename Core.<$> (o Core..:? "newName"))

instance Core.ToJSON FeatureRename where
  toJSON FeatureRename {..} =
    Core.object
      (Core.catMaybes [("newName" Core..=) Core.<$> newName'])

-- | Public API: Resources.features
--
-- /See:/ 'newFeatures' smart constructor.
data Features = Features
  { -- | ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | The Features in this page of results.
    features :: (Core.Maybe [Feature]),
    -- | Kind of resource this is.
    kind :: Core.Text,
    -- | The continuation token, used to page through large result sets. Provide this value in a subsequent request to return the next page of results.
    nextPageToken :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Features' with the minimum fields required to make a request.
newFeatures ::
  Features
newFeatures =
  Features
    { etag = Core.Nothing,
      features = Core.Nothing,
      kind = "admin#directory#resources#features#featuresList",
      nextPageToken = Core.Nothing
    }

instance Core.FromJSON Features where
  parseJSON =
    Core.withObject
      "Features"
      ( \o ->
          Features
            Core.<$> (o Core..:? "etag")
            Core.<*> (o Core..:? "features")
            Core.<*> ( o
                         Core..:? "kind"
                         Core..!= "admin#directory#resources#features#featuresList"
                     )
            Core.<*> (o Core..:? "nextPageToken")
      )

instance Core.ToJSON Features where
  toJSON Features {..} =
    Core.object
      ( Core.catMaybes
          [ ("etag" Core..=) Core.<$> etag,
            ("features" Core..=) Core.<$> features,
            Core.Just ("kind" Core..= kind),
            ("nextPageToken" Core..=) Core.<$> nextPageToken
          ]
      )

-- | Google Groups provide your users the ability to send messages to groups of people using the group\'s email address. For more information about common tasks, see the <https://developers.google.com/admin-sdk/directory/v1/guides/manage-groups Developer\'s Guide>. For information about other types of groups, see the <https://cloud.google.com/identity/docs/groups Cloud Identity Groups API documentation>. Note: The user calling the API (or being impersonated by a service account) must have an assigned <https://developers.google.com/admin-sdk/directory/v1/guides/manage-roles role> that includes Admin API Groups permissions, such as Super Admin or Groups Admin.
--
-- /See:/ 'newGroup' smart constructor.
data Group = Group
  { -- | Read-only. Value is @true@ if this group was created by an administrator rather than a user.
    adminCreated :: (Core.Maybe Core.Bool),
    -- | Read-only. The list of a group\'s alias email addresses. To add, update, or remove a group\'s aliases, use the @groups.aliases@ methods. If edited in a group\'s POST or PUT request, the edit is ignored.
    aliases :: (Core.Maybe [Core.Text]),
    -- | An extended description to help users determine the purpose of a group. For example, you can include information about who should join the group, the types of messages to send to the group, links to FAQs about the group, or related groups. Maximum length is @4,096@ characters.
    description :: (Core.Maybe Core.Text),
    -- | The number of users that are direct members of the group. If a group is a member (child) of this group (the parent), members of the child group are not counted in the @directMembersCount@ property of the parent group.
    directMembersCount :: (Core.Maybe Core.Int64),
    -- | The group\'s email address. If your account has multiple domains, select the appropriate domain for the email address. The @email@ must be unique. This property is required when creating a group. Group email addresses are subject to the same character usage rules as usernames, see the <https://support.google.com/a/answer/9193374 help center> for details.
    email :: (Core.Maybe Core.Text),
    -- | ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | Read-only. The unique ID of a group. A group @id@ can be used as a group request URI\'s @groupKey@.
    id :: (Core.Maybe Core.Text),
    -- | The type of the API resource. For Groups resources, the value is @admin#directory#group@.
    kind :: Core.Text,
    -- | The group\'s display name.
    name :: (Core.Maybe Core.Text),
    -- | Read-only. The list of the group\'s non-editable alias email addresses that are outside of the account\'s primary domain or subdomains. These are functioning email addresses used by the group. This is a read-only property returned in the API\'s response for a group. If edited in a group\'s POST or PUT request, the edit is ignored.
    nonEditableAliases :: (Core.Maybe [Core.Text])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Group' with the minimum fields required to make a request.
newGroup ::
  Group
newGroup =
  Group
    { adminCreated = Core.Nothing,
      aliases = Core.Nothing,
      description = Core.Nothing,
      directMembersCount = Core.Nothing,
      email = Core.Nothing,
      etag = Core.Nothing,
      id = Core.Nothing,
      kind = "admin#directory#group",
      name = Core.Nothing,
      nonEditableAliases = Core.Nothing
    }

instance Core.FromJSON Group where
  parseJSON =
    Core.withObject
      "Group"
      ( \o ->
          Group
            Core.<$> (o Core..:? "adminCreated")
            Core.<*> (o Core..:? "aliases")
            Core.<*> (o Core..:? "description")
            Core.<*> ( o
                         Core..:? "directMembersCount"
                         Core.<&> Core.fmap Core.fromAsText
                     )
            Core.<*> (o Core..:? "email")
            Core.<*> (o Core..:? "etag")
            Core.<*> (o Core..:? "id")
            Core.<*> (o Core..:? "kind" Core..!= "admin#directory#group")
            Core.<*> (o Core..:? "name")
            Core.<*> (o Core..:? "nonEditableAliases")
      )

instance Core.ToJSON Group where
  toJSON Group {..} =
    Core.object
      ( Core.catMaybes
          [ ("adminCreated" Core..=) Core.<$> adminCreated,
            ("aliases" Core..=) Core.<$> aliases,
            ("description" Core..=) Core.<$> description,
            ("directMembersCount" Core..=)
              Core.. Core.AsText
              Core.<$> directMembersCount,
            ("email" Core..=) Core.<$> email,
            ("etag" Core..=) Core.<$> etag,
            ("id" Core..=) Core.<$> id,
            Core.Just ("kind" Core..= kind),
            ("name" Core..=) Core.<$> name,
            ("nonEditableAliases" Core..=) Core.<$> nonEditableAliases
          ]
      )

-- | The Directory API manages aliases, which are alternative email addresses.
--
-- /See:/ 'newGroupAlias' smart constructor.
data GroupAlias = GroupAlias
  { -- | The alias email address.
    alias :: (Core.Maybe Core.Text),
    -- | ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | The unique ID of the group.
    id :: (Core.Maybe Core.Text),
    -- | The type of the API resource. For Alias resources, the value is @admin#directory#alias@.
    kind :: (Core.Maybe Core.Text),
    -- | The primary email address of the group.
    primaryEmail :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'GroupAlias' with the minimum fields required to make a request.
newGroupAlias ::
  GroupAlias
newGroupAlias =
  GroupAlias
    { alias = Core.Nothing,
      etag = Core.Nothing,
      id = Core.Nothing,
      kind = Core.Nothing,
      primaryEmail = Core.Nothing
    }

instance Core.FromJSON GroupAlias where
  parseJSON =
    Core.withObject
      "GroupAlias"
      ( \o ->
          GroupAlias
            Core.<$> (o Core..:? "alias")
            Core.<*> (o Core..:? "etag")
            Core.<*> (o Core..:? "id")
            Core.<*> (o Core..:? "kind")
            Core.<*> (o Core..:? "primaryEmail")
      )

instance Core.ToJSON GroupAlias where
  toJSON GroupAlias {..} =
    Core.object
      ( Core.catMaybes
          [ ("alias" Core..=) Core.<$> alias,
            ("etag" Core..=) Core.<$> etag,
            ("id" Core..=) Core.<$> id,
            ("kind" Core..=) Core.<$> kind,
            ("primaryEmail" Core..=) Core.<$> primaryEmail
          ]
      )

--
-- /See:/ 'newGroups' smart constructor.
data Groups = Groups
  { -- | ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | A list of group objects.
    groups :: (Core.Maybe [Group]),
    -- | Kind of resource this is.
    kind :: Core.Text,
    -- | Token used to access next page of this result.
    nextPageToken :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Groups' with the minimum fields required to make a request.
newGroups ::
  Groups
newGroups =
  Groups
    { etag = Core.Nothing,
      groups = Core.Nothing,
      kind = "admin#directory#groups",
      nextPageToken = Core.Nothing
    }

instance Core.FromJSON Groups where
  parseJSON =
    Core.withObject
      "Groups"
      ( \o ->
          Groups
            Core.<$> (o Core..:? "etag")
            Core.<*> (o Core..:? "groups")
            Core.<*> (o Core..:? "kind" Core..!= "admin#directory#groups")
            Core.<*> (o Core..:? "nextPageToken")
      )

instance Core.ToJSON Groups where
  toJSON Groups {..} =
    Core.object
      ( Core.catMaybes
          [ ("etag" Core..=) Core.<$> etag,
            ("groups" Core..=) Core.<$> groups,
            Core.Just ("kind" Core..= kind),
            ("nextPageToken" Core..=) Core.<$> nextPageToken
          ]
      )

--
-- /See:/ 'newListPrintServersResponse' smart constructor.
data ListPrintServersResponse = ListPrintServersResponse
  { -- | A token that can be sent as @page_token@ in a request to retrieve the next page. If this field is omitted, there are no subsequent pages.
    nextPageToken :: (Core.Maybe Core.Text),
    -- | List of print servers.
    printServers :: (Core.Maybe [PrintServer])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ListPrintServersResponse' with the minimum fields required to make a request.
newListPrintServersResponse ::
  ListPrintServersResponse
newListPrintServersResponse =
  ListPrintServersResponse
    { nextPageToken = Core.Nothing,
      printServers = Core.Nothing
    }

instance Core.FromJSON ListPrintServersResponse where
  parseJSON =
    Core.withObject
      "ListPrintServersResponse"
      ( \o ->
          ListPrintServersResponse
            Core.<$> (o Core..:? "nextPageToken")
            Core.<*> (o Core..:? "printServers")
      )

instance Core.ToJSON ListPrintServersResponse where
  toJSON ListPrintServersResponse {..} =
    Core.object
      ( Core.catMaybes
          [ ("nextPageToken" Core..=) Core.<$> nextPageToken,
            ("printServers" Core..=) Core.<$> printServers
          ]
      )

-- | Response for listing allowed printer models.
--
-- /See:/ 'newListPrinterModelsResponse' smart constructor.
data ListPrinterModelsResponse = ListPrinterModelsResponse
  { -- | A token, which can be sent as @page_token@ to retrieve the next page. If this field is omitted, there are no subsequent pages.
    nextPageToken :: (Core.Maybe Core.Text),
    -- | Printer models that are currently allowed to be configured for ChromeOs. Some printers may be added or removed over time.
    printerModels :: (Core.Maybe [PrinterModel])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ListPrinterModelsResponse' with the minimum fields required to make a request.
newListPrinterModelsResponse ::
  ListPrinterModelsResponse
newListPrinterModelsResponse =
  ListPrinterModelsResponse
    { nextPageToken = Core.Nothing,
      printerModels = Core.Nothing
    }

instance Core.FromJSON ListPrinterModelsResponse where
  parseJSON =
    Core.withObject
      "ListPrinterModelsResponse"
      ( \o ->
          ListPrinterModelsResponse
            Core.<$> (o Core..:? "nextPageToken")
            Core.<*> (o Core..:? "printerModels")
      )

instance Core.ToJSON ListPrinterModelsResponse where
  toJSON ListPrinterModelsResponse {..} =
    Core.object
      ( Core.catMaybes
          [ ("nextPageToken" Core..=) Core.<$> nextPageToken,
            ("printerModels" Core..=) Core.<$> printerModels
          ]
      )

-- | Response for listing printers.
--
-- /See:/ 'newListPrintersResponse' smart constructor.
data ListPrintersResponse = ListPrintersResponse
  { -- | A token, which can be sent as @page_token@ to retrieve the next page. If this field is omitted, there are no subsequent pages.
    nextPageToken :: (Core.Maybe Core.Text),
    -- | List of printers. If @org_unit_id@ was given in the request, then only printers visible for this OU will be returned. If @org_unit_id@ was not given in the request, then all printers will be returned.
    printers :: (Core.Maybe [Printer])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ListPrintersResponse' with the minimum fields required to make a request.
newListPrintersResponse ::
  ListPrintersResponse
newListPrintersResponse =
  ListPrintersResponse
    { nextPageToken = Core.Nothing,
      printers = Core.Nothing
    }

instance Core.FromJSON ListPrintersResponse where
  parseJSON =
    Core.withObject
      "ListPrintersResponse"
      ( \o ->
          ListPrintersResponse
            Core.<$> (o Core..:? "nextPageToken")
            Core.<*> (o Core..:? "printers")
      )

instance Core.ToJSON ListPrintersResponse where
  toJSON ListPrintersResponse {..} =
    Core.object
      ( Core.catMaybes
          [ ("nextPageToken" Core..=) Core.<$> nextPageToken,
            ("printers" Core..=) Core.<$> printers
          ]
      )

-- | A Google Groups member can be a user or another group. This member can be inside or outside of your account\'s domains. For more information about common group member tasks, see the </admin-sdk/directory/v1/guides/manage-group-members Developer\'s Guide>.
--
-- /See:/ 'newMember' smart constructor.
data Member = Member
  { -- | Defines mail delivery preferences of member. This field is only supported by @insert@, @update@, and @get@ methods.
    deliverySettings :: (Core.Maybe Core.Text),
    -- | The member\'s email address. A member can be a user or another group. This property is required when adding a member to a group. The @email@ must be unique and cannot be an alias of another group. If the email address is changed, the API automatically reflects the email address changes.
    email :: (Core.Maybe Core.Text),
    -- | ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | The unique ID of the group member. A member @id@ can be used as a member request URI\'s @memberKey@.
    id :: (Core.Maybe Core.Text),
    -- | The type of the API resource. For Members resources, the value is @admin#directory#member@.
    kind :: Core.Text,
    -- | The member\'s role in a group. The API returns an error for cycles in group memberships. For example, if @group1@ is a member of @group2@, @group2@ cannot be a member of @group1@. For more information about a member\'s role, see the <https://support.google.com/a/answer/167094 administration help center>.
    role' :: (Core.Maybe Core.Text),
    -- | Status of member (Immutable)
    status :: (Core.Maybe Core.Text),
    -- | The type of group member.
    type' :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Member' with the minimum fields required to make a request.
newMember ::
  Member
newMember =
  Member
    { deliverySettings = Core.Nothing,
      email = Core.Nothing,
      etag = Core.Nothing,
      id = Core.Nothing,
      kind = "admin#directory#member",
      role' = Core.Nothing,
      status = Core.Nothing,
      type' = Core.Nothing
    }

instance Core.FromJSON Member where
  parseJSON =
    Core.withObject
      "Member"
      ( \o ->
          Member
            Core.<$> (o Core..:? "delivery_settings")
            Core.<*> (o Core..:? "email")
            Core.<*> (o Core..:? "etag")
            Core.<*> (o Core..:? "id")
            Core.<*> (o Core..:? "kind" Core..!= "admin#directory#member")
            Core.<*> (o Core..:? "role")
            Core.<*> (o Core..:? "status")
            Core.<*> (o Core..:? "type")
      )

instance Core.ToJSON Member where
  toJSON Member {..} =
    Core.object
      ( Core.catMaybes
          [ ("delivery_settings" Core..=) Core.<$> deliverySettings,
            ("email" Core..=) Core.<$> email,
            ("etag" Core..=) Core.<$> etag,
            ("id" Core..=) Core.<$> id,
            Core.Just ("kind" Core..= kind),
            ("role" Core..=) Core.<$> role',
            ("status" Core..=) Core.<$> status,
            ("type" Core..=) Core.<$> type'
          ]
      )

--
-- /See:/ 'newMembers' smart constructor.
data Members = Members
  { -- | ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | Kind of resource this is.
    kind :: Core.Text,
    -- | A list of member objects.
    members :: (Core.Maybe [Member]),
    -- | Token used to access next page of this result.
    nextPageToken :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Members' with the minimum fields required to make a request.
newMembers ::
  Members
newMembers =
  Members
    { etag = Core.Nothing,
      kind = "admin#directory#members",
      members = Core.Nothing,
      nextPageToken = Core.Nothing
    }

instance Core.FromJSON Members where
  parseJSON =
    Core.withObject
      "Members"
      ( \o ->
          Members
            Core.<$> (o Core..:? "etag")
            Core.<*> (o Core..:? "kind" Core..!= "admin#directory#members")
            Core.<*> (o Core..:? "members")
            Core.<*> (o Core..:? "nextPageToken")
      )

instance Core.ToJSON Members where
  toJSON Members {..} =
    Core.object
      ( Core.catMaybes
          [ ("etag" Core..=) Core.<$> etag,
            Core.Just ("kind" Core..= kind),
            ("members" Core..=) Core.<$> members,
            ("nextPageToken" Core..=) Core.<$> nextPageToken
          ]
      )

-- | JSON template for Has Member response in Directory API.
--
-- /See:/ 'newMembersHasMember' smart constructor.
newtype MembersHasMember = MembersHasMember
  { -- | Output only. Identifies whether the given user is a member of the group. Membership can be direct or nested.
    isMember :: (Core.Maybe Core.Bool)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'MembersHasMember' with the minimum fields required to make a request.
newMembersHasMember ::
  MembersHasMember
newMembersHasMember = MembersHasMember {isMember = Core.Nothing}

instance Core.FromJSON MembersHasMember where
  parseJSON =
    Core.withObject
      "MembersHasMember"
      (\o -> MembersHasMember Core.<$> (o Core..:? "isMember"))

instance Core.ToJSON MembersHasMember where
  toJSON MembersHasMember {..} =
    Core.object
      (Core.catMaybes [("isMember" Core..=) Core.<$> isMember])

-- | Google Workspace Mobile Management includes Android, <https://support.google.com/a/answer/135937 Google Sync>, and iOS devices. For more information about common group mobile device API tasks, see the </admin-sdk/directory/v1/guides/manage-mobile-devices.html Developer\'s Guide>.
--
-- /See:/ 'newMobileDevice' smart constructor.
data MobileDevice = MobileDevice
  { -- | Adb (USB debugging) enabled or disabled on device (Read-only)
    adbStatus :: (Core.Maybe Core.Bool),
    -- | The list of applications installed on an Android mobile device. It is not applicable to Google Sync and iOS devices. The list includes any Android applications that access Google Workspace data. When updating an applications list, it is important to note that updates replace the existing list. If the Android device has two existing applications and the API updates the list with five applications, the is now the updated list of five applications.
    applications :: (Core.Maybe [MobileDevice_ApplicationsItem]),
    -- | The device\'s baseband version.
    basebandVersion :: (Core.Maybe Core.Text),
    -- | Mobile Device Bootloader version (Read-only)
    bootloaderVersion :: (Core.Maybe Core.Text),
    -- | Mobile Device Brand (Read-only)
    brand :: (Core.Maybe Core.Text),
    -- | The device\'s operating system build number.
    buildNumber :: (Core.Maybe Core.Text),
    -- | The default locale used on the device.
    defaultLanguage :: (Core.Maybe Core.Text),
    -- | Developer options enabled or disabled on device (Read-only)
    developerOptionsStatus :: (Core.Maybe Core.Bool),
    -- | The compromised device status.
    deviceCompromisedStatus :: (Core.Maybe Core.Text),
    -- | The serial number for a Google Sync mobile device. For Android and iOS devices, this is a software generated unique identifier.
    deviceId :: (Core.Maybe Core.Text),
    -- | DevicePasswordStatus (Read-only)
    devicePasswordStatus :: (Core.Maybe Core.Text),
    -- | The list of the owner\'s email addresses. If your application needs the current list of user emails, use the </admin-sdk/directory/v1/reference/mobiledevices/get.html get> method. For additional information, see the </admin-sdk/directory/v1/guides/manage-users#get_user retrieve a user> method.
    email :: (Core.Maybe [Core.Text]),
    -- | Mobile Device Encryption Status (Read-only)
    encryptionStatus :: (Core.Maybe Core.Text),
    -- | ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | Date and time the device was first synchronized with the policy settings in the G Suite administrator control panel (Read-only)
    firstSync :: (Core.Maybe Core.DateTime),
    -- | Mobile Device Hardware (Read-only)
    hardware :: (Core.Maybe Core.Text),
    -- | The IMEI\/MEID unique identifier for Android hardware. It is not applicable to Google Sync devices. When adding an Android mobile device, this is an optional property. When updating one of these devices, this is a read-only property.
    hardwareId :: (Core.Maybe Core.Text),
    -- | The device\'s IMEI number.
    imei :: (Core.Maybe Core.Text),
    -- | The device\'s kernel version.
    kernelVersion :: (Core.Maybe Core.Text),
    -- | The type of the API resource. For Mobiledevices resources, the value is @admin#directory#mobiledevice@.
    kind :: Core.Text,
    -- | Date and time the device was last synchronized with the policy settings in the G Suite administrator control panel (Read-only)
    lastSync :: (Core.Maybe Core.DateTime),
    -- | Boolean indicating if this account is on owner\/primary profile or not.
    managedAccountIsOnOwnerProfile :: (Core.Maybe Core.Bool),
    -- | Mobile Device manufacturer (Read-only)
    manufacturer :: (Core.Maybe Core.Text),
    -- | The device\'s MEID number.
    meid :: (Core.Maybe Core.Text),
    -- | The mobile device\'s model name, for example Nexus S. This property can be </admin-sdk/directory/v1/reference/mobiledevices/update.html updated>. For more information, see the </admin-sdk/directory/v1/guides/manage-mobile=devices#update_mobile_device Developer\'s Guide>.
    model :: (Core.Maybe Core.Text),
    -- | The list of the owner\'s user names. If your application needs the current list of device owner names, use the </admin-sdk/directory/v1/reference/mobiledevices/get.html get> method. For more information about retrieving mobile device user information, see the </admin-sdk/directory/v1/guides/manage-users#get_user Developer\'s Guide>.
    name :: (Core.Maybe [Core.Text]),
    -- | Mobile Device mobile or network operator (if available) (Read-only)
    networkOperator :: (Core.Maybe Core.Text),
    -- | The mobile device\'s operating system, for example IOS 4.3 or Android 2.3.5. This property can be </admin-sdk/directory/v1/reference/mobiledevices/update.html updated>. For more information, see the </admin-sdk/directory/v1/guides/manage-mobile-devices#update_mobile_device Developer\'s Guide>.
    os :: (Core.Maybe Core.Text),
    -- | The list of accounts added on device (Read-only)
    otherAccountsInfo :: (Core.Maybe [Core.Text]),
    -- | DMAgentPermission (Read-only)
    privilege :: (Core.Maybe Core.Text),
    -- | Mobile Device release version version (Read-only)
    releaseVersion :: (Core.Maybe Core.Text),
    -- | The unique ID the API service uses to identify the mobile device.
    resourceId :: (Core.Maybe Core.Text),
    -- | Mobile Device Security patch level (Read-only)
    securityPatchLevel :: (Core.Maybe Core.Int64),
    -- | The device\'s serial number.
    serialNumber :: (Core.Maybe Core.Text),
    -- | The device\'s status.
    status :: (Core.Maybe Core.Text),
    -- | Work profile supported on device (Read-only)
    supportsWorkProfile :: (Core.Maybe Core.Bool),
    -- | The type of mobile device.
    type' :: (Core.Maybe Core.Text),
    -- | Unknown sources enabled or disabled on device (Read-only)
    unknownSourcesStatus :: (Core.Maybe Core.Bool),
    -- | Gives information about the device such as @os@ version. This property can be </admin-sdk/directory/v1/reference/mobiledevices/update.html updated>. For more information, see the </admin-sdk/directory/v1/guides/manage-mobile-devices#update_mobile_device Developer\'s Guide>.
    userAgent :: (Core.Maybe Core.Text),
    -- | The device\'s MAC address on Wi-Fi networks.
    wifiMacAddress :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'MobileDevice' with the minimum fields required to make a request.
newMobileDevice ::
  MobileDevice
newMobileDevice =
  MobileDevice
    { adbStatus = Core.Nothing,
      applications = Core.Nothing,
      basebandVersion = Core.Nothing,
      bootloaderVersion = Core.Nothing,
      brand = Core.Nothing,
      buildNumber = Core.Nothing,
      defaultLanguage = Core.Nothing,
      developerOptionsStatus = Core.Nothing,
      deviceCompromisedStatus = Core.Nothing,
      deviceId = Core.Nothing,
      devicePasswordStatus = Core.Nothing,
      email = Core.Nothing,
      encryptionStatus = Core.Nothing,
      etag = Core.Nothing,
      firstSync = Core.Nothing,
      hardware = Core.Nothing,
      hardwareId = Core.Nothing,
      imei = Core.Nothing,
      kernelVersion = Core.Nothing,
      kind = "admin#directory#mobiledevice",
      lastSync = Core.Nothing,
      managedAccountIsOnOwnerProfile = Core.Nothing,
      manufacturer = Core.Nothing,
      meid = Core.Nothing,
      model = Core.Nothing,
      name = Core.Nothing,
      networkOperator = Core.Nothing,
      os = Core.Nothing,
      otherAccountsInfo = Core.Nothing,
      privilege = Core.Nothing,
      releaseVersion = Core.Nothing,
      resourceId = Core.Nothing,
      securityPatchLevel = Core.Nothing,
      serialNumber = Core.Nothing,
      status = Core.Nothing,
      supportsWorkProfile = Core.Nothing,
      type' = Core.Nothing,
      unknownSourcesStatus = Core.Nothing,
      userAgent = Core.Nothing,
      wifiMacAddress = Core.Nothing
    }

instance Core.FromJSON MobileDevice where
  parseJSON =
    Core.withObject
      "MobileDevice"
      ( \o ->
          MobileDevice
            Core.<$> (o Core..:? "adbStatus")
            Core.<*> (o Core..:? "applications")
            Core.<*> (o Core..:? "basebandVersion")
            Core.<*> (o Core..:? "bootloaderVersion")
            Core.<*> (o Core..:? "brand")
            Core.<*> (o Core..:? "buildNumber")
            Core.<*> (o Core..:? "defaultLanguage")
            Core.<*> (o Core..:? "developerOptionsStatus")
            Core.<*> (o Core..:? "deviceCompromisedStatus")
            Core.<*> (o Core..:? "deviceId")
            Core.<*> (o Core..:? "devicePasswordStatus")
            Core.<*> (o Core..:? "email")
            Core.<*> (o Core..:? "encryptionStatus")
            Core.<*> (o Core..:? "etag")
            Core.<*> (o Core..:? "firstSync")
            Core.<*> (o Core..:? "hardware")
            Core.<*> (o Core..:? "hardwareId")
            Core.<*> (o Core..:? "imei")
            Core.<*> (o Core..:? "kernelVersion")
            Core.<*> (o Core..:? "kind" Core..!= "admin#directory#mobiledevice")
            Core.<*> (o Core..:? "lastSync")
            Core.<*> (o Core..:? "managedAccountIsOnOwnerProfile")
            Core.<*> (o Core..:? "manufacturer")
            Core.<*> (o Core..:? "meid")
            Core.<*> (o Core..:? "model")
            Core.<*> (o Core..:? "name")
            Core.<*> (o Core..:? "networkOperator")
            Core.<*> (o Core..:? "os")
            Core.<*> (o Core..:? "otherAccountsInfo")
            Core.<*> (o Core..:? "privilege")
            Core.<*> (o Core..:? "releaseVersion")
            Core.<*> (o Core..:? "resourceId")
            Core.<*> ( o
                         Core..:? "securityPatchLevel"
                         Core.<&> Core.fmap Core.fromAsText
                     )
            Core.<*> (o Core..:? "serialNumber")
            Core.<*> (o Core..:? "status")
            Core.<*> (o Core..:? "supportsWorkProfile")
            Core.<*> (o Core..:? "type")
            Core.<*> (o Core..:? "unknownSourcesStatus")
            Core.<*> (o Core..:? "userAgent")
            Core.<*> (o Core..:? "wifiMacAddress")
      )

instance Core.ToJSON MobileDevice where
  toJSON MobileDevice {..} =
    Core.object
      ( Core.catMaybes
          [ ("adbStatus" Core..=) Core.<$> adbStatus,
            ("applications" Core..=) Core.<$> applications,
            ("basebandVersion" Core..=) Core.<$> basebandVersion,
            ("bootloaderVersion" Core..=) Core.<$> bootloaderVersion,
            ("brand" Core..=) Core.<$> brand,
            ("buildNumber" Core..=) Core.<$> buildNumber,
            ("defaultLanguage" Core..=) Core.<$> defaultLanguage,
            ("developerOptionsStatus" Core..=) Core.<$> developerOptionsStatus,
            ("deviceCompromisedStatus" Core..=)
              Core.<$> deviceCompromisedStatus,
            ("deviceId" Core..=) Core.<$> deviceId,
            ("devicePasswordStatus" Core..=) Core.<$> devicePasswordStatus,
            ("email" Core..=) Core.<$> email,
            ("encryptionStatus" Core..=) Core.<$> encryptionStatus,
            ("etag" Core..=) Core.<$> etag,
            ("firstSync" Core..=) Core.<$> firstSync,
            ("hardware" Core..=) Core.<$> hardware,
            ("hardwareId" Core..=) Core.<$> hardwareId,
            ("imei" Core..=) Core.<$> imei,
            ("kernelVersion" Core..=) Core.<$> kernelVersion,
            Core.Just ("kind" Core..= kind),
            ("lastSync" Core..=) Core.<$> lastSync,
            ("managedAccountIsOnOwnerProfile" Core..=)
              Core.<$> managedAccountIsOnOwnerProfile,
            ("manufacturer" Core..=) Core.<$> manufacturer,
            ("meid" Core..=) Core.<$> meid,
            ("model" Core..=) Core.<$> model,
            ("name" Core..=) Core.<$> name,
            ("networkOperator" Core..=) Core.<$> networkOperator,
            ("os" Core..=) Core.<$> os,
            ("otherAccountsInfo" Core..=) Core.<$> otherAccountsInfo,
            ("privilege" Core..=) Core.<$> privilege,
            ("releaseVersion" Core..=) Core.<$> releaseVersion,
            ("resourceId" Core..=) Core.<$> resourceId,
            ("securityPatchLevel" Core..=)
              Core.. Core.AsText
              Core.<$> securityPatchLevel,
            ("serialNumber" Core..=) Core.<$> serialNumber,
            ("status" Core..=) Core.<$> status,
            ("supportsWorkProfile" Core..=) Core.<$> supportsWorkProfile,
            ("type" Core..=) Core.<$> type',
            ("unknownSourcesStatus" Core..=) Core.<$> unknownSourcesStatus,
            ("userAgent" Core..=) Core.<$> userAgent,
            ("wifiMacAddress" Core..=) Core.<$> wifiMacAddress
          ]
      )

--
-- /See:/ 'newMobileDevice_ApplicationsItem' smart constructor.
data MobileDevice_ApplicationsItem = MobileDevice_ApplicationsItem
  { -- | The application\'s display name. An example is @Browser@.
    displayName :: (Core.Maybe Core.Text),
    -- | The application\'s package name. An example is @com.android.browser@.
    packageName :: (Core.Maybe Core.Text),
    -- | The list of permissions of this application. These can be either a standard Android permission or one defined by the application, and are found in an application\'s <https://developer.android.com/guide/topics/manifest/uses-permission-element.html Android manifest>. Examples of a Calendar application\'s permissions are @READ_CALENDAR@, or @MANAGE_ACCOUNTS@.
    permission :: (Core.Maybe [Core.Text]),
    -- | The application\'s version code. An example is @13@.
    versionCode :: (Core.Maybe Core.Int32),
    -- | The application\'s version name. An example is @3.2-140714@.
    versionName :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'MobileDevice_ApplicationsItem' with the minimum fields required to make a request.
newMobileDevice_ApplicationsItem ::
  MobileDevice_ApplicationsItem
newMobileDevice_ApplicationsItem =
  MobileDevice_ApplicationsItem
    { displayName = Core.Nothing,
      packageName = Core.Nothing,
      permission = Core.Nothing,
      versionCode = Core.Nothing,
      versionName = Core.Nothing
    }

instance Core.FromJSON MobileDevice_ApplicationsItem where
  parseJSON =
    Core.withObject
      "MobileDevice_ApplicationsItem"
      ( \o ->
          MobileDevice_ApplicationsItem
            Core.<$> (o Core..:? "displayName")
            Core.<*> (o Core..:? "packageName")
            Core.<*> (o Core..:? "permission")
            Core.<*> (o Core..:? "versionCode")
            Core.<*> (o Core..:? "versionName")
      )

instance Core.ToJSON MobileDevice_ApplicationsItem where
  toJSON MobileDevice_ApplicationsItem {..} =
    Core.object
      ( Core.catMaybes
          [ ("displayName" Core..=) Core.<$> displayName,
            ("packageName" Core..=) Core.<$> packageName,
            ("permission" Core..=) Core.<$> permission,
            ("versionCode" Core..=) Core.<$> versionCode,
            ("versionName" Core..=) Core.<$> versionName
          ]
      )

--
-- /See:/ 'newMobileDeviceAction' smart constructor.
newtype MobileDeviceAction = MobileDeviceAction
  { -- | The action to be performed on the device.
    action :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'MobileDeviceAction' with the minimum fields required to make a request.
newMobileDeviceAction ::
  MobileDeviceAction
newMobileDeviceAction = MobileDeviceAction {action = Core.Nothing}

instance Core.FromJSON MobileDeviceAction where
  parseJSON =
    Core.withObject
      "MobileDeviceAction"
      (\o -> MobileDeviceAction Core.<$> (o Core..:? "action"))

instance Core.ToJSON MobileDeviceAction where
  toJSON MobileDeviceAction {..} =
    Core.object (Core.catMaybes [("action" Core..=) Core.<$> action])

--
-- /See:/ 'newMobileDevices' smart constructor.
data MobileDevices = MobileDevices
  { -- | ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | Kind of resource this is.
    kind :: Core.Text,
    -- | A list of Mobile Device objects.
    mobiledevices :: (Core.Maybe [MobileDevice]),
    -- | Token used to access next page of this result.
    nextPageToken :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'MobileDevices' with the minimum fields required to make a request.
newMobileDevices ::
  MobileDevices
newMobileDevices =
  MobileDevices
    { etag = Core.Nothing,
      kind = "admin#directory#mobiledevices",
      mobiledevices = Core.Nothing,
      nextPageToken = Core.Nothing
    }

instance Core.FromJSON MobileDevices where
  parseJSON =
    Core.withObject
      "MobileDevices"
      ( \o ->
          MobileDevices
            Core.<$> (o Core..:? "etag")
            Core.<*> (o Core..:? "kind" Core..!= "admin#directory#mobiledevices")
            Core.<*> (o Core..:? "mobiledevices")
            Core.<*> (o Core..:? "nextPageToken")
      )

instance Core.ToJSON MobileDevices where
  toJSON MobileDevices {..} =
    Core.object
      ( Core.catMaybes
          [ ("etag" Core..=) Core.<$> etag,
            Core.Just ("kind" Core..= kind),
            ("mobiledevices" Core..=) Core.<$> mobiledevices,
            ("nextPageToken" Core..=) Core.<$> nextPageToken
          ]
      )

-- | Managing your account\'s organizational units allows you to configure your users\' access to services and custom settings. For more information about common organizational unit tasks, see the </admin-sdk/directory/v1/guides/manage-org-units.html Developer\'s Guide>. The customer\'s organizational unit hierarchy is limited to 35 levels of depth.
--
-- /See:/ 'newOrgUnit' smart constructor.
data OrgUnit = OrgUnit
  { -- | This field is deprecated and setting its value has no effect.
    blockInheritance :: (Core.Maybe Core.Bool),
    -- | Description of the organizational unit.
    description :: (Core.Maybe Core.Text),
    -- | ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | The type of the API resource. For Orgunits resources, the value is @admin#directory#orgUnit@.
    kind :: Core.Text,
    -- | The organizational unit\'s path name. For example, an organizational unit\'s name within the \/corp\/support\/sales/support parent path is sales/support. Required.
    name :: (Core.Maybe Core.Text),
    -- | The unique ID of the organizational unit.
    orgUnitId :: (Core.Maybe Core.Text),
    -- | The full path to the organizational unit. The @orgUnitPath@ is a derived property. When listed, it is derived from @parentOrgunitPath@ and organizational unit\'s @name@. For example, for an organizational unit named \'apps\' under parent organization \'\/engineering\', the orgUnitPath is \'\/engineering\/apps\'. In order to edit an @orgUnitPath@, either update the name of the organization or the @parentOrgunitPath@. A user\'s organizational unit determines which Google Workspace services the user has access to. If the user is moved to a new organization, the user\'s access changes. For more information about organization structures, see the <https://support.google.com/a/answer/4352075 administration help center>. For more information about moving a user to a different organization, see </admin-sdk/directory/v1/guides/manage-users.html#update_user Update a user>.
    orgUnitPath :: (Core.Maybe Core.Text),
    -- | The unique ID of the parent organizational unit. Required, unless @parentOrgUnitPath@ is set.
    parentOrgUnitId :: (Core.Maybe Core.Text),
    -- | The organizational unit\'s parent path. For example, \/corp\/sales is the parent path for \/corp\/sales\/sales_support organizational unit. Required, unless @parentOrgUnitId@ is set.
    parentOrgUnitPath :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'OrgUnit' with the minimum fields required to make a request.
newOrgUnit ::
  OrgUnit
newOrgUnit =
  OrgUnit
    { blockInheritance = Core.Nothing,
      description = Core.Nothing,
      etag = Core.Nothing,
      kind = "admin#directory#orgUnit",
      name = Core.Nothing,
      orgUnitId = Core.Nothing,
      orgUnitPath = Core.Nothing,
      parentOrgUnitId = Core.Nothing,
      parentOrgUnitPath = Core.Nothing
    }

instance Core.FromJSON OrgUnit where
  parseJSON =
    Core.withObject
      "OrgUnit"
      ( \o ->
          OrgUnit
            Core.<$> (o Core..:? "blockInheritance")
            Core.<*> (o Core..:? "description")
            Core.<*> (o Core..:? "etag")
            Core.<*> (o Core..:? "kind" Core..!= "admin#directory#orgUnit")
            Core.<*> (o Core..:? "name")
            Core.<*> (o Core..:? "orgUnitId")
            Core.<*> (o Core..:? "orgUnitPath")
            Core.<*> (o Core..:? "parentOrgUnitId")
            Core.<*> (o Core..:? "parentOrgUnitPath")
      )

instance Core.ToJSON OrgUnit where
  toJSON OrgUnit {..} =
    Core.object
      ( Core.catMaybes
          [ ("blockInheritance" Core..=) Core.<$> blockInheritance,
            ("description" Core..=) Core.<$> description,
            ("etag" Core..=) Core.<$> etag,
            Core.Just ("kind" Core..= kind),
            ("name" Core..=) Core.<$> name,
            ("orgUnitId" Core..=) Core.<$> orgUnitId,
            ("orgUnitPath" Core..=) Core.<$> orgUnitPath,
            ("parentOrgUnitId" Core..=) Core.<$> parentOrgUnitId,
            ("parentOrgUnitPath" Core..=) Core.<$> parentOrgUnitPath
          ]
      )

--
-- /See:/ 'newOrgUnits' smart constructor.
data OrgUnits = OrgUnits
  { -- | ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | The type of the API resource. For Org Unit resources, the type is @admin#directory#orgUnits@.
    kind :: Core.Text,
    -- | A list of organizational unit objects.
    organizationUnits :: (Core.Maybe [OrgUnit])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'OrgUnits' with the minimum fields required to make a request.
newOrgUnits ::
  OrgUnits
newOrgUnits =
  OrgUnits
    { etag = Core.Nothing,
      kind = "admin#directory#orgUnits",
      organizationUnits = Core.Nothing
    }

instance Core.FromJSON OrgUnits where
  parseJSON =
    Core.withObject
      "OrgUnits"
      ( \o ->
          OrgUnits
            Core.<$> (o Core..:? "etag")
            Core.<*> (o Core..:? "kind" Core..!= "admin#directory#orgUnits")
            Core.<*> (o Core..:? "organizationUnits")
      )

instance Core.ToJSON OrgUnits where
  toJSON OrgUnits {..} =
    Core.object
      ( Core.catMaybes
          [ ("etag" Core..=) Core.<$> etag,
            Core.Just ("kind" Core..= kind),
            ("organizationUnits" Core..=) Core.<$> organizationUnits
          ]
      )

-- | Contains information regarding the current OS update status.
--
-- /See:/ 'newOsUpdateStatus' smart constructor.
data OsUpdateStatus = OsUpdateStatus
  { -- | Date and time of the last reboot.
    rebootTime :: (Core.Maybe Core.Text),
    -- | The update state of an OS update.
    state :: (Core.Maybe OsUpdateStatus_State),
    -- | New required platform version from the pending updated kiosk app.
    targetKioskAppVersion :: (Core.Maybe Core.Text),
    -- | New platform version of the OS image being downloaded and applied. It is only set when update status is UPDATE/STATUS/DOWNLOAD/IN/PROGRESS or UPDATE/STATUS/NEED/REBOOT. Note this could be a dummy \"0.0.0.0\" for UPDATE/STATUS/NEED/REBOOT for some edge cases, e.g. update engine is restarted without a reboot.
    targetOsVersion :: (Core.Maybe Core.Text),
    -- | Date and time of the last update check.
    updateCheckTime :: (Core.Maybe Core.Text),
    -- | Date and time of the last successful OS update.
    updateTime :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'OsUpdateStatus' with the minimum fields required to make a request.
newOsUpdateStatus ::
  OsUpdateStatus
newOsUpdateStatus =
  OsUpdateStatus
    { rebootTime = Core.Nothing,
      state = Core.Nothing,
      targetKioskAppVersion = Core.Nothing,
      targetOsVersion = Core.Nothing,
      updateCheckTime = Core.Nothing,
      updateTime = Core.Nothing
    }

instance Core.FromJSON OsUpdateStatus where
  parseJSON =
    Core.withObject
      "OsUpdateStatus"
      ( \o ->
          OsUpdateStatus
            Core.<$> (o Core..:? "rebootTime")
            Core.<*> (o Core..:? "state")
            Core.<*> (o Core..:? "targetKioskAppVersion")
            Core.<*> (o Core..:? "targetOsVersion")
            Core.<*> (o Core..:? "updateCheckTime")
            Core.<*> (o Core..:? "updateTime")
      )

instance Core.ToJSON OsUpdateStatus where
  toJSON OsUpdateStatus {..} =
    Core.object
      ( Core.catMaybes
          [ ("rebootTime" Core..=) Core.<$> rebootTime,
            ("state" Core..=) Core.<$> state,
            ("targetKioskAppVersion" Core..=) Core.<$> targetKioskAppVersion,
            ("targetOsVersion" Core..=) Core.<$> targetOsVersion,
            ("updateCheckTime" Core..=) Core.<$> updateCheckTime,
            ("updateTime" Core..=) Core.<$> updateTime
          ]
      )

-- | Configuration for a print server.
--
-- /See:/ 'newPrintServer' smart constructor.
data PrintServer = PrintServer
  { -- | Output only. Time when the print server was created.
    createTime :: (Core.Maybe Core.DateTime),
    -- | Editable. Description of the print server (as shown in the Admin console).
    description :: (Core.Maybe Core.Text),
    -- | Editable. Display name of the print server (as shown in the Admin console).
    displayName :: (Core.Maybe Core.Text),
    -- | Immutable. ID of the print server. Leave empty when creating.
    id :: (Core.Maybe Core.Text),
    -- | Immutable. Resource name of the print server. Leave empty when creating. Format: @customers\/{customer.id}\/printServers\/{print_server.id}@
    name :: (Core.Maybe Core.Text),
    -- | ID of the organization unit (OU) that owns this print server. This value can only be set when the print server is initially created. If it\'s not populated, the print server is placed under the root OU. The @org_unit_id@ can be retrieved using the </admin-sdk/directory/reference/rest/v1/orgunits Directory API>.
    orgUnitId :: (Core.Maybe Core.Text),
    -- | Editable. Print server URI.
    uri :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'PrintServer' with the minimum fields required to make a request.
newPrintServer ::
  PrintServer
newPrintServer =
  PrintServer
    { createTime = Core.Nothing,
      description = Core.Nothing,
      displayName = Core.Nothing,
      id = Core.Nothing,
      name = Core.Nothing,
      orgUnitId = Core.Nothing,
      uri = Core.Nothing
    }

instance Core.FromJSON PrintServer where
  parseJSON =
    Core.withObject
      "PrintServer"
      ( \o ->
          PrintServer
            Core.<$> (o Core..:? "createTime")
            Core.<*> (o Core..:? "description")
            Core.<*> (o Core..:? "displayName")
            Core.<*> (o Core..:? "id")
            Core.<*> (o Core..:? "name")
            Core.<*> (o Core..:? "orgUnitId")
            Core.<*> (o Core..:? "uri")
      )

instance Core.ToJSON PrintServer where
  toJSON PrintServer {..} =
    Core.object
      ( Core.catMaybes
          [ ("createTime" Core..=) Core.<$> createTime,
            ("description" Core..=) Core.<$> description,
            ("displayName" Core..=) Core.<$> displayName,
            ("id" Core..=) Core.<$> id,
            ("name" Core..=) Core.<$> name,
            ("orgUnitId" Core..=) Core.<$> orgUnitId,
            ("uri" Core..=) Core.<$> uri
          ]
      )

-- | Info about failures
--
-- /See:/ 'newPrintServerFailureInfo' smart constructor.
data PrintServerFailureInfo = PrintServerFailureInfo
  { -- | Canonical code for why the update failed to apply.
    errorCode :: (Core.Maybe PrintServerFailureInfo_ErrorCode),
    -- | Failure reason message.
    errorMessage :: (Core.Maybe Core.Text),
    -- | Failed print server.
    printServer :: (Core.Maybe PrintServer),
    -- | ID of a failed print server.
    printServerId :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'PrintServerFailureInfo' with the minimum fields required to make a request.
newPrintServerFailureInfo ::
  PrintServerFailureInfo
newPrintServerFailureInfo =
  PrintServerFailureInfo
    { errorCode = Core.Nothing,
      errorMessage = Core.Nothing,
      printServer = Core.Nothing,
      printServerId = Core.Nothing
    }

instance Core.FromJSON PrintServerFailureInfo where
  parseJSON =
    Core.withObject
      "PrintServerFailureInfo"
      ( \o ->
          PrintServerFailureInfo
            Core.<$> (o Core..:? "errorCode")
            Core.<*> (o Core..:? "errorMessage")
            Core.<*> (o Core..:? "printServer")
            Core.<*> (o Core..:? "printServerId")
      )

instance Core.ToJSON PrintServerFailureInfo where
  toJSON PrintServerFailureInfo {..} =
    Core.object
      ( Core.catMaybes
          [ ("errorCode" Core..=) Core.<$> errorCode,
            ("errorMessage" Core..=) Core.<$> errorMessage,
            ("printServer" Core..=) Core.<$> printServer,
            ("printServerId" Core..=) Core.<$> printServerId
          ]
      )

-- | Printer configuration.
--
-- /See:/ 'newPrinter' smart constructor.
data Printer = Printer
  { -- | Output only. Auxiliary messages about issues with the printer configuration if any.
    auxiliaryMessages :: (Core.Maybe [AuxiliaryMessage]),
    -- | Output only. Time when printer was created.
    createTime :: (Core.Maybe Core.DateTime),
    -- | Editable. Description of printer.
    description :: (Core.Maybe Core.Text),
    -- | Editable. Name of printer.
    displayName :: (Core.Maybe Core.Text),
    -- | Id of the printer. (During printer creation leave empty)
    id :: (Core.Maybe Core.Text),
    -- | Editable. Make and model of printer. e.g. Lexmark MS610de Value must be in format as seen in ListPrinterModels response.
    makeAndModel :: (Core.Maybe Core.Text),
    -- | The resource name of the Printer object, in the format customers\/{customer-id}\/printers\/{printer-id} (During printer creation leave empty)
    name :: (Core.Maybe Core.Text),
    -- | Organization Unit that owns this printer (Only can be set during Printer creation)
    orgUnitId :: (Core.Maybe Core.Text),
    -- | Editable. Printer URI.
    uri :: (Core.Maybe Core.Text),
    -- | Editable. flag to use driverless configuration or not. If it\'s set to be true, make/and/model can be ignored
    useDriverlessConfig :: (Core.Maybe Core.Bool)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Printer' with the minimum fields required to make a request.
newPrinter ::
  Printer
newPrinter =
  Printer
    { auxiliaryMessages = Core.Nothing,
      createTime = Core.Nothing,
      description = Core.Nothing,
      displayName = Core.Nothing,
      id = Core.Nothing,
      makeAndModel = Core.Nothing,
      name = Core.Nothing,
      orgUnitId = Core.Nothing,
      uri = Core.Nothing,
      useDriverlessConfig = Core.Nothing
    }

instance Core.FromJSON Printer where
  parseJSON =
    Core.withObject
      "Printer"
      ( \o ->
          Printer
            Core.<$> (o Core..:? "auxiliaryMessages")
            Core.<*> (o Core..:? "createTime")
            Core.<*> (o Core..:? "description")
            Core.<*> (o Core..:? "displayName")
            Core.<*> (o Core..:? "id")
            Core.<*> (o Core..:? "makeAndModel")
            Core.<*> (o Core..:? "name")
            Core.<*> (o Core..:? "orgUnitId")
            Core.<*> (o Core..:? "uri")
            Core.<*> (o Core..:? "useDriverlessConfig")
      )

instance Core.ToJSON Printer where
  toJSON Printer {..} =
    Core.object
      ( Core.catMaybes
          [ ("auxiliaryMessages" Core..=) Core.<$> auxiliaryMessages,
            ("createTime" Core..=) Core.<$> createTime,
            ("description" Core..=) Core.<$> description,
            ("displayName" Core..=) Core.<$> displayName,
            ("id" Core..=) Core.<$> id,
            ("makeAndModel" Core..=) Core.<$> makeAndModel,
            ("name" Core..=) Core.<$> name,
            ("orgUnitId" Core..=) Core.<$> orgUnitId,
            ("uri" Core..=) Core.<$> uri,
            ("useDriverlessConfig" Core..=) Core.<$> useDriverlessConfig
          ]
      )

-- | Printer manufacturer and model
--
-- /See:/ 'newPrinterModel' smart constructor.
data PrinterModel = PrinterModel
  { -- | Display name. eq. \"Brother MFC-8840D\"
    displayName :: (Core.Maybe Core.Text),
    -- | Make and model as represented in \"make/and/model\" field in Printer object. eq. \"brother mfc-8840d\"
    makeAndModel :: (Core.Maybe Core.Text),
    -- | Manufacturer. eq. \"Brother\"
    manufacturer :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'PrinterModel' with the minimum fields required to make a request.
newPrinterModel ::
  PrinterModel
newPrinterModel =
  PrinterModel
    { displayName = Core.Nothing,
      makeAndModel = Core.Nothing,
      manufacturer = Core.Nothing
    }

instance Core.FromJSON PrinterModel where
  parseJSON =
    Core.withObject
      "PrinterModel"
      ( \o ->
          PrinterModel
            Core.<$> (o Core..:? "displayName")
            Core.<*> (o Core..:? "makeAndModel")
            Core.<*> (o Core..:? "manufacturer")
      )

instance Core.ToJSON PrinterModel where
  toJSON PrinterModel {..} =
    Core.object
      ( Core.catMaybes
          [ ("displayName" Core..=) Core.<$> displayName,
            ("makeAndModel" Core..=) Core.<$> makeAndModel,
            ("manufacturer" Core..=) Core.<$> manufacturer
          ]
      )

--
-- /See:/ 'newPrivilege' smart constructor.
data Privilege = Privilege
  { -- | A list of child privileges. Privileges for a service form a tree. Each privilege can have a list of child privileges; this list is empty for a leaf privilege.
    childPrivileges :: (Core.Maybe [Privilege]),
    -- | ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | If the privilege can be restricted to an organization unit.
    isOuScopable :: (Core.Maybe Core.Bool),
    -- | The type of the API resource. This is always @admin#directory#privilege@.
    kind :: Core.Text,
    -- | The name of the privilege.
    privilegeName :: (Core.Maybe Core.Text),
    -- | The obfuscated ID of the service this privilege is for. This value is returned with </admin-sdk/directory/v1/reference/privileges/list Privileges.list()>.
    serviceId :: (Core.Maybe Core.Text),
    -- | The name of the service this privilege is for.
    serviceName :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Privilege' with the minimum fields required to make a request.
newPrivilege ::
  Privilege
newPrivilege =
  Privilege
    { childPrivileges = Core.Nothing,
      etag = Core.Nothing,
      isOuScopable = Core.Nothing,
      kind = "admin#directory#privilege",
      privilegeName = Core.Nothing,
      serviceId = Core.Nothing,
      serviceName = Core.Nothing
    }

instance Core.FromJSON Privilege where
  parseJSON =
    Core.withObject
      "Privilege"
      ( \o ->
          Privilege
            Core.<$> (o Core..:? "childPrivileges")
            Core.<*> (o Core..:? "etag")
            Core.<*> (o Core..:? "isOuScopable")
            Core.<*> (o Core..:? "kind" Core..!= "admin#directory#privilege")
            Core.<*> (o Core..:? "privilegeName")
            Core.<*> (o Core..:? "serviceId")
            Core.<*> (o Core..:? "serviceName")
      )

instance Core.ToJSON Privilege where
  toJSON Privilege {..} =
    Core.object
      ( Core.catMaybes
          [ ("childPrivileges" Core..=) Core.<$> childPrivileges,
            ("etag" Core..=) Core.<$> etag,
            ("isOuScopable" Core..=) Core.<$> isOuScopable,
            Core.Just ("kind" Core..= kind),
            ("privilegeName" Core..=) Core.<$> privilegeName,
            ("serviceId" Core..=) Core.<$> serviceId,
            ("serviceName" Core..=) Core.<$> serviceName
          ]
      )

--
-- /See:/ 'newPrivileges' smart constructor.
data Privileges = Privileges
  { -- | ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | A list of Privilege resources.
    items :: (Core.Maybe [Privilege]),
    -- | The type of the API resource. This is always @admin#directory#privileges@.
    kind :: Core.Text
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Privileges' with the minimum fields required to make a request.
newPrivileges ::
  Privileges
newPrivileges =
  Privileges
    { etag = Core.Nothing,
      items = Core.Nothing,
      kind = "admin#directory#privileges"
    }

instance Core.FromJSON Privileges where
  parseJSON =
    Core.withObject
      "Privileges"
      ( \o ->
          Privileges
            Core.<$> (o Core..:? "etag")
            Core.<*> (o Core..:? "items")
            Core.<*> (o Core..:? "kind" Core..!= "admin#directory#privileges")
      )

instance Core.ToJSON Privileges where
  toJSON Privileges {..} =
    Core.object
      ( Core.catMaybes
          [ ("etag" Core..=) Core.<$> etag,
            ("items" Core..=) Core.<$> items,
            Core.Just ("kind" Core..= kind)
          ]
      )

--
-- /See:/ 'newRole' smart constructor.
data Role = Role
  { -- | ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | Returns @true@ if the role is a super admin role.
    isSuperAdminRole :: (Core.Maybe Core.Bool),
    -- | Returns @true@ if this is a pre-defined system role.
    isSystemRole :: (Core.Maybe Core.Bool),
    -- | The type of the API resource. This is always @admin#directory#role@.
    kind :: Core.Text,
    -- | A short description of the role.
    roleDescription :: (Core.Maybe Core.Text),
    -- | ID of the role.
    roleId :: (Core.Maybe Core.Int64),
    -- | Name of the role.
    roleName :: (Core.Maybe Core.Text),
    -- | The set of privileges that are granted to this role.
    rolePrivileges :: (Core.Maybe [Role_RolePrivilegesItem])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Role' with the minimum fields required to make a request.
newRole ::
  Role
newRole =
  Role
    { etag = Core.Nothing,
      isSuperAdminRole = Core.Nothing,
      isSystemRole = Core.Nothing,
      kind = "admin#directory#role",
      roleDescription = Core.Nothing,
      roleId = Core.Nothing,
      roleName = Core.Nothing,
      rolePrivileges = Core.Nothing
    }

instance Core.FromJSON Role where
  parseJSON =
    Core.withObject
      "Role"
      ( \o ->
          Role
            Core.<$> (o Core..:? "etag")
            Core.<*> (o Core..:? "isSuperAdminRole")
            Core.<*> (o Core..:? "isSystemRole")
            Core.<*> (o Core..:? "kind" Core..!= "admin#directory#role")
            Core.<*> (o Core..:? "roleDescription")
            Core.<*> (o Core..:? "roleId" Core.<&> Core.fmap Core.fromAsText)
            Core.<*> (o Core..:? "roleName")
            Core.<*> (o Core..:? "rolePrivileges")
      )

instance Core.ToJSON Role where
  toJSON Role {..} =
    Core.object
      ( Core.catMaybes
          [ ("etag" Core..=) Core.<$> etag,
            ("isSuperAdminRole" Core..=) Core.<$> isSuperAdminRole,
            ("isSystemRole" Core..=) Core.<$> isSystemRole,
            Core.Just ("kind" Core..= kind),
            ("roleDescription" Core..=) Core.<$> roleDescription,
            ("roleId" Core..=) Core.. Core.AsText Core.<$> roleId,
            ("roleName" Core..=) Core.<$> roleName,
            ("rolePrivileges" Core..=) Core.<$> rolePrivileges
          ]
      )

--
-- /See:/ 'newRole_RolePrivilegesItem' smart constructor.
data Role_RolePrivilegesItem = Role_RolePrivilegesItem
  { -- | The name of the privilege.
    privilegeName :: (Core.Maybe Core.Text),
    -- | The obfuscated ID of the service this privilege is for. This value is returned with </admin-sdk/directory/v1/reference/privileges/list Privileges.list()>.
    serviceId :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Role_RolePrivilegesItem' with the minimum fields required to make a request.
newRole_RolePrivilegesItem ::
  Role_RolePrivilegesItem
newRole_RolePrivilegesItem =
  Role_RolePrivilegesItem
    { privilegeName = Core.Nothing,
      serviceId = Core.Nothing
    }

instance Core.FromJSON Role_RolePrivilegesItem where
  parseJSON =
    Core.withObject
      "Role_RolePrivilegesItem"
      ( \o ->
          Role_RolePrivilegesItem
            Core.<$> (o Core..:? "privilegeName")
            Core.<*> (o Core..:? "serviceId")
      )

instance Core.ToJSON Role_RolePrivilegesItem where
  toJSON Role_RolePrivilegesItem {..} =
    Core.object
      ( Core.catMaybes
          [ ("privilegeName" Core..=) Core.<$> privilegeName,
            ("serviceId" Core..=) Core.<$> serviceId
          ]
      )

-- | Defines an assignment of a role.
--
-- /See:/ 'newRoleAssignment' smart constructor.
data RoleAssignment = RoleAssignment
  { -- | The unique ID of the entity this role is assigned to—either the @user_id@ of a user, the @group_id@ of a group, or the @uniqueId@ of a service account as defined in <https://cloud.google.com/iam/docs/reference/rest/v1/projects.serviceAccounts Identity and Access Management (IAM)>.
    assignedTo :: (Core.Maybe Core.Text),
    -- | Output only. The type of the assignee (@USER@ or @GROUP@).
    assigneeType :: (Core.Maybe RoleAssignment_AssigneeType),
    -- | Optional. The condition associated with this role assignment. Note: Feature is available to Enterprise Standard, Enterprise Plus, Google Workspace for Education Plus and Cloud Identity Premium customers. A @RoleAssignment@ with the @condition@ field set will only take effect when the resource being accessed meets the condition. If @condition@ is empty, the role (@role_id@) is applied to the actor (@assigned_to@) at the scope (@scope_type@) unconditionally. Currently, the following conditions are supported: - To make the @RoleAssignment@ only applicable to <https://cloud.google.com/identity/docs/groups#group_types Security Groups>: @api.getAttribute(\'cloudidentity.googleapis.com\/groups.labels\', []).hasAny([\'groups.security\']) && resource.type == \'cloudidentity.googleapis.com\/Group\'@ - To make the @RoleAssignment@ not applicable to <https://cloud.google.com/identity/docs/groups#group_types Security Groups>:
    -- @!api.getAttribute(\'cloudidentity.googleapis.com\/groups.labels\', []).hasAny([\'groups.security\']) && resource.type == \'cloudidentity.googleapis.com\/Group\'@ Currently, the condition strings have to be verbatim and they only work with the following <https://support.google.com/a/answer/2405986 pre-built administrator roles>: - Groups Editor - Groups Reader The condition follows <https://cloud.google.com/iam/docs/conditions-overview Cloud IAM condition syntax>. Additional conditions related to Locked Groups are available under Open Beta. - To make the @RoleAssignment@ not applicable to <https://cloud.google.com/identity/docs/groups#group_types Locked Groups>: @!api.getAttribute(\'cloudidentity.googleapis.com\/groups.labels\', []).hasAny([\'groups.locked\']) && resource.type == \'cloudidentity.googleapis.com\/Group\'@ This condition can also be used in conjunction with a Security-related condition.
    condition :: (Core.Maybe Core.Text),
    -- | ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | The type of the API resource. This is always @admin#directory#roleAssignment@.
    kind :: Core.Text,
    -- | If the role is restricted to an organization unit, this contains the ID for the organization unit the exercise of this role is restricted to.
    orgUnitId :: (Core.Maybe Core.Text),
    -- | ID of this roleAssignment.
    roleAssignmentId :: (Core.Maybe Core.Int64),
    -- | The ID of the role that is assigned.
    roleId :: (Core.Maybe Core.Int64),
    -- | The scope in which this role is assigned.
    scopeType :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'RoleAssignment' with the minimum fields required to make a request.
newRoleAssignment ::
  RoleAssignment
newRoleAssignment =
  RoleAssignment
    { assignedTo = Core.Nothing,
      assigneeType = Core.Nothing,
      condition = Core.Nothing,
      etag = Core.Nothing,
      kind = "admin#directory#roleAssignment",
      orgUnitId = Core.Nothing,
      roleAssignmentId = Core.Nothing,
      roleId = Core.Nothing,
      scopeType = Core.Nothing
    }

instance Core.FromJSON RoleAssignment where
  parseJSON =
    Core.withObject
      "RoleAssignment"
      ( \o ->
          RoleAssignment
            Core.<$> (o Core..:? "assignedTo")
            Core.<*> (o Core..:? "assigneeType")
            Core.<*> (o Core..:? "condition")
            Core.<*> (o Core..:? "etag")
            Core.<*> (o Core..:? "kind" Core..!= "admin#directory#roleAssignment")
            Core.<*> (o Core..:? "orgUnitId")
            Core.<*> (o Core..:? "roleAssignmentId" Core.<&> Core.fmap Core.fromAsText)
            Core.<*> (o Core..:? "roleId" Core.<&> Core.fmap Core.fromAsText)
            Core.<*> (o Core..:? "scopeType")
      )

instance Core.ToJSON RoleAssignment where
  toJSON RoleAssignment {..} =
    Core.object
      ( Core.catMaybes
          [ ("assignedTo" Core..=) Core.<$> assignedTo,
            ("assigneeType" Core..=) Core.<$> assigneeType,
            ("condition" Core..=) Core.<$> condition,
            ("etag" Core..=) Core.<$> etag,
            Core.Just ("kind" Core..= kind),
            ("orgUnitId" Core..=) Core.<$> orgUnitId,
            ("roleAssignmentId" Core..=)
              Core.. Core.AsText
              Core.<$> roleAssignmentId,
            ("roleId" Core..=) Core.. Core.AsText Core.<$> roleId,
            ("scopeType" Core..=) Core.<$> scopeType
          ]
      )

--
-- /See:/ 'newRoleAssignments' smart constructor.
data RoleAssignments = RoleAssignments
  { -- | ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | A list of RoleAssignment resources.
    items :: (Core.Maybe [RoleAssignment]),
    -- | The type of the API resource. This is always @admin#directory#roleAssignments@.
    kind :: Core.Text,
    nextPageToken :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'RoleAssignments' with the minimum fields required to make a request.
newRoleAssignments ::
  RoleAssignments
newRoleAssignments =
  RoleAssignments
    { etag = Core.Nothing,
      items = Core.Nothing,
      kind = "admin#directory#roleAssignments",
      nextPageToken = Core.Nothing
    }

instance Core.FromJSON RoleAssignments where
  parseJSON =
    Core.withObject
      "RoleAssignments"
      ( \o ->
          RoleAssignments
            Core.<$> (o Core..:? "etag")
            Core.<*> (o Core..:? "items")
            Core.<*> (o Core..:? "kind" Core..!= "admin#directory#roleAssignments")
            Core.<*> (o Core..:? "nextPageToken")
      )

instance Core.ToJSON RoleAssignments where
  toJSON RoleAssignments {..} =
    Core.object
      ( Core.catMaybes
          [ ("etag" Core..=) Core.<$> etag,
            ("items" Core..=) Core.<$> items,
            Core.Just ("kind" Core..= kind),
            ("nextPageToken" Core..=) Core.<$> nextPageToken
          ]
      )

--
-- /See:/ 'newRoles' smart constructor.
data Roles = Roles
  { -- | ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | A list of Role resources.
    items :: (Core.Maybe [Role]),
    -- | The type of the API resource. This is always @admin#directory#roles@.
    kind :: Core.Text,
    nextPageToken :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Roles' with the minimum fields required to make a request.
newRoles ::
  Roles
newRoles =
  Roles
    { etag = Core.Nothing,
      items = Core.Nothing,
      kind = "admin#directory#roles",
      nextPageToken = Core.Nothing
    }

instance Core.FromJSON Roles where
  parseJSON =
    Core.withObject
      "Roles"
      ( \o ->
          Roles
            Core.<$> (o Core..:? "etag")
            Core.<*> (o Core..:? "items")
            Core.<*> (o Core..:? "kind" Core..!= "admin#directory#roles")
            Core.<*> (o Core..:? "nextPageToken")
      )

instance Core.ToJSON Roles where
  toJSON Roles {..} =
    Core.object
      ( Core.catMaybes
          [ ("etag" Core..=) Core.<$> etag,
            ("items" Core..=) Core.<$> items,
            Core.Just ("kind" Core..= kind),
            ("nextPageToken" Core..=) Core.<$> nextPageToken
          ]
      )

-- | The type of API resource. For Schema resources, this is always @admin#directory#schema@.
--
-- /See:/ 'newSchema' smart constructor.
data Schema = Schema
  { -- | Display name for the schema.
    displayName :: (Core.Maybe Core.Text),
    -- | The ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | A list of fields in the schema.
    fields :: (Core.Maybe [SchemaFieldSpec]),
    -- | Kind of resource this is.
    kind :: Core.Text,
    -- | The unique identifier of the schema (Read-only)
    schemaId :: (Core.Maybe Core.Text),
    -- | The schema\'s name. Each @schema_name@ must be unique within a customer. Reusing a name results in a @409: Entity already exists@ error.
    schemaName :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Schema' with the minimum fields required to make a request.
newSchema ::
  Schema
newSchema =
  Schema
    { displayName = Core.Nothing,
      etag = Core.Nothing,
      fields = Core.Nothing,
      kind = "admin#directory#schema",
      schemaId = Core.Nothing,
      schemaName = Core.Nothing
    }

instance Core.FromJSON Schema where
  parseJSON =
    Core.withObject
      "Schema"
      ( \o ->
          Schema
            Core.<$> (o Core..:? "displayName")
            Core.<*> (o Core..:? "etag")
            Core.<*> (o Core..:? "fields")
            Core.<*> (o Core..:? "kind" Core..!= "admin#directory#schema")
            Core.<*> (o Core..:? "schemaId")
            Core.<*> (o Core..:? "schemaName")
      )

instance Core.ToJSON Schema where
  toJSON Schema {..} =
    Core.object
      ( Core.catMaybes
          [ ("displayName" Core..=) Core.<$> displayName,
            ("etag" Core..=) Core.<$> etag,
            ("fields" Core..=) Core.<$> fields,
            Core.Just ("kind" Core..= kind),
            ("schemaId" Core..=) Core.<$> schemaId,
            ("schemaName" Core..=) Core.<$> schemaName
          ]
      )

-- | You can use schemas to add custom fields to user profiles. You can use these fields to store information such as the projects your users work on, their physical locations, their hire dates, or whatever else fits your business needs. For more information, see </admin-sdk/directory/v1/guides/manage-schemas Custom User Fields>.
--
-- /See:/ 'newSchemaFieldSpec' smart constructor.
data SchemaFieldSpec = SchemaFieldSpec
  { -- | Display Name of the field.
    displayName :: (Core.Maybe Core.Text),
    -- | The ETag of the field.
    etag :: (Core.Maybe Core.Text),
    -- | The unique identifier of the field (Read-only)
    fieldId :: (Core.Maybe Core.Text),
    -- | The name of the field.
    fieldName :: (Core.Maybe Core.Text),
    -- | The type of the field.
    fieldType :: (Core.Maybe Core.Text),
    -- | Boolean specifying whether the field is indexed or not. Default: @true@.
    indexed :: Core.Bool,
    -- | The kind of resource this is. For schema fields this is always @admin#directory#schema#fieldspec@.
    kind :: Core.Text,
    -- | A boolean specifying whether this is a multi-valued field or not. Default: @false@.
    multiValued :: (Core.Maybe Core.Bool),
    -- | Indexing spec for a numeric field. By default, only exact match queries will be supported for numeric fields. Setting the @numericIndexingSpec@ allows range queries to be supported.
    numericIndexingSpec :: (Core.Maybe SchemaFieldSpec_NumericIndexingSpec),
    -- | Specifies who can view values of this field. See </admin-sdk/directory/v1/guides/manage-users#retrieve_users_non_admin Retrieve users as a non-administrator> for more information. Note: It may take up to 24 hours for changes to this field to be reflected.
    readAccessType :: Core.Text
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'SchemaFieldSpec' with the minimum fields required to make a request.
newSchemaFieldSpec ::
  SchemaFieldSpec
newSchemaFieldSpec =
  SchemaFieldSpec
    { displayName = Core.Nothing,
      etag = Core.Nothing,
      fieldId = Core.Nothing,
      fieldName = Core.Nothing,
      fieldType = Core.Nothing,
      indexed = Core.True,
      kind = "admin#directory#schema#fieldspec",
      multiValued = Core.Nothing,
      numericIndexingSpec = Core.Nothing,
      readAccessType = "ALL_DOMAIN_USERS"
    }

instance Core.FromJSON SchemaFieldSpec where
  parseJSON =
    Core.withObject
      "SchemaFieldSpec"
      ( \o ->
          SchemaFieldSpec
            Core.<$> (o Core..:? "displayName")
            Core.<*> (o Core..:? "etag")
            Core.<*> (o Core..:? "fieldId")
            Core.<*> (o Core..:? "fieldName")
            Core.<*> (o Core..:? "fieldType")
            Core.<*> (o Core..:? "indexed" Core..!= Core.True)
            Core.<*> (o Core..:? "kind" Core..!= "admin#directory#schema#fieldspec")
            Core.<*> (o Core..:? "multiValued")
            Core.<*> (o Core..:? "numericIndexingSpec")
            Core.<*> (o Core..:? "readAccessType" Core..!= "ALL_DOMAIN_USERS")
      )

instance Core.ToJSON SchemaFieldSpec where
  toJSON SchemaFieldSpec {..} =
    Core.object
      ( Core.catMaybes
          [ ("displayName" Core..=) Core.<$> displayName,
            ("etag" Core..=) Core.<$> etag,
            ("fieldId" Core..=) Core.<$> fieldId,
            ("fieldName" Core..=) Core.<$> fieldName,
            ("fieldType" Core..=) Core.<$> fieldType,
            Core.Just ("indexed" Core..= indexed),
            Core.Just ("kind" Core..= kind),
            ("multiValued" Core..=) Core.<$> multiValued,
            ("numericIndexingSpec" Core..=) Core.<$> numericIndexingSpec,
            Core.Just ("readAccessType" Core..= readAccessType)
          ]
      )

-- | Indexing spec for a numeric field. By default, only exact match queries will be supported for numeric fields. Setting the @numericIndexingSpec@ allows range queries to be supported.
--
-- /See:/ 'newSchemaFieldSpec_NumericIndexingSpec' smart constructor.
data SchemaFieldSpec_NumericIndexingSpec = SchemaFieldSpec_NumericIndexingSpec
  { -- | Maximum value of this field. This is meant to be indicative rather than enforced. Values outside this range will still be indexed, but search may not be as performant.
    maxValue :: (Core.Maybe Core.Double),
    -- | Minimum value of this field. This is meant to be indicative rather than enforced. Values outside this range will still be indexed, but search may not be as performant.
    minValue :: (Core.Maybe Core.Double)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'SchemaFieldSpec_NumericIndexingSpec' with the minimum fields required to make a request.
newSchemaFieldSpec_NumericIndexingSpec ::
  SchemaFieldSpec_NumericIndexingSpec
newSchemaFieldSpec_NumericIndexingSpec =
  SchemaFieldSpec_NumericIndexingSpec
    { maxValue = Core.Nothing,
      minValue = Core.Nothing
    }

instance Core.FromJSON SchemaFieldSpec_NumericIndexingSpec where
  parseJSON =
    Core.withObject
      "SchemaFieldSpec_NumericIndexingSpec"
      ( \o ->
          SchemaFieldSpec_NumericIndexingSpec
            Core.<$> (o Core..:? "maxValue")
            Core.<*> (o Core..:? "minValue")
      )

instance Core.ToJSON SchemaFieldSpec_NumericIndexingSpec where
  toJSON SchemaFieldSpec_NumericIndexingSpec {..} =
    Core.object
      ( Core.catMaybes
          [ ("maxValue" Core..=) Core.<$> maxValue,
            ("minValue" Core..=) Core.<$> minValue
          ]
      )

-- | JSON response template for List Schema operation in Directory API.
--
-- /See:/ 'newSchemas' smart constructor.
data Schemas = Schemas
  { -- | ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | Kind of resource this is.
    kind :: Core.Text,
    -- | A list of UserSchema objects.
    schemas :: (Core.Maybe [Schema])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Schemas' with the minimum fields required to make a request.
newSchemas ::
  Schemas
newSchemas =
  Schemas
    { etag = Core.Nothing,
      kind = "admin#directory#schemas",
      schemas = Core.Nothing
    }

instance Core.FromJSON Schemas where
  parseJSON =
    Core.withObject
      "Schemas"
      ( \o ->
          Schemas
            Core.<$> (o Core..:? "etag")
            Core.<*> (o Core..:? "kind" Core..!= "admin#directory#schemas")
            Core.<*> (o Core..:? "schemas")
      )

instance Core.ToJSON Schemas where
  toJSON Schemas {..} =
    Core.object
      ( Core.catMaybes
          [ ("etag" Core..=) Core.<$> etag,
            Core.Just ("kind" Core..= kind),
            ("schemas" Core..=) Core.<$> schemas
          ]
      )

-- | The @Status@ type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by <https://github.com/grpc gRPC>. Each @Status@ message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the <https://cloud.google.com/apis/design/errors API Design Guide>.
--
-- /See:/ 'newStatus' smart constructor.
data Status = Status
  { -- | The status code, which should be an enum value of google.rpc.Code.
    code :: (Core.Maybe Core.Int32),
    -- | A list of messages that carry the error details. There is a common set of message types for APIs to use.
    details :: (Core.Maybe [Status_DetailsItem]),
    -- | A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the google.rpc.Status.details field, or localized by the client.
    message :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Status' with the minimum fields required to make a request.
newStatus ::
  Status
newStatus =
  Status
    { code = Core.Nothing,
      details = Core.Nothing,
      message = Core.Nothing
    }

instance Core.FromJSON Status where
  parseJSON =
    Core.withObject
      "Status"
      ( \o ->
          Status
            Core.<$> (o Core..:? "code")
            Core.<*> (o Core..:? "details")
            Core.<*> (o Core..:? "message")
      )

instance Core.ToJSON Status where
  toJSON Status {..} =
    Core.object
      ( Core.catMaybes
          [ ("code" Core..=) Core.<$> code,
            ("details" Core..=) Core.<$> details,
            ("message" Core..=) Core.<$> message
          ]
      )

--
-- /See:/ 'newStatus_DetailsItem' smart constructor.
newtype Status_DetailsItem = Status_DetailsItem
  { -- | Properties of the object. Contains field \@type with type URL.
    additional :: (Core.HashMap Core.Text Core.Value)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Status_DetailsItem' with the minimum fields required to make a request.
newStatus_DetailsItem ::
  -- |  Properties of the object. Contains field \@type with type URL. See 'additional'.
  Core.HashMap Core.Text Core.Value ->
  Status_DetailsItem
newStatus_DetailsItem additional =
  Status_DetailsItem {additional = additional}

instance Core.FromJSON Status_DetailsItem where
  parseJSON =
    Core.withObject
      "Status_DetailsItem"
      (\o -> Status_DetailsItem Core.<$> (Core.parseJSONObject o))

instance Core.ToJSON Status_DetailsItem where
  toJSON Status_DetailsItem {..} = Core.toJSON additional

-- | JSON template for token resource in Directory API.
--
-- /See:/ 'newToken' smart constructor.
data Token = Token
  { -- | Whether the application is registered with Google. The value is @true@ if the application has an anonymous Client ID.
    anonymous :: (Core.Maybe Core.Bool),
    -- | The Client ID of the application the token is issued to.
    clientId :: (Core.Maybe Core.Text),
    -- | The displayable name of the application the token is issued to.
    displayText :: (Core.Maybe Core.Text),
    -- | ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | The type of the API resource. This is always @admin#directory#token@.
    kind :: Core.Text,
    -- | Whether the token is issued to an installed application. The value is @true@ if the application is installed to a desktop or mobile device.
    nativeApp :: (Core.Maybe Core.Bool),
    -- | A list of authorization scopes the application is granted.
    scopes :: (Core.Maybe [Core.Text]),
    -- | The unique ID of the user that issued the token.
    userKey :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Token' with the minimum fields required to make a request.
newToken ::
  Token
newToken =
  Token
    { anonymous = Core.Nothing,
      clientId = Core.Nothing,
      displayText = Core.Nothing,
      etag = Core.Nothing,
      kind = "admin#directory#token",
      nativeApp = Core.Nothing,
      scopes = Core.Nothing,
      userKey = Core.Nothing
    }

instance Core.FromJSON Token where
  parseJSON =
    Core.withObject
      "Token"
      ( \o ->
          Token
            Core.<$> (o Core..:? "anonymous")
            Core.<*> (o Core..:? "clientId")
            Core.<*> (o Core..:? "displayText")
            Core.<*> (o Core..:? "etag")
            Core.<*> (o Core..:? "kind" Core..!= "admin#directory#token")
            Core.<*> (o Core..:? "nativeApp")
            Core.<*> (o Core..:? "scopes")
            Core.<*> (o Core..:? "userKey")
      )

instance Core.ToJSON Token where
  toJSON Token {..} =
    Core.object
      ( Core.catMaybes
          [ ("anonymous" Core..=) Core.<$> anonymous,
            ("clientId" Core..=) Core.<$> clientId,
            ("displayText" Core..=) Core.<$> displayText,
            ("etag" Core..=) Core.<$> etag,
            Core.Just ("kind" Core..= kind),
            ("nativeApp" Core..=) Core.<$> nativeApp,
            ("scopes" Core..=) Core.<$> scopes,
            ("userKey" Core..=) Core.<$> userKey
          ]
      )

-- | JSON response template for List tokens operation in Directory API.
--
-- /See:/ 'newTokens' smart constructor.
data Tokens = Tokens
  { -- | ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | A list of Token resources.
    items :: (Core.Maybe [Token]),
    -- | The type of the API resource. This is always @admin#directory#tokenList@.
    kind :: Core.Text
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Tokens' with the minimum fields required to make a request.
newTokens ::
  Tokens
newTokens =
  Tokens
    { etag = Core.Nothing,
      items = Core.Nothing,
      kind = "admin#directory#tokenList"
    }

instance Core.FromJSON Tokens where
  parseJSON =
    Core.withObject
      "Tokens"
      ( \o ->
          Tokens
            Core.<$> (o Core..:? "etag")
            Core.<*> (o Core..:? "items")
            Core.<*> (o Core..:? "kind" Core..!= "admin#directory#tokenList")
      )

instance Core.ToJSON Tokens where
  toJSON Tokens {..} =
    Core.object
      ( Core.catMaybes
          [ ("etag" Core..=) Core.<$> etag,
            ("items" Core..=) Core.<$> items,
            Core.Just ("kind" Core..= kind)
          ]
      )

-- | The Directory API allows you to create and manage your account\'s users, user aliases, and user Google profile photos. For more information about common tasks, see the </admin-sdk/directory/v1/guides/manage-users.html User Accounts Developer\'s Guide> and the </admin-sdk/directory/v1/guides/manage-user-aliases.html User Aliases Developer\'s Guide>.
--
-- /See:/ 'newUser' smart constructor.
data User = User
  { -- | The list of the user\'s addresses. The maximum allowed data size for this field is 10KB.
    addresses :: (Core.Maybe Core.Value),
    -- | Output only. This property is @true@ if the user has completed an initial login and accepted the Terms of Service agreement.
    agreedToTerms :: (Core.Maybe Core.Bool),
    -- | Output only. The list of the user\'s alias email addresses.
    aliases :: (Core.Maybe [Core.Text]),
    -- | Indicates if user is archived.
    archived :: (Core.Maybe Core.Bool),
    -- | Indicates if the user is forced to change their password at next login. This setting doesn\'t apply when <https://support.google.com/a/answer/60224 the user signs in via a third-party identity provider>.
    changePasswordAtNextLogin :: (Core.Maybe Core.Bool),
    -- | User\'s G Suite account creation time. (Read-only)
    creationTime :: (Core.Maybe Core.DateTime),
    -- | Custom fields of the user. The key is a @schema_name@ and its values are @\'field_name\': \'field_value\'@.
    customSchemas :: (Core.Maybe User_CustomSchemas),
    -- | Output only. The customer ID to </admin-sdk/directory/v1/guides/manage-users.html#get_all_users retrieve all account users>. You can use the alias @my_customer@ to represent your account\'s @customerId@. As a reseller administrator, you can use the resold customer account\'s @customerId@. To get a @customerId@, use the account\'s primary domain in the @domain@ parameter of a </admin-sdk/directory/v1/reference/users/list users.list> request.
    customerId :: (Core.Maybe Core.Text),
    deletionTime :: (Core.Maybe Core.DateTime),
    -- | The list of the user\'s email addresses. The maximum allowed data size for this field is 10KB. This excludes @publicKeyEncryptionCertificates@.
    emails :: (Core.Maybe Core.Value),
    -- | Output only. ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | The list of external IDs for the user, such as an employee or network ID. The maximum allowed data size for this field is 2KB.
    externalIds :: (Core.Maybe Core.Value),
    -- | The user\'s gender. The maximum allowed data size for this field is 1KB.
    gender :: (Core.Maybe Core.Value),
    -- | Stores the hash format of the @password@ property. The following @hashFunction@ values are allowed: * @MD5@ - Accepts simple hex-encoded values. * @SHA-1@ - Accepts simple hex-encoded values. * @crypt@ - Compliant with the <https://en.wikipedia.org/wiki/Crypt_%28C%29 C crypt library>. Supports the DES, MD5 (hash prefix @$1$@), SHA-256 (hash prefix @$5$@), and SHA-512 (hash prefix @$6$@) hash algorithms. If rounds are specified as part of the prefix, they must be 10,000 or fewer.
    hashFunction :: (Core.Maybe Core.Text),
    -- | The unique ID for the user. A user @id@ can be used as a user request URI\'s @userKey@.
    id :: (Core.Maybe Core.Text),
    -- | The list of the user\'s Instant Messenger (IM) accounts. A user account can have multiple ims properties. But, only one of these ims properties can be the primary IM contact. The maximum allowed data size for this field is 2KB.
    ims :: (Core.Maybe Core.Value),
    -- | Indicates if the user\'s profile is visible in the Google Workspace global address list when the contact sharing feature is enabled for the domain. For more information about excluding user profiles, see the <https://support.google.com/a/answer/1285988 administration help center>.
    includeInGlobalAddressList :: (Core.Maybe Core.Bool),
    -- | If @true@, the user\'s IP address is subject to a deprecated IP address <https://support.google.com/a/answer/60752 allowlist> configuration.
    ipWhitelisted :: (Core.Maybe Core.Bool),
    -- | Output only. Indicates a user with super admininistrator privileges. The @isAdmin@ property can only be edited in the </admin-sdk/directory/v1/guides/manage-users.html#make_admin Make a user an administrator> operation ( </admin-sdk/directory/v1/reference/users/makeAdmin.html makeAdmin> method). If edited in the user </admin-sdk/directory/v1/reference/users/insert.html insert> or </admin-sdk/directory/v1/reference/users/update.html update> methods, the edit is ignored by the API service.
    isAdmin :: (Core.Maybe Core.Bool),
    -- | Output only. Indicates if the user is a delegated administrator. Delegated administrators are supported by the API but cannot create or undelete users, or make users administrators. These requests are ignored by the API service. Roles and privileges for administrators are assigned using the <https://support.google.com/a/answer/33325 Admin console>.
    isDelegatedAdmin :: (Core.Maybe Core.Bool),
    -- | Output only. Is 2-step verification enforced (Read-only)
    isEnforcedIn2Sv :: (Core.Maybe Core.Bool),
    -- | Output only. Is enrolled in 2-step verification (Read-only)
    isEnrolledIn2Sv :: (Core.Maybe Core.Bool),
    -- | Output only. Indicates if the user\'s Google mailbox is created. This property is only applicable if the user has been assigned a Gmail license.
    isMailboxSetup :: (Core.Maybe Core.Bool),
    -- | The list of the user\'s keywords. The maximum allowed data size for this field is 1KB.
    keywords :: (Core.Maybe Core.Value),
    -- | Output only. The type of the API resource. For Users resources, the value is @admin#directory#user@.
    kind :: Core.Text,
    -- | The user\'s languages. The maximum allowed data size for this field is 1KB.
    languages :: (Core.Maybe Core.Value),
    -- | User\'s last login time. (Read-only)
    lastLoginTime :: (Core.Maybe Core.DateTime),
    -- | The user\'s locations. The maximum allowed data size for this field is 10KB.
    locations :: (Core.Maybe Core.Value),
    -- | Holds the given and family names of the user, and the read-only @fullName@ value. The maximum number of characters in the @givenName@ and in the @familyName@ values is 60. In addition, name values support unicode\/UTF-8 characters, and can contain spaces, letters (a-z), numbers (0-9), dashes (-), forward slashes (\/), and periods (.). For more information about character usage rules, see the <https://support.google.com/a/answer/9193374 administration help center>. Maximum allowed data size for this field is 1KB.
    name :: (Core.Maybe UserName),
    -- | Output only. The list of the user\'s non-editable alias email addresses. These are typically outside the account\'s primary domain or sub-domain.
    nonEditableAliases :: (Core.Maybe [Core.Text]),
    -- | Notes for the user.
    notes :: (Core.Maybe Core.Value),
    -- | The full path of the parent organization associated with the user. If the parent organization is the top-level, it is represented as a forward slash (@\/@).
    orgUnitPath :: (Core.Maybe Core.Text),
    -- | The list of organizations the user belongs to. The maximum allowed data size for this field is 10KB.
    organizations :: (Core.Maybe Core.Value),
    -- | User\'s password
    password :: (Core.Maybe Core.Text),
    -- | The list of the user\'s phone numbers. The maximum allowed data size for this field is 1KB.
    phones :: (Core.Maybe Core.Value),
    -- | The list of <https://www.opengroup.org/austin/papers/posix_faq.html POSIX> account information for the user.
    posixAccounts :: (Core.Maybe Core.Value),
    -- | The user\'s primary email address. This property is required in a request to create a user account. The @primaryEmail@ must be unique and cannot be an alias of another user.
    primaryEmail :: (Core.Maybe Core.Text),
    -- | Recovery email of the user.
    recoveryEmail :: (Core.Maybe Core.Text),
    -- | Recovery phone of the user. The phone number must be in the E.164 format, starting with the plus sign (+). Example: /+16506661212/.
    recoveryPhone :: (Core.Maybe Core.Text),
    -- | The list of the user\'s relationships to other users. The maximum allowed data size for this field is 2KB.
    relations :: (Core.Maybe Core.Value),
    -- | A list of SSH public keys.
    sshPublicKeys :: (Core.Maybe Core.Value),
    -- | Indicates if user is suspended.
    suspended :: (Core.Maybe Core.Bool),
    -- | Output only. Has the reason a user account is suspended either by the administrator or by Google at the time of suspension. The property is returned only if the @suspended@ property is @true@.
    suspensionReason :: (Core.Maybe Core.Text),
    -- | Output only. ETag of the user\'s photo (Read-only)
    thumbnailPhotoEtag :: (Core.Maybe Core.Text),
    -- | Output only. The URL of the user\'s profile photo. The URL might be temporary or private.
    thumbnailPhotoUrl :: (Core.Maybe Core.Text),
    -- | The user\'s websites. The maximum allowed data size for this field is 2KB.
    websites :: (Core.Maybe Core.Value)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'User' with the minimum fields required to make a request.
newUser ::
  User
newUser =
  User
    { addresses = Core.Nothing,
      agreedToTerms = Core.Nothing,
      aliases = Core.Nothing,
      archived = Core.Nothing,
      changePasswordAtNextLogin = Core.Nothing,
      creationTime = Core.Nothing,
      customSchemas = Core.Nothing,
      customerId = Core.Nothing,
      deletionTime = Core.Nothing,
      emails = Core.Nothing,
      etag = Core.Nothing,
      externalIds = Core.Nothing,
      gender = Core.Nothing,
      hashFunction = Core.Nothing,
      id = Core.Nothing,
      ims = Core.Nothing,
      includeInGlobalAddressList = Core.Nothing,
      ipWhitelisted = Core.Nothing,
      isAdmin = Core.Nothing,
      isDelegatedAdmin = Core.Nothing,
      isEnforcedIn2Sv = Core.Nothing,
      isEnrolledIn2Sv = Core.Nothing,
      isMailboxSetup = Core.Nothing,
      keywords = Core.Nothing,
      kind = "admin#directory#user",
      languages = Core.Nothing,
      lastLoginTime = Core.Nothing,
      locations = Core.Nothing,
      name = Core.Nothing,
      nonEditableAliases = Core.Nothing,
      notes = Core.Nothing,
      orgUnitPath = Core.Nothing,
      organizations = Core.Nothing,
      password = Core.Nothing,
      phones = Core.Nothing,
      posixAccounts = Core.Nothing,
      primaryEmail = Core.Nothing,
      recoveryEmail = Core.Nothing,
      recoveryPhone = Core.Nothing,
      relations = Core.Nothing,
      sshPublicKeys = Core.Nothing,
      suspended = Core.Nothing,
      suspensionReason = Core.Nothing,
      thumbnailPhotoEtag = Core.Nothing,
      thumbnailPhotoUrl = Core.Nothing,
      websites = Core.Nothing
    }

instance Core.FromJSON User where
  parseJSON =
    Core.withObject
      "User"
      ( \o ->
          User
            Core.<$> (o Core..:? "addresses")
            Core.<*> (o Core..:? "agreedToTerms")
            Core.<*> (o Core..:? "aliases")
            Core.<*> (o Core..:? "archived")
            Core.<*> (o Core..:? "changePasswordAtNextLogin")
            Core.<*> (o Core..:? "creationTime")
            Core.<*> (o Core..:? "customSchemas")
            Core.<*> (o Core..:? "customerId")
            Core.<*> (o Core..:? "deletionTime")
            Core.<*> (o Core..:? "emails")
            Core.<*> (o Core..:? "etag")
            Core.<*> (o Core..:? "externalIds")
            Core.<*> (o Core..:? "gender")
            Core.<*> (o Core..:? "hashFunction")
            Core.<*> (o Core..:? "id")
            Core.<*> (o Core..:? "ims")
            Core.<*> (o Core..:? "includeInGlobalAddressList")
            Core.<*> (o Core..:? "ipWhitelisted")
            Core.<*> (o Core..:? "isAdmin")
            Core.<*> (o Core..:? "isDelegatedAdmin")
            Core.<*> (o Core..:? "isEnforcedIn2Sv")
            Core.<*> (o Core..:? "isEnrolledIn2Sv")
            Core.<*> (o Core..:? "isMailboxSetup")
            Core.<*> (o Core..:? "keywords")
            Core.<*> (o Core..:? "kind" Core..!= "admin#directory#user")
            Core.<*> (o Core..:? "languages")
            Core.<*> (o Core..:? "lastLoginTime")
            Core.<*> (o Core..:? "locations")
            Core.<*> (o Core..:? "name")
            Core.<*> (o Core..:? "nonEditableAliases")
            Core.<*> (o Core..:? "notes")
            Core.<*> (o Core..:? "orgUnitPath")
            Core.<*> (o Core..:? "organizations")
            Core.<*> (o Core..:? "password")
            Core.<*> (o Core..:? "phones")
            Core.<*> (o Core..:? "posixAccounts")
            Core.<*> (o Core..:? "primaryEmail")
            Core.<*> (o Core..:? "recoveryEmail")
            Core.<*> (o Core..:? "recoveryPhone")
            Core.<*> (o Core..:? "relations")
            Core.<*> (o Core..:? "sshPublicKeys")
            Core.<*> (o Core..:? "suspended")
            Core.<*> (o Core..:? "suspensionReason")
            Core.<*> (o Core..:? "thumbnailPhotoEtag")
            Core.<*> (o Core..:? "thumbnailPhotoUrl")
            Core.<*> (o Core..:? "websites")
      )

instance Core.ToJSON User where
  toJSON User {..} =
    Core.object
      ( Core.catMaybes
          [ ("addresses" Core..=) Core.<$> addresses,
            ("agreedToTerms" Core..=) Core.<$> agreedToTerms,
            ("aliases" Core..=) Core.<$> aliases,
            ("archived" Core..=) Core.<$> archived,
            ("changePasswordAtNextLogin" Core..=)
              Core.<$> changePasswordAtNextLogin,
            ("creationTime" Core..=) Core.<$> creationTime,
            ("customSchemas" Core..=) Core.<$> customSchemas,
            ("customerId" Core..=) Core.<$> customerId,
            ("deletionTime" Core..=) Core.<$> deletionTime,
            ("emails" Core..=) Core.<$> emails,
            ("etag" Core..=) Core.<$> etag,
            ("externalIds" Core..=) Core.<$> externalIds,
            ("gender" Core..=) Core.<$> gender,
            ("hashFunction" Core..=) Core.<$> hashFunction,
            ("id" Core..=) Core.<$> id,
            ("ims" Core..=) Core.<$> ims,
            ("includeInGlobalAddressList" Core..=)
              Core.<$> includeInGlobalAddressList,
            ("ipWhitelisted" Core..=) Core.<$> ipWhitelisted,
            ("isAdmin" Core..=) Core.<$> isAdmin,
            ("isDelegatedAdmin" Core..=) Core.<$> isDelegatedAdmin,
            ("isEnforcedIn2Sv" Core..=) Core.<$> isEnforcedIn2Sv,
            ("isEnrolledIn2Sv" Core..=) Core.<$> isEnrolledIn2Sv,
            ("isMailboxSetup" Core..=) Core.<$> isMailboxSetup,
            ("keywords" Core..=) Core.<$> keywords,
            Core.Just ("kind" Core..= kind),
            ("languages" Core..=) Core.<$> languages,
            ("lastLoginTime" Core..=) Core.<$> lastLoginTime,
            ("locations" Core..=) Core.<$> locations,
            ("name" Core..=) Core.<$> name,
            ("nonEditableAliases" Core..=) Core.<$> nonEditableAliases,
            ("notes" Core..=) Core.<$> notes,
            ("orgUnitPath" Core..=) Core.<$> orgUnitPath,
            ("organizations" Core..=) Core.<$> organizations,
            ("password" Core..=) Core.<$> password,
            ("phones" Core..=) Core.<$> phones,
            ("posixAccounts" Core..=) Core.<$> posixAccounts,
            ("primaryEmail" Core..=) Core.<$> primaryEmail,
            ("recoveryEmail" Core..=) Core.<$> recoveryEmail,
            ("recoveryPhone" Core..=) Core.<$> recoveryPhone,
            ("relations" Core..=) Core.<$> relations,
            ("sshPublicKeys" Core..=) Core.<$> sshPublicKeys,
            ("suspended" Core..=) Core.<$> suspended,
            ("suspensionReason" Core..=) Core.<$> suspensionReason,
            ("thumbnailPhotoEtag" Core..=) Core.<$> thumbnailPhotoEtag,
            ("thumbnailPhotoUrl" Core..=) Core.<$> thumbnailPhotoUrl,
            ("websites" Core..=) Core.<$> websites
          ]
      )

-- | Custom fields of the user. The key is a @schema_name@ and its values are @\'field_name\': \'field_value\'@.
--
-- /See:/ 'newUser_CustomSchemas' smart constructor.
newtype User_CustomSchemas = User_CustomSchemas
  { additional :: (Core.HashMap Core.Text UserCustomProperties)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'User_CustomSchemas' with the minimum fields required to make a request.
newUser_CustomSchemas ::
  -- |  See 'additional'.
  Core.HashMap Core.Text UserCustomProperties ->
  User_CustomSchemas
newUser_CustomSchemas additional =
  User_CustomSchemas {additional = additional}

instance Core.FromJSON User_CustomSchemas where
  parseJSON =
    Core.withObject
      "User_CustomSchemas"
      (\o -> User_CustomSchemas Core.<$> (Core.parseJSONObject o))

instance Core.ToJSON User_CustomSchemas where
  toJSON User_CustomSchemas {..} = Core.toJSON additional

-- | JSON template for About (notes) of a user in Directory API.
--
-- /See:/ 'newUserAbout' smart constructor.
data UserAbout = UserAbout
  { -- | About entry can have a type which indicates the content type. It can either be plain or html. By default, notes contents are assumed to contain plain text.
    contentType :: (Core.Maybe Core.Text),
    -- | Actual value of notes.
    value :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'UserAbout' with the minimum fields required to make a request.
newUserAbout ::
  UserAbout
newUserAbout =
  UserAbout {contentType = Core.Nothing, value = Core.Nothing}

instance Core.FromJSON UserAbout where
  parseJSON =
    Core.withObject
      "UserAbout"
      ( \o ->
          UserAbout
            Core.<$> (o Core..:? "contentType")
            Core.<*> (o Core..:? "value")
      )

instance Core.ToJSON UserAbout where
  toJSON UserAbout {..} =
    Core.object
      ( Core.catMaybes
          [ ("contentType" Core..=) Core.<$> contentType,
            ("value" Core..=) Core.<$> value
          ]
      )

-- | JSON template for address.
--
-- /See:/ 'newUserAddress' smart constructor.
data UserAddress = UserAddress
  { -- | Country.
    country :: (Core.Maybe Core.Text),
    -- | Country code.
    countryCode :: (Core.Maybe Core.Text),
    -- | Custom type.
    customType :: (Core.Maybe Core.Text),
    -- | Extended Address.
    extendedAddress :: (Core.Maybe Core.Text),
    -- | Formatted address.
    formatted :: (Core.Maybe Core.Text),
    -- | Locality.
    locality :: (Core.Maybe Core.Text),
    -- | Other parts of address.
    poBox :: (Core.Maybe Core.Text),
    -- | Postal code.
    postalCode :: (Core.Maybe Core.Text),
    -- | If this is user\'s primary address. Only one entry could be marked as primary.
    primary :: (Core.Maybe Core.Bool),
    -- | Region.
    region :: (Core.Maybe Core.Text),
    -- | User supplied address was structured. Structured addresses are NOT supported at this time. You might be able to write structured addresses but any values will eventually be clobbered.
    sourceIsStructured :: (Core.Maybe Core.Bool),
    -- | Street.
    streetAddress :: (Core.Maybe Core.Text),
    -- | Each entry can have a type which indicates standard values of that entry. For example address could be of home work etc. In addition to the standard type an entry can have a custom type and can take any value. Such type should have the CUSTOM value as type and also have a customType value.
    type' :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'UserAddress' with the minimum fields required to make a request.
newUserAddress ::
  UserAddress
newUserAddress =
  UserAddress
    { country = Core.Nothing,
      countryCode = Core.Nothing,
      customType = Core.Nothing,
      extendedAddress = Core.Nothing,
      formatted = Core.Nothing,
      locality = Core.Nothing,
      poBox = Core.Nothing,
      postalCode = Core.Nothing,
      primary = Core.Nothing,
      region = Core.Nothing,
      sourceIsStructured = Core.Nothing,
      streetAddress = Core.Nothing,
      type' = Core.Nothing
    }

instance Core.FromJSON UserAddress where
  parseJSON =
    Core.withObject
      "UserAddress"
      ( \o ->
          UserAddress
            Core.<$> (o Core..:? "country")
            Core.<*> (o Core..:? "countryCode")
            Core.<*> (o Core..:? "customType")
            Core.<*> (o Core..:? "extendedAddress")
            Core.<*> (o Core..:? "formatted")
            Core.<*> (o Core..:? "locality")
            Core.<*> (o Core..:? "poBox")
            Core.<*> (o Core..:? "postalCode")
            Core.<*> (o Core..:? "primary")
            Core.<*> (o Core..:? "region")
            Core.<*> (o Core..:? "sourceIsStructured")
            Core.<*> (o Core..:? "streetAddress")
            Core.<*> (o Core..:? "type")
      )

instance Core.ToJSON UserAddress where
  toJSON UserAddress {..} =
    Core.object
      ( Core.catMaybes
          [ ("country" Core..=) Core.<$> country,
            ("countryCode" Core..=) Core.<$> countryCode,
            ("customType" Core..=) Core.<$> customType,
            ("extendedAddress" Core..=) Core.<$> extendedAddress,
            ("formatted" Core..=) Core.<$> formatted,
            ("locality" Core..=) Core.<$> locality,
            ("poBox" Core..=) Core.<$> poBox,
            ("postalCode" Core..=) Core.<$> postalCode,
            ("primary" Core..=) Core.<$> primary,
            ("region" Core..=) Core.<$> region,
            ("sourceIsStructured" Core..=) Core.<$> sourceIsStructured,
            ("streetAddress" Core..=) Core.<$> streetAddress,
            ("type" Core..=) Core.<$> type'
          ]
      )

-- | The Directory API manages aliases, which are alternative email addresses.
--
-- /See:/ 'newUserAlias' smart constructor.
data UserAlias = UserAlias
  { -- | The alias email address.
    alias :: (Core.Maybe Core.Text),
    -- | ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | The unique ID for the user.
    id :: (Core.Maybe Core.Text),
    -- | The type of the API resource. For Alias resources, the value is @admin#directory#alias@.
    kind :: (Core.Maybe Core.Text),
    -- | The user\'s primary email address.
    primaryEmail :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'UserAlias' with the minimum fields required to make a request.
newUserAlias ::
  UserAlias
newUserAlias =
  UserAlias
    { alias = Core.Nothing,
      etag = Core.Nothing,
      id = Core.Nothing,
      kind = Core.Nothing,
      primaryEmail = Core.Nothing
    }

instance Core.FromJSON UserAlias where
  parseJSON =
    Core.withObject
      "UserAlias"
      ( \o ->
          UserAlias
            Core.<$> (o Core..:? "alias")
            Core.<*> (o Core..:? "etag")
            Core.<*> (o Core..:? "id")
            Core.<*> (o Core..:? "kind")
            Core.<*> (o Core..:? "primaryEmail")
      )

instance Core.ToJSON UserAlias where
  toJSON UserAlias {..} =
    Core.object
      ( Core.catMaybes
          [ ("alias" Core..=) Core.<$> alias,
            ("etag" Core..=) Core.<$> etag,
            ("id" Core..=) Core.<$> id,
            ("kind" Core..=) Core.<$> kind,
            ("primaryEmail" Core..=) Core.<$> primaryEmail
          ]
      )

-- | JSON template for a set of custom properties (i.e. all fields in a particular schema)
--
-- /See:/ 'newUserCustomProperties' smart constructor.
newtype UserCustomProperties = UserCustomProperties
  { additional :: (Core.HashMap Core.Text Core.Value)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'UserCustomProperties' with the minimum fields required to make a request.
newUserCustomProperties ::
  -- |  See 'additional'.
  Core.HashMap Core.Text Core.Value ->
  UserCustomProperties
newUserCustomProperties additional =
  UserCustomProperties {additional = additional}

instance Core.FromJSON UserCustomProperties where
  parseJSON =
    Core.withObject
      "UserCustomProperties"
      (\o -> UserCustomProperties Core.<$> (Core.parseJSONObject o))

instance Core.ToJSON UserCustomProperties where
  toJSON UserCustomProperties {..} = Core.toJSON additional

-- | JSON template for an email.
--
-- /See:/ 'newUserEmail' smart constructor.
data UserEmail = UserEmail
  { -- | Email id of the user.
    address :: (Core.Maybe Core.Text),
    -- | Custom Type.
    customType :: (Core.Maybe Core.Text),
    -- | If this is user\'s primary email. Only one entry could be marked as primary.
    primary :: (Core.Maybe Core.Bool),
    -- | Public Key Encryption Certificates. Current limit: 1 per email address, and 5 per user.
    publicKeyEncryptionCertificates :: (Core.Maybe UserEmail_Public_key_encryption_certificates),
    -- | Each entry can have a type which indicates standard types of that entry. For example email could be of home, work etc. In addition to the standard type, an entry can have a custom type and can take any value Such types should have the CUSTOM value as type and also have a customType value.
    type' :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'UserEmail' with the minimum fields required to make a request.
newUserEmail ::
  UserEmail
newUserEmail =
  UserEmail
    { address = Core.Nothing,
      customType = Core.Nothing,
      primary = Core.Nothing,
      publicKeyEncryptionCertificates = Core.Nothing,
      type' = Core.Nothing
    }

instance Core.FromJSON UserEmail where
  parseJSON =
    Core.withObject
      "UserEmail"
      ( \o ->
          UserEmail
            Core.<$> (o Core..:? "address")
            Core.<*> (o Core..:? "customType")
            Core.<*> (o Core..:? "primary")
            Core.<*> (o Core..:? "public_key_encryption_certificates")
            Core.<*> (o Core..:? "type")
      )

instance Core.ToJSON UserEmail where
  toJSON UserEmail {..} =
    Core.object
      ( Core.catMaybes
          [ ("address" Core..=) Core.<$> address,
            ("customType" Core..=) Core.<$> customType,
            ("primary" Core..=) Core.<$> primary,
            ("public_key_encryption_certificates" Core..=)
              Core.<$> publicKeyEncryptionCertificates,
            ("type" Core..=) Core.<$> type'
          ]
      )

-- | Public Key Encryption Certificates. Current limit: 1 per email address, and 5 per user.
--
-- /See:/ 'newUserEmail_Public_key_encryption_certificates' smart constructor.
data UserEmail_Public_key_encryption_certificates = UserEmail_Public_key_encryption_certificates
  { -- | X.509 encryption certificate in @PEM@ format. Must only be an end-entity (leaf) certificate.
    certificate :: (Core.Maybe Core.Text),
    -- | Whether this is the default certificate for the given email address.
    isDefault :: (Core.Maybe Core.Bool),
    -- | Denotes the certificate\'s state in its lifecycle. Possible values are @not_yet_validated@, @valid@, @invalid@, @expired@, and @revoked@.
    state :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'UserEmail_Public_key_encryption_certificates' with the minimum fields required to make a request.
newUserEmail_Public_key_encryption_certificates ::
  UserEmail_Public_key_encryption_certificates
newUserEmail_Public_key_encryption_certificates =
  UserEmail_Public_key_encryption_certificates
    { certificate =
        Core.Nothing,
      isDefault = Core.Nothing,
      state = Core.Nothing
    }

instance Core.FromJSON UserEmail_Public_key_encryption_certificates where
  parseJSON =
    Core.withObject
      "UserEmail_Public_key_encryption_certificates"
      ( \o ->
          UserEmail_Public_key_encryption_certificates
            Core.<$> (o Core..:? "certificate")
            Core.<*> (o Core..:? "is_default")
            Core.<*> (o Core..:? "state")
      )

instance Core.ToJSON UserEmail_Public_key_encryption_certificates where
  toJSON UserEmail_Public_key_encryption_certificates {..} =
    Core.object
      ( Core.catMaybes
          [ ("certificate" Core..=) Core.<$> certificate,
            ("is_default" Core..=) Core.<$> isDefault,
            ("state" Core..=) Core.<$> state
          ]
      )

-- | JSON template for an externalId entry.
--
-- /See:/ 'newUserExternalId' smart constructor.
data UserExternalId = UserExternalId
  { -- | Custom type.
    customType :: (Core.Maybe Core.Text),
    -- | The type of the Id.
    type' :: (Core.Maybe Core.Text),
    -- | The value of the id.
    value :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'UserExternalId' with the minimum fields required to make a request.
newUserExternalId ::
  UserExternalId
newUserExternalId =
  UserExternalId
    { customType = Core.Nothing,
      type' = Core.Nothing,
      value = Core.Nothing
    }

instance Core.FromJSON UserExternalId where
  parseJSON =
    Core.withObject
      "UserExternalId"
      ( \o ->
          UserExternalId
            Core.<$> (o Core..:? "customType")
            Core.<*> (o Core..:? "type")
            Core.<*> (o Core..:? "value")
      )

instance Core.ToJSON UserExternalId where
  toJSON UserExternalId {..} =
    Core.object
      ( Core.catMaybes
          [ ("customType" Core..=) Core.<$> customType,
            ("type" Core..=) Core.<$> type',
            ("value" Core..=) Core.<$> value
          ]
      )

--
-- /See:/ 'newUserGender' smart constructor.
data UserGender = UserGender
  { -- | AddressMeAs. A human-readable string containing the proper way to refer to the profile owner by humans for example he\/him\/his or they\/them\/their.
    addressMeAs :: (Core.Maybe Core.Text),
    -- | Custom gender.
    customGender :: (Core.Maybe Core.Text),
    -- | Gender.
    type' :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'UserGender' with the minimum fields required to make a request.
newUserGender ::
  UserGender
newUserGender =
  UserGender
    { addressMeAs = Core.Nothing,
      customGender = Core.Nothing,
      type' = Core.Nothing
    }

instance Core.FromJSON UserGender where
  parseJSON =
    Core.withObject
      "UserGender"
      ( \o ->
          UserGender
            Core.<$> (o Core..:? "addressMeAs")
            Core.<*> (o Core..:? "customGender")
            Core.<*> (o Core..:? "type")
      )

instance Core.ToJSON UserGender where
  toJSON UserGender {..} =
    Core.object
      ( Core.catMaybes
          [ ("addressMeAs" Core..=) Core.<$> addressMeAs,
            ("customGender" Core..=) Core.<$> customGender,
            ("type" Core..=) Core.<$> type'
          ]
      )

-- | JSON template for instant messenger of an user.
--
-- /See:/ 'newUserIm' smart constructor.
data UserIm = UserIm
  { -- | Custom protocol.
    customProtocol :: (Core.Maybe Core.Text),
    -- | Custom type.
    customType :: (Core.Maybe Core.Text),
    -- | Instant messenger id.
    im :: (Core.Maybe Core.Text),
    -- | If this is user\'s primary im. Only one entry could be marked as primary.
    primary :: (Core.Maybe Core.Bool),
    -- | Protocol used in the instant messenger. It should be one of the values from ImProtocolTypes map. Similar to type it can take a CUSTOM value and specify the custom name in customProtocol field.
    protocol :: (Core.Maybe Core.Text),
    -- | Each entry can have a type which indicates standard types of that entry. For example instant messengers could be of home work etc. In addition to the standard type an entry can have a custom type and can take any value. Such types should have the CUSTOM value as type and also have a customType value.
    type' :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'UserIm' with the minimum fields required to make a request.
newUserIm ::
  UserIm
newUserIm =
  UserIm
    { customProtocol = Core.Nothing,
      customType = Core.Nothing,
      im = Core.Nothing,
      primary = Core.Nothing,
      protocol = Core.Nothing,
      type' = Core.Nothing
    }

instance Core.FromJSON UserIm where
  parseJSON =
    Core.withObject
      "UserIm"
      ( \o ->
          UserIm
            Core.<$> (o Core..:? "customProtocol")
            Core.<*> (o Core..:? "customType")
            Core.<*> (o Core..:? "im")
            Core.<*> (o Core..:? "primary")
            Core.<*> (o Core..:? "protocol")
            Core.<*> (o Core..:? "type")
      )

instance Core.ToJSON UserIm where
  toJSON UserIm {..} =
    Core.object
      ( Core.catMaybes
          [ ("customProtocol" Core..=) Core.<$> customProtocol,
            ("customType" Core..=) Core.<$> customType,
            ("im" Core..=) Core.<$> im,
            ("primary" Core..=) Core.<$> primary,
            ("protocol" Core..=) Core.<$> protocol,
            ("type" Core..=) Core.<$> type'
          ]
      )

-- | JSON template for a keyword entry.
--
-- /See:/ 'newUserKeyword' smart constructor.
data UserKeyword = UserKeyword
  { -- | Custom Type.
    customType :: (Core.Maybe Core.Text),
    -- | Each entry can have a type which indicates standard type of that entry. For example keyword could be of type occupation or outlook. In addition to the standard type an entry can have a custom type and can give it any name. Such types should have the CUSTOM value as type and also have a customType value.
    type' :: (Core.Maybe Core.Text),
    -- | Keyword.
    value :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'UserKeyword' with the minimum fields required to make a request.
newUserKeyword ::
  UserKeyword
newUserKeyword =
  UserKeyword
    { customType = Core.Nothing,
      type' = Core.Nothing,
      value = Core.Nothing
    }

instance Core.FromJSON UserKeyword where
  parseJSON =
    Core.withObject
      "UserKeyword"
      ( \o ->
          UserKeyword
            Core.<$> (o Core..:? "customType")
            Core.<*> (o Core..:? "type")
            Core.<*> (o Core..:? "value")
      )

instance Core.ToJSON UserKeyword where
  toJSON UserKeyword {..} =
    Core.object
      ( Core.catMaybes
          [ ("customType" Core..=) Core.<$> customType,
            ("type" Core..=) Core.<$> type',
            ("value" Core..=) Core.<$> value
          ]
      )

-- | JSON template for a language entry.
--
-- /See:/ 'newUserLanguage' smart constructor.
data UserLanguage = UserLanguage
  { -- | Other language. User can provide their own language name if there is no corresponding ISO 639 language code. If this is set, @languageCode@ can\'t be set.
    customLanguage :: (Core.Maybe Core.Text),
    -- | ISO 639 string representation of a language. See </admin-sdk/directory/v1/languages Language Codes> for the list of supported codes. Valid language codes outside the supported set will be accepted by the API but may lead to unexpected behavior. Illegal values cause @SchemaException@. If this is set, @customLanguage@ can\'t be set.
    languageCode :: (Core.Maybe Core.Text),
    -- | Optional. If present, controls whether the specified @languageCode@ is the user\'s preferred language. If @customLanguage@ is set, this can\'t be set. Allowed values are @preferred@ and @not_preferred@.
    preference :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'UserLanguage' with the minimum fields required to make a request.
newUserLanguage ::
  UserLanguage
newUserLanguage =
  UserLanguage
    { customLanguage = Core.Nothing,
      languageCode = Core.Nothing,
      preference = Core.Nothing
    }

instance Core.FromJSON UserLanguage where
  parseJSON =
    Core.withObject
      "UserLanguage"
      ( \o ->
          UserLanguage
            Core.<$> (o Core..:? "customLanguage")
            Core.<*> (o Core..:? "languageCode")
            Core.<*> (o Core..:? "preference")
      )

instance Core.ToJSON UserLanguage where
  toJSON UserLanguage {..} =
    Core.object
      ( Core.catMaybes
          [ ("customLanguage" Core..=) Core.<$> customLanguage,
            ("languageCode" Core..=) Core.<$> languageCode,
            ("preference" Core..=) Core.<$> preference
          ]
      )

-- | JSON template for a location entry.
--
-- /See:/ 'newUserLocation' smart constructor.
data UserLocation = UserLocation
  { -- | Textual location. This is most useful for display purposes to concisely describe the location. For example \'Mountain View, CA\', \'Near Seattle\', \'US-NYC-9TH 9A209A.\'\'
    area :: (Core.Maybe Core.Text),
    -- | Building Identifier.
    buildingId :: (Core.Maybe Core.Text),
    -- | Custom Type.
    customType :: (Core.Maybe Core.Text),
    -- | Most specific textual code of individual desk location.
    deskCode :: (Core.Maybe Core.Text),
    -- | Floor name\/number.
    floorName :: (Core.Maybe Core.Text),
    -- | Floor section. More specific location within the floor. For example if a floor is divided into sections \'A\', \'B\' and \'C\' this field would identify one of those values.
    floorSection :: (Core.Maybe Core.Text),
    -- | Each entry can have a type which indicates standard types of that entry. For example location could be of types default and desk. In addition to standard type an entry can have a custom type and can give it any name. Such types should have \'custom\' as type and also have a customType value.
    type' :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'UserLocation' with the minimum fields required to make a request.
newUserLocation ::
  UserLocation
newUserLocation =
  UserLocation
    { area = Core.Nothing,
      buildingId = Core.Nothing,
      customType = Core.Nothing,
      deskCode = Core.Nothing,
      floorName = Core.Nothing,
      floorSection = Core.Nothing,
      type' = Core.Nothing
    }

instance Core.FromJSON UserLocation where
  parseJSON =
    Core.withObject
      "UserLocation"
      ( \o ->
          UserLocation
            Core.<$> (o Core..:? "area")
            Core.<*> (o Core..:? "buildingId")
            Core.<*> (o Core..:? "customType")
            Core.<*> (o Core..:? "deskCode")
            Core.<*> (o Core..:? "floorName")
            Core.<*> (o Core..:? "floorSection")
            Core.<*> (o Core..:? "type")
      )

instance Core.ToJSON UserLocation where
  toJSON UserLocation {..} =
    Core.object
      ( Core.catMaybes
          [ ("area" Core..=) Core.<$> area,
            ("buildingId" Core..=) Core.<$> buildingId,
            ("customType" Core..=) Core.<$> customType,
            ("deskCode" Core..=) Core.<$> deskCode,
            ("floorName" Core..=) Core.<$> floorName,
            ("floorSection" Core..=) Core.<$> floorSection,
            ("type" Core..=) Core.<$> type'
          ]
      )

--
-- /See:/ 'newUserMakeAdmin' smart constructor.
newtype UserMakeAdmin = UserMakeAdmin
  { -- | Indicates the administrator status of the user.
    status :: (Core.Maybe Core.Bool)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'UserMakeAdmin' with the minimum fields required to make a request.
newUserMakeAdmin ::
  UserMakeAdmin
newUserMakeAdmin = UserMakeAdmin {status = Core.Nothing}

instance Core.FromJSON UserMakeAdmin where
  parseJSON =
    Core.withObject
      "UserMakeAdmin"
      (\o -> UserMakeAdmin Core.<$> (o Core..:? "status"))

instance Core.ToJSON UserMakeAdmin where
  toJSON UserMakeAdmin {..} =
    Core.object (Core.catMaybes [("status" Core..=) Core.<$> status])

--
-- /See:/ 'newUserName' smart constructor.
data UserName = UserName
  { -- | The user\'s display name. Limit: 256 characters.
    displayName :: (Core.Maybe Core.Text),
    -- | The user\'s last name. Required when creating a user account.
    familyName :: (Core.Maybe Core.Text),
    -- | The user\'s full name formed by concatenating the first and last name values.
    fullName :: (Core.Maybe Core.Text),
    -- | The user\'s first name. Required when creating a user account.
    givenName :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'UserName' with the minimum fields required to make a request.
newUserName ::
  UserName
newUserName =
  UserName
    { displayName = Core.Nothing,
      familyName = Core.Nothing,
      fullName = Core.Nothing,
      givenName = Core.Nothing
    }

instance Core.FromJSON UserName where
  parseJSON =
    Core.withObject
      "UserName"
      ( \o ->
          UserName
            Core.<$> (o Core..:? "displayName")
            Core.<*> (o Core..:? "familyName")
            Core.<*> (o Core..:? "fullName")
            Core.<*> (o Core..:? "givenName")
      )

instance Core.ToJSON UserName where
  toJSON UserName {..} =
    Core.object
      ( Core.catMaybes
          [ ("displayName" Core..=) Core.<$> displayName,
            ("familyName" Core..=) Core.<$> familyName,
            ("fullName" Core..=) Core.<$> fullName,
            ("givenName" Core..=) Core.<$> givenName
          ]
      )

-- | JSON template for an organization entry.
--
-- /See:/ 'newUserOrganization' smart constructor.
data UserOrganization = UserOrganization
  { -- | The cost center of the users department.
    costCenter :: (Core.Maybe Core.Text),
    -- | Custom type.
    customType :: (Core.Maybe Core.Text),
    -- | Department within the organization.
    department :: (Core.Maybe Core.Text),
    -- | Description of the organization.
    description :: (Core.Maybe Core.Text),
    -- | The domain to which the organization belongs to.
    domain :: (Core.Maybe Core.Text),
    -- | The full-time equivalent millipercent within the organization (100000 = 100%).
    fullTimeEquivalent :: (Core.Maybe Core.Int32),
    -- | Location of the organization. This need not be fully qualified address.
    location :: (Core.Maybe Core.Text),
    -- | Name of the organization
    name :: (Core.Maybe Core.Text),
    -- | If it user\'s primary organization.
    primary :: (Core.Maybe Core.Bool),
    -- | Symbol of the organization.
    symbol :: (Core.Maybe Core.Text),
    -- | Title (designation) of the user in the organization.
    title :: (Core.Maybe Core.Text),
    -- | Each entry can have a type which indicates standard types of that entry. For example organization could be of school work etc. In addition to the standard type an entry can have a custom type and can give it any name. Such types should have the CUSTOM value as type and also have a CustomType value.
    type' :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'UserOrganization' with the minimum fields required to make a request.
newUserOrganization ::
  UserOrganization
newUserOrganization =
  UserOrganization
    { costCenter = Core.Nothing,
      customType = Core.Nothing,
      department = Core.Nothing,
      description = Core.Nothing,
      domain = Core.Nothing,
      fullTimeEquivalent = Core.Nothing,
      location = Core.Nothing,
      name = Core.Nothing,
      primary = Core.Nothing,
      symbol = Core.Nothing,
      title = Core.Nothing,
      type' = Core.Nothing
    }

instance Core.FromJSON UserOrganization where
  parseJSON =
    Core.withObject
      "UserOrganization"
      ( \o ->
          UserOrganization
            Core.<$> (o Core..:? "costCenter")
            Core.<*> (o Core..:? "customType")
            Core.<*> (o Core..:? "department")
            Core.<*> (o Core..:? "description")
            Core.<*> (o Core..:? "domain")
            Core.<*> (o Core..:? "fullTimeEquivalent")
            Core.<*> (o Core..:? "location")
            Core.<*> (o Core..:? "name")
            Core.<*> (o Core..:? "primary")
            Core.<*> (o Core..:? "symbol")
            Core.<*> (o Core..:? "title")
            Core.<*> (o Core..:? "type")
      )

instance Core.ToJSON UserOrganization where
  toJSON UserOrganization {..} =
    Core.object
      ( Core.catMaybes
          [ ("costCenter" Core..=) Core.<$> costCenter,
            ("customType" Core..=) Core.<$> customType,
            ("department" Core..=) Core.<$> department,
            ("description" Core..=) Core.<$> description,
            ("domain" Core..=) Core.<$> domain,
            ("fullTimeEquivalent" Core..=) Core.<$> fullTimeEquivalent,
            ("location" Core..=) Core.<$> location,
            ("name" Core..=) Core.<$> name,
            ("primary" Core..=) Core.<$> primary,
            ("symbol" Core..=) Core.<$> symbol,
            ("title" Core..=) Core.<$> title,
            ("type" Core..=) Core.<$> type'
          ]
      )

-- | JSON template for a phone entry.
--
-- /See:/ 'newUserPhone' smart constructor.
data UserPhone = UserPhone
  { -- | Custom Type.
    customType :: (Core.Maybe Core.Text),
    -- | If this is user\'s primary phone or not.
    primary :: (Core.Maybe Core.Bool),
    -- | Each entry can have a type which indicates standard types of that entry. For example phone could be of home_fax work mobile etc. In addition to the standard type an entry can have a custom type and can give it any name. Such types should have the CUSTOM value as type and also have a customType value.
    type' :: (Core.Maybe Core.Text),
    -- | Phone number.
    value :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'UserPhone' with the minimum fields required to make a request.
newUserPhone ::
  UserPhone
newUserPhone =
  UserPhone
    { customType = Core.Nothing,
      primary = Core.Nothing,
      type' = Core.Nothing,
      value = Core.Nothing
    }

instance Core.FromJSON UserPhone where
  parseJSON =
    Core.withObject
      "UserPhone"
      ( \o ->
          UserPhone
            Core.<$> (o Core..:? "customType")
            Core.<*> (o Core..:? "primary")
            Core.<*> (o Core..:? "type")
            Core.<*> (o Core..:? "value")
      )

instance Core.ToJSON UserPhone where
  toJSON UserPhone {..} =
    Core.object
      ( Core.catMaybes
          [ ("customType" Core..=) Core.<$> customType,
            ("primary" Core..=) Core.<$> primary,
            ("type" Core..=) Core.<$> type',
            ("value" Core..=) Core.<$> value
          ]
      )

--
-- /See:/ 'newUserPhoto' smart constructor.
data UserPhoto = UserPhoto
  { -- | ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | Height of the photo in pixels.
    height :: (Core.Maybe Core.Int32),
    -- | The ID the API uses to uniquely identify the user.
    id :: (Core.Maybe Core.Text),
    -- | The type of the API resource. For Photo resources, this is @admin#directory#user#photo@.
    kind :: Core.Text,
    -- | The MIME type of the photo. Allowed values are @JPEG@, @PNG@, @GIF@, @BMP@, @TIFF@, and web-safe base64 encoding.
    mimeType :: (Core.Maybe Core.Text),
    -- | The user photo\'s upload data in <https://en.wikipedia.org/wiki/Base64#URL_applications web-safe Base64> format in bytes. This means: * The slash (\/) character is replaced with the underscore (_) character. * The plus sign (+) character is replaced with the hyphen (-) character. * The equals sign (=) character is replaced with the asterisk (/). / For padding, the period (.) character is used instead of the RFC-4648 baseURL definition which uses the equals sign (=) for padding. This is done to simplify URL-parsing. * Whatever the size of the photo being uploaded, the API downsizes it to 96x96 pixels.
    photoData :: (Core.Maybe Core.Base64),
    -- | The user\'s primary email address.
    primaryEmail :: (Core.Maybe Core.Text),
    -- | Width of the photo in pixels.
    width :: (Core.Maybe Core.Int32)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'UserPhoto' with the minimum fields required to make a request.
newUserPhoto ::
  UserPhoto
newUserPhoto =
  UserPhoto
    { etag = Core.Nothing,
      height = Core.Nothing,
      id = Core.Nothing,
      kind = "admin#directory#user#photo",
      mimeType = Core.Nothing,
      photoData = Core.Nothing,
      primaryEmail = Core.Nothing,
      width = Core.Nothing
    }

instance Core.FromJSON UserPhoto where
  parseJSON =
    Core.withObject
      "UserPhoto"
      ( \o ->
          UserPhoto
            Core.<$> (o Core..:? "etag")
            Core.<*> (o Core..:? "height")
            Core.<*> (o Core..:? "id")
            Core.<*> (o Core..:? "kind" Core..!= "admin#directory#user#photo")
            Core.<*> (o Core..:? "mimeType")
            Core.<*> (o Core..:? "photoData")
            Core.<*> (o Core..:? "primaryEmail")
            Core.<*> (o Core..:? "width")
      )

instance Core.ToJSON UserPhoto where
  toJSON UserPhoto {..} =
    Core.object
      ( Core.catMaybes
          [ ("etag" Core..=) Core.<$> etag,
            ("height" Core..=) Core.<$> height,
            ("id" Core..=) Core.<$> id,
            Core.Just ("kind" Core..= kind),
            ("mimeType" Core..=) Core.<$> mimeType,
            ("photoData" Core..=) Core.<$> photoData,
            ("primaryEmail" Core..=) Core.<$> primaryEmail,
            ("width" Core..=) Core.<$> width
          ]
      )

-- | JSON template for a POSIX account entry.
--
-- /See:/ 'newUserPosixAccount' smart constructor.
data UserPosixAccount = UserPosixAccount
  { -- | A POSIX account field identifier.
    accountId :: (Core.Maybe Core.Text),
    -- | The GECOS (user information) for this account.
    gecos :: (Core.Maybe Core.Text),
    -- | The default group ID.
    gid :: (Core.Maybe Core.Word64),
    -- | The path to the home directory for this account.
    homeDirectory :: (Core.Maybe Core.Text),
    -- | The operating system type for this account.
    operatingSystemType :: (Core.Maybe Core.Text),
    -- | If this is user\'s primary account within the SystemId.
    primary :: (Core.Maybe Core.Bool),
    -- | The path to the login shell for this account.
    shell :: (Core.Maybe Core.Text),
    -- | System identifier for which account Username or Uid apply to.
    systemId :: (Core.Maybe Core.Text),
    -- | The POSIX compliant user ID.
    uid :: (Core.Maybe Core.Word64),
    -- | The username of the account.
    username :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'UserPosixAccount' with the minimum fields required to make a request.
newUserPosixAccount ::
  UserPosixAccount
newUserPosixAccount =
  UserPosixAccount
    { accountId = Core.Nothing,
      gecos = Core.Nothing,
      gid = Core.Nothing,
      homeDirectory = Core.Nothing,
      operatingSystemType = Core.Nothing,
      primary = Core.Nothing,
      shell = Core.Nothing,
      systemId = Core.Nothing,
      uid = Core.Nothing,
      username = Core.Nothing
    }

instance Core.FromJSON UserPosixAccount where
  parseJSON =
    Core.withObject
      "UserPosixAccount"
      ( \o ->
          UserPosixAccount
            Core.<$> (o Core..:? "accountId")
            Core.<*> (o Core..:? "gecos")
            Core.<*> (o Core..:? "gid" Core.<&> Core.fmap Core.fromAsText)
            Core.<*> (o Core..:? "homeDirectory")
            Core.<*> (o Core..:? "operatingSystemType")
            Core.<*> (o Core..:? "primary")
            Core.<*> (o Core..:? "shell")
            Core.<*> (o Core..:? "systemId")
            Core.<*> (o Core..:? "uid" Core.<&> Core.fmap Core.fromAsText)
            Core.<*> (o Core..:? "username")
      )

instance Core.ToJSON UserPosixAccount where
  toJSON UserPosixAccount {..} =
    Core.object
      ( Core.catMaybes
          [ ("accountId" Core..=) Core.<$> accountId,
            ("gecos" Core..=) Core.<$> gecos,
            ("gid" Core..=) Core.. Core.AsText Core.<$> gid,
            ("homeDirectory" Core..=) Core.<$> homeDirectory,
            ("operatingSystemType" Core..=) Core.<$> operatingSystemType,
            ("primary" Core..=) Core.<$> primary,
            ("shell" Core..=) Core.<$> shell,
            ("systemId" Core..=) Core.<$> systemId,
            ("uid" Core..=) Core.. Core.AsText Core.<$> uid,
            ("username" Core..=) Core.<$> username
          ]
      )

-- | JSON template for a relation entry.
--
-- /See:/ 'newUserRelation' smart constructor.
data UserRelation = UserRelation
  { -- | Custom Type.
    customType :: (Core.Maybe Core.Text),
    -- | The relation of the user. Some of the possible values are mother father sister brother manager assistant partner.
    type' :: (Core.Maybe Core.Text),
    -- | The name of the relation.
    value :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'UserRelation' with the minimum fields required to make a request.
newUserRelation ::
  UserRelation
newUserRelation =
  UserRelation
    { customType = Core.Nothing,
      type' = Core.Nothing,
      value = Core.Nothing
    }

instance Core.FromJSON UserRelation where
  parseJSON =
    Core.withObject
      "UserRelation"
      ( \o ->
          UserRelation
            Core.<$> (o Core..:? "customType")
            Core.<*> (o Core..:? "type")
            Core.<*> (o Core..:? "value")
      )

instance Core.ToJSON UserRelation where
  toJSON UserRelation {..} =
    Core.object
      ( Core.catMaybes
          [ ("customType" Core..=) Core.<$> customType,
            ("type" Core..=) Core.<$> type',
            ("value" Core..=) Core.<$> value
          ]
      )

-- | JSON template for a POSIX account entry.
--
-- /See:/ 'newUserSshPublicKey' smart constructor.
data UserSshPublicKey = UserSshPublicKey
  { -- | An expiration time in microseconds since epoch.
    expirationTimeUsec :: (Core.Maybe Core.Int64),
    -- | A SHA-256 fingerprint of the SSH public key. (Read-only)
    fingerprint :: (Core.Maybe Core.Text),
    -- | An SSH public key.
    key :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'UserSshPublicKey' with the minimum fields required to make a request.
newUserSshPublicKey ::
  UserSshPublicKey
newUserSshPublicKey =
  UserSshPublicKey
    { expirationTimeUsec = Core.Nothing,
      fingerprint = Core.Nothing,
      key = Core.Nothing
    }

instance Core.FromJSON UserSshPublicKey where
  parseJSON =
    Core.withObject
      "UserSshPublicKey"
      ( \o ->
          UserSshPublicKey
            Core.<$> ( o
                         Core..:? "expirationTimeUsec"
                         Core.<&> Core.fmap Core.fromAsText
                     )
            Core.<*> (o Core..:? "fingerprint")
            Core.<*> (o Core..:? "key")
      )

instance Core.ToJSON UserSshPublicKey where
  toJSON UserSshPublicKey {..} =
    Core.object
      ( Core.catMaybes
          [ ("expirationTimeUsec" Core..=)
              Core.. Core.AsText
              Core.<$> expirationTimeUsec,
            ("fingerprint" Core..=) Core.<$> fingerprint,
            ("key" Core..=) Core.<$> key
          ]
      )

--
-- /See:/ 'newUserUndelete' smart constructor.
newtype UserUndelete = UserUndelete
  { -- | OrgUnit of User
    orgUnitPath :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'UserUndelete' with the minimum fields required to make a request.
newUserUndelete ::
  UserUndelete
newUserUndelete = UserUndelete {orgUnitPath = Core.Nothing}

instance Core.FromJSON UserUndelete where
  parseJSON =
    Core.withObject
      "UserUndelete"
      (\o -> UserUndelete Core.<$> (o Core..:? "orgUnitPath"))

instance Core.ToJSON UserUndelete where
  toJSON UserUndelete {..} =
    Core.object
      (Core.catMaybes [("orgUnitPath" Core..=) Core.<$> orgUnitPath])

-- | JSON template for a website entry.
--
-- /See:/ 'newUserWebsite' smart constructor.
data UserWebsite = UserWebsite
  { -- | Custom Type.
    customType :: (Core.Maybe Core.Text),
    -- | If this is user\'s primary website or not.
    primary :: (Core.Maybe Core.Bool),
    -- | Each entry can have a type which indicates standard types of that entry. For example website could be of home work blog etc. In addition to the standard type an entry can have a custom type and can give it any name. Such types should have the CUSTOM value as type and also have a customType value.
    type' :: (Core.Maybe Core.Text),
    -- | Website.
    value :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'UserWebsite' with the minimum fields required to make a request.
newUserWebsite ::
  UserWebsite
newUserWebsite =
  UserWebsite
    { customType = Core.Nothing,
      primary = Core.Nothing,
      type' = Core.Nothing,
      value = Core.Nothing
    }

instance Core.FromJSON UserWebsite where
  parseJSON =
    Core.withObject
      "UserWebsite"
      ( \o ->
          UserWebsite
            Core.<$> (o Core..:? "customType")
            Core.<*> (o Core..:? "primary")
            Core.<*> (o Core..:? "type")
            Core.<*> (o Core..:? "value")
      )

instance Core.ToJSON UserWebsite where
  toJSON UserWebsite {..} =
    Core.object
      ( Core.catMaybes
          [ ("customType" Core..=) Core.<$> customType,
            ("primary" Core..=) Core.<$> primary,
            ("type" Core..=) Core.<$> type',
            ("value" Core..=) Core.<$> value
          ]
      )

--
-- /See:/ 'newUsers' smart constructor.
data Users = Users
  { -- | ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | Kind of resource this is.
    kind :: Core.Text,
    -- | Token used to access next page of this result. The page token is only valid for three days.
    nextPageToken :: (Core.Maybe Core.Text),
    -- | Event that triggered this response (only used in case of Push Response)
    triggerEvent :: (Core.Maybe Core.Text),
    -- | A list of user objects.
    users :: (Core.Maybe [User])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Users' with the minimum fields required to make a request.
newUsers ::
  Users
newUsers =
  Users
    { etag = Core.Nothing,
      kind = "admin#directory#users",
      nextPageToken = Core.Nothing,
      triggerEvent = Core.Nothing,
      users = Core.Nothing
    }

instance Core.FromJSON Users where
  parseJSON =
    Core.withObject
      "Users"
      ( \o ->
          Users
            Core.<$> (o Core..:? "etag")
            Core.<*> (o Core..:? "kind" Core..!= "admin#directory#users")
            Core.<*> (o Core..:? "nextPageToken")
            Core.<*> (o Core..:? "trigger_event")
            Core.<*> (o Core..:? "users")
      )

instance Core.ToJSON Users where
  toJSON Users {..} =
    Core.object
      ( Core.catMaybes
          [ ("etag" Core..=) Core.<$> etag,
            Core.Just ("kind" Core..= kind),
            ("nextPageToken" Core..=) Core.<$> nextPageToken,
            ("trigger_event" Core..=) Core.<$> triggerEvent,
            ("users" Core..=) Core.<$> users
          ]
      )

-- | The Directory API allows you to view, generate, and invalidate backup verification codes for a user.
--
-- /See:/ 'newVerificationCode' smart constructor.
data VerificationCode = VerificationCode
  { -- | ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | The type of the resource. This is always @admin#directory#verificationCode@.
    kind :: Core.Text,
    -- | The obfuscated unique ID of the user.
    userId :: (Core.Maybe Core.Text),
    -- | A current verification code for the user. Invalidated or used verification codes are not returned as part of the result.
    verificationCode :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'VerificationCode' with the minimum fields required to make a request.
newVerificationCode ::
  VerificationCode
newVerificationCode =
  VerificationCode
    { etag = Core.Nothing,
      kind = "admin#directory#verificationCode",
      userId = Core.Nothing,
      verificationCode = Core.Nothing
    }

instance Core.FromJSON VerificationCode where
  parseJSON =
    Core.withObject
      "VerificationCode"
      ( \o ->
          VerificationCode
            Core.<$> (o Core..:? "etag")
            Core.<*> (o Core..:? "kind" Core..!= "admin#directory#verificationCode")
            Core.<*> (o Core..:? "userId")
            Core.<*> (o Core..:? "verificationCode")
      )

instance Core.ToJSON VerificationCode where
  toJSON VerificationCode {..} =
    Core.object
      ( Core.catMaybes
          [ ("etag" Core..=) Core.<$> etag,
            Core.Just ("kind" Core..= kind),
            ("userId" Core..=) Core.<$> userId,
            ("verificationCode" Core..=) Core.<$> verificationCode
          ]
      )

-- | JSON response template for list verification codes operation in Directory API.
--
-- /See:/ 'newVerificationCodes' smart constructor.
data VerificationCodes = VerificationCodes
  { -- | ETag of the resource.
    etag :: (Core.Maybe Core.Text),
    -- | A list of verification code resources.
    items :: (Core.Maybe [VerificationCode]),
    -- | The type of the resource. This is always @admin#directory#verificationCodesList@.
    kind :: Core.Text
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'VerificationCodes' with the minimum fields required to make a request.
newVerificationCodes ::
  VerificationCodes
newVerificationCodes =
  VerificationCodes
    { etag = Core.Nothing,
      items = Core.Nothing,
      kind = "admin#directory#verificationCodesList"
    }

instance Core.FromJSON VerificationCodes where
  parseJSON =
    Core.withObject
      "VerificationCodes"
      ( \o ->
          VerificationCodes
            Core.<$> (o Core..:? "etag")
            Core.<*> (o Core..:? "items")
            Core.<*> ( o
                         Core..:? "kind"
                         Core..!= "admin#directory#verificationCodesList"
                     )
      )

instance Core.ToJSON VerificationCodes where
  toJSON VerificationCodes {..} =
    Core.object
      ( Core.catMaybes
          [ ("etag" Core..=) Core.<$> etag,
            ("items" Core..=) Core.<$> items,
            Core.Just ("kind" Core..= kind)
          ]
      )