{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric      #-}
{-# LANGUAGE NoImplicitPrelude  #-}
{-# LANGUAGE OverloadedStrings  #-}
{-# LANGUAGE RecordWildCards    #-}

{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}

-- |
-- Module      : Network.Google.Directory.Types.Product
-- Copyright   : (c) 2015-2016 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
module Network.Google.Directory.Types.Product where

import           Network.Google.Directory.Types.Sum
import           Network.Google.Prelude

-- | JSON template for a location entry.
--
-- /See:/ 'userLocation' smart constructor.
data UserLocation = UserLocation'
    { _ulArea         :: !(Maybe Text)
    , _ulBuildingId   :: !(Maybe Text)
    , _ulDeskCode     :: !(Maybe Text)
    , _ulFloorName    :: !(Maybe Text)
    , _ulType         :: !(Maybe Text)
    , _ulCustomType   :: !(Maybe Text)
    , _ulFloorSection :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'UserLocation' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ulArea'
--
-- * 'ulBuildingId'
--
-- * 'ulDeskCode'
--
-- * 'ulFloorName'
--
-- * 'ulType'
--
-- * 'ulCustomType'
--
-- * 'ulFloorSection'
userLocation
    :: UserLocation
userLocation =
    UserLocation'
    { _ulArea = Nothing
    , _ulBuildingId = Nothing
    , _ulDeskCode = Nothing
    , _ulFloorName = Nothing
    , _ulType = Nothing
    , _ulCustomType = Nothing
    , _ulFloorSection = Nothing
    }

-- | 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\".
ulArea :: Lens' UserLocation (Maybe Text)
ulArea = lens _ulArea (\ s a -> s{_ulArea = a})

-- | Building Identifier.
ulBuildingId :: Lens' UserLocation (Maybe Text)
ulBuildingId
  = lens _ulBuildingId (\ s a -> s{_ulBuildingId = a})

-- | Most specific textual code of individual desk location.
ulDeskCode :: Lens' UserLocation (Maybe Text)
ulDeskCode
  = lens _ulDeskCode (\ s a -> s{_ulDeskCode = a})

-- | Floor name\/number.
ulFloorName :: Lens' UserLocation (Maybe Text)
ulFloorName
  = lens _ulFloorName (\ s a -> s{_ulFloorName = a})

-- | 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.
ulType :: Lens' UserLocation (Maybe Text)
ulType = lens _ulType (\ s a -> s{_ulType = a})

-- | Custom Type.
ulCustomType :: Lens' UserLocation (Maybe Text)
ulCustomType
  = lens _ulCustomType (\ s a -> s{_ulCustomType = a})

-- | 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.
ulFloorSection :: Lens' UserLocation (Maybe Text)
ulFloorSection
  = lens _ulFloorSection
      (\ s a -> s{_ulFloorSection = a})

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

instance ToJSON UserLocation where
        toJSON UserLocation'{..}
          = object
              (catMaybes
                 [("area" .=) <$> _ulArea,
                  ("buildingId" .=) <$> _ulBuildingId,
                  ("deskCode" .=) <$> _ulDeskCode,
                  ("floorName" .=) <$> _ulFloorName,
                  ("type" .=) <$> _ulType,
                  ("customType" .=) <$> _ulCustomType,
                  ("floorSection" .=) <$> _ulFloorSection])

-- | JSON template for verification codes in Directory API.
--
-- /See:/ 'verificationCode' smart constructor.
data VerificationCode = VerificationCode'
    { _vcVerificationCode :: !(Maybe Text)
    , _vcEtag             :: !(Maybe Text)
    , _vcKind             :: !Text
    , _vcUserId           :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'VerificationCode' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'vcVerificationCode'
--
-- * 'vcEtag'
--
-- * 'vcKind'
--
-- * 'vcUserId'
verificationCode
    :: VerificationCode
verificationCode =
    VerificationCode'
    { _vcVerificationCode = Nothing
    , _vcEtag = Nothing
    , _vcKind = "admin#directory#verificationCode"
    , _vcUserId = Nothing
    }

-- | A current verification code for the user. Invalidated or used
-- verification codes are not returned as part of the result.
vcVerificationCode :: Lens' VerificationCode (Maybe Text)
vcVerificationCode
  = lens _vcVerificationCode
      (\ s a -> s{_vcVerificationCode = a})

-- | ETag of the resource.
vcEtag :: Lens' VerificationCode (Maybe Text)
vcEtag = lens _vcEtag (\ s a -> s{_vcEtag = a})

-- | The type of the resource. This is always
-- admin#directory#verificationCode.
vcKind :: Lens' VerificationCode Text
vcKind = lens _vcKind (\ s a -> s{_vcKind = a})

-- | The obfuscated unique ID of the user.
vcUserId :: Lens' VerificationCode (Maybe Text)
vcUserId = lens _vcUserId (\ s a -> s{_vcUserId = a})

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

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

-- | JSON template for Feature object in Directory API.
--
-- /See:/ 'feature' smart constructor.
data Feature = Feature'
    { _fEtags :: !(Maybe Text)
    , _fKind  :: !Text
    , _fName  :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Feature' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'fEtags'
--
-- * 'fKind'
--
-- * 'fName'
feature
    :: Feature
feature =
    Feature'
    { _fEtags = Nothing
    , _fKind = "admin#directory#resources#features#Feature"
    , _fName = Nothing
    }

-- | ETag of the resource.
fEtags :: Lens' Feature (Maybe Text)
fEtags = lens _fEtags (\ s a -> s{_fEtags = a})

-- | Kind of resource this is.
fKind :: Lens' Feature Text
fKind = lens _fKind (\ s a -> s{_fKind = a})

-- | The name of the feature.
fName :: Lens' Feature (Maybe Text)
fName = lens _fName (\ s a -> s{_fName = a})

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

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

-- | JSON template for Org Unit resource in Directory API.
--
-- /See:/ 'orgUnit' smart constructor.
data OrgUnit = OrgUnit'
    { _ouEtag              :: !(Maybe Text)
    , _ouParentOrgUnitPath :: !(Maybe Text)
    , _ouKind              :: !Text
    , _ouOrgUnitPath       :: !(Maybe Text)
    , _ouName              :: !(Maybe Text)
    , _ouBlockInheritance  :: !(Maybe Bool)
    , _ouParentOrgUnitId   :: !(Maybe Text)
    , _ouDescription       :: !(Maybe Text)
    , _ouOrgUnitId         :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'OrgUnit' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ouEtag'
--
-- * 'ouParentOrgUnitPath'
--
-- * 'ouKind'
--
-- * 'ouOrgUnitPath'
--
-- * 'ouName'
--
-- * 'ouBlockInheritance'
--
-- * 'ouParentOrgUnitId'
--
-- * 'ouDescription'
--
-- * 'ouOrgUnitId'
orgUnit
    :: OrgUnit
orgUnit =
    OrgUnit'
    { _ouEtag = Nothing
    , _ouParentOrgUnitPath = Nothing
    , _ouKind = "admin#directory#orgUnit"
    , _ouOrgUnitPath = Nothing
    , _ouName = Nothing
    , _ouBlockInheritance = Nothing
    , _ouParentOrgUnitId = Nothing
    , _ouDescription = Nothing
    , _ouOrgUnitId = Nothing
    }

-- | ETag of the resource.
ouEtag :: Lens' OrgUnit (Maybe Text)
ouEtag = lens _ouEtag (\ s a -> s{_ouEtag = a})

-- | Path of parent OrgUnit
ouParentOrgUnitPath :: Lens' OrgUnit (Maybe Text)
ouParentOrgUnitPath
  = lens _ouParentOrgUnitPath
      (\ s a -> s{_ouParentOrgUnitPath = a})

-- | Kind of resource this is.
ouKind :: Lens' OrgUnit Text
ouKind = lens _ouKind (\ s a -> s{_ouKind = a})

-- | Path of OrgUnit
ouOrgUnitPath :: Lens' OrgUnit (Maybe Text)
ouOrgUnitPath
  = lens _ouOrgUnitPath
      (\ s a -> s{_ouOrgUnitPath = a})

-- | Name of OrgUnit
ouName :: Lens' OrgUnit (Maybe Text)
ouName = lens _ouName (\ s a -> s{_ouName = a})

-- | Should block inheritance
ouBlockInheritance :: Lens' OrgUnit (Maybe Bool)
ouBlockInheritance
  = lens _ouBlockInheritance
      (\ s a -> s{_ouBlockInheritance = a})

-- | Id of parent OrgUnit
ouParentOrgUnitId :: Lens' OrgUnit (Maybe Text)
ouParentOrgUnitId
  = lens _ouParentOrgUnitId
      (\ s a -> s{_ouParentOrgUnitId = a})

-- | Description of OrgUnit
ouDescription :: Lens' OrgUnit (Maybe Text)
ouDescription
  = lens _ouDescription
      (\ s a -> s{_ouDescription = a})

-- | Id of OrgUnit
ouOrgUnitId :: Lens' OrgUnit (Maybe Text)
ouOrgUnitId
  = lens _ouOrgUnitId (\ s a -> s{_ouOrgUnitId = a})

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

instance ToJSON OrgUnit where
        toJSON OrgUnit'{..}
          = object
              (catMaybes
                 [("etag" .=) <$> _ouEtag,
                  ("parentOrgUnitPath" .=) <$> _ouParentOrgUnitPath,
                  Just ("kind" .= _ouKind),
                  ("orgUnitPath" .=) <$> _ouOrgUnitPath,
                  ("name" .=) <$> _ouName,
                  ("blockInheritance" .=) <$> _ouBlockInheritance,
                  ("parentOrgUnitId" .=) <$> _ouParentOrgUnitId,
                  ("description" .=) <$> _ouDescription,
                  ("orgUnitId" .=) <$> _ouOrgUnitId])

-- | JSON request template for setting\/revoking admin status of a user in
-- Directory API.
--
-- /See:/ 'userMakeAdmin' smart constructor.
newtype UserMakeAdmin = UserMakeAdmin'
    { _umaStatus :: Maybe Bool
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'UserMakeAdmin' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'umaStatus'
userMakeAdmin
    :: UserMakeAdmin
userMakeAdmin =
    UserMakeAdmin'
    { _umaStatus = Nothing
    }

-- | Boolean indicating new admin status of the user
umaStatus :: Lens' UserMakeAdmin (Maybe Bool)
umaStatus
  = lens _umaStatus (\ s a -> s{_umaStatus = a})

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

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

-- | JSON template for About (notes) of a user in Directory API.
--
-- /See:/ 'userAbout' smart constructor.
data UserAbout = UserAbout'
    { _uaValue       :: !(Maybe Text)
    , _uaContentType :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'UserAbout' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'uaValue'
--
-- * 'uaContentType'
userAbout
    :: UserAbout
userAbout =
    UserAbout'
    { _uaValue = Nothing
    , _uaContentType = Nothing
    }

-- | Actual value of notes.
uaValue :: Lens' UserAbout (Maybe Text)
uaValue = lens _uaValue (\ s a -> s{_uaValue = a})

-- | 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.
uaContentType :: Lens' UserAbout (Maybe Text)
uaContentType
  = lens _uaContentType
      (\ s a -> s{_uaContentType = a})

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

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

-- | JSON response template for List privileges operation in Directory API.
--
-- /See:/ 'privileges' smart constructor.
data Privileges = Privileges'
    { _pEtag  :: !(Maybe Text)
    , _pKind  :: !Text
    , _pItems :: !(Maybe [Privilege])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Privileges' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'pEtag'
--
-- * 'pKind'
--
-- * 'pItems'
privileges
    :: Privileges
privileges =
    Privileges'
    { _pEtag = Nothing
    , _pKind = "admin#directory#privileges"
    , _pItems = Nothing
    }

-- | ETag of the resource.
pEtag :: Lens' Privileges (Maybe Text)
pEtag = lens _pEtag (\ s a -> s{_pEtag = a})

-- | The type of the API resource. This is always admin#directory#privileges.
pKind :: Lens' Privileges Text
pKind = lens _pKind (\ s a -> s{_pKind = a})

-- | A list of Privilege resources.
pItems :: Lens' Privileges [Privilege]
pItems
  = lens _pItems (\ s a -> s{_pItems = a}) . _Default .
      _Coerce

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

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

-- | JSON response template for List Groups operation in Directory API.
--
-- /See:/ 'groups' smart constructor.
data Groups = Groups'
    { _gGroups        :: !(Maybe [Group])
    , _gEtag          :: !(Maybe Text)
    , _gNextPageToken :: !(Maybe Text)
    , _gKind          :: !Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Groups' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'gGroups'
--
-- * 'gEtag'
--
-- * 'gNextPageToken'
--
-- * 'gKind'
groups
    :: Groups
groups =
    Groups'
    { _gGroups = Nothing
    , _gEtag = Nothing
    , _gNextPageToken = Nothing
    , _gKind = "admin#directory#groups"
    }

-- | List of group objects.
gGroups :: Lens' Groups [Group]
gGroups
  = lens _gGroups (\ s a -> s{_gGroups = a}) . _Default
      . _Coerce

-- | ETag of the resource.
gEtag :: Lens' Groups (Maybe Text)
gEtag = lens _gEtag (\ s a -> s{_gEtag = a})

-- | Token used to access next page of this result.
gNextPageToken :: Lens' Groups (Maybe Text)
gNextPageToken
  = lens _gNextPageToken
      (\ s a -> s{_gNextPageToken = a})

-- | Kind of resource this is.
gKind :: Lens' Groups Text
gKind = lens _gKind (\ s a -> s{_gKind = a})

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

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

-- | JSON response template for List roleAssignments operation in Directory
-- API.
--
-- /See:/ 'roleAssignments' smart constructor.
data RoleAssignments = RoleAssignments'
    { _raEtag          :: !(Maybe Text)
    , _raNextPageToken :: !(Maybe Text)
    , _raKind          :: !Text
    , _raItems         :: !(Maybe [RoleAssignment])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'RoleAssignments' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'raEtag'
--
-- * 'raNextPageToken'
--
-- * 'raKind'
--
-- * 'raItems'
roleAssignments
    :: RoleAssignments
roleAssignments =
    RoleAssignments'
    { _raEtag = Nothing
    , _raNextPageToken = Nothing
    , _raKind = "admin#directory#roleAssignments"
    , _raItems = Nothing
    }

-- | ETag of the resource.
raEtag :: Lens' RoleAssignments (Maybe Text)
raEtag = lens _raEtag (\ s a -> s{_raEtag = a})

raNextPageToken :: Lens' RoleAssignments (Maybe Text)
raNextPageToken
  = lens _raNextPageToken
      (\ s a -> s{_raNextPageToken = a})

-- | The type of the API resource. This is always
-- admin#directory#roleAssignments.
raKind :: Lens' RoleAssignments Text
raKind = lens _raKind (\ s a -> s{_raKind = a})

-- | A list of RoleAssignment resources.
raItems :: Lens' RoleAssignments [RoleAssignment]
raItems
  = lens _raItems (\ s a -> s{_raItems = a}) . _Default
      . _Coerce

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

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

-- | JSON template for privilege resource in Directory API.
--
-- /See:/ 'privilege' smart constructor.
data Privilege = Privilege'
    { _priEtag            :: !(Maybe Text)
    , _priIsOuScopable    :: !(Maybe Bool)
    , _priKind            :: !Text
    , _priServiceName     :: !(Maybe Text)
    , _priServiceId       :: !(Maybe Text)
    , _priPrivilegeName   :: !(Maybe Text)
    , _priChildPrivileges :: !(Maybe [Privilege])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Privilege' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'priEtag'
--
-- * 'priIsOuScopable'
--
-- * 'priKind'
--
-- * 'priServiceName'
--
-- * 'priServiceId'
--
-- * 'priPrivilegeName'
--
-- * 'priChildPrivileges'
privilege
    :: Privilege
privilege =
    Privilege'
    { _priEtag = Nothing
    , _priIsOuScopable = Nothing
    , _priKind = "admin#directory#privilege"
    , _priServiceName = Nothing
    , _priServiceId = Nothing
    , _priPrivilegeName = Nothing
    , _priChildPrivileges = Nothing
    }

-- | ETag of the resource.
priEtag :: Lens' Privilege (Maybe Text)
priEtag = lens _priEtag (\ s a -> s{_priEtag = a})

-- | If the privilege can be restricted to an organization unit.
priIsOuScopable :: Lens' Privilege (Maybe Bool)
priIsOuScopable
  = lens _priIsOuScopable
      (\ s a -> s{_priIsOuScopable = a})

-- | The type of the API resource. This is always admin#directory#privilege.
priKind :: Lens' Privilege Text
priKind = lens _priKind (\ s a -> s{_priKind = a})

-- | The name of the service this privilege is for.
priServiceName :: Lens' Privilege (Maybe Text)
priServiceName
  = lens _priServiceName
      (\ s a -> s{_priServiceName = a})

-- | The obfuscated ID of the service this privilege is for.
priServiceId :: Lens' Privilege (Maybe Text)
priServiceId
  = lens _priServiceId (\ s a -> s{_priServiceId = a})

-- | The name of the privilege.
priPrivilegeName :: Lens' Privilege (Maybe Text)
priPrivilegeName
  = lens _priPrivilegeName
      (\ s a -> s{_priPrivilegeName = a})

-- | 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.
priChildPrivileges :: Lens' Privilege [Privilege]
priChildPrivileges
  = lens _priChildPrivileges
      (\ s a -> s{_priChildPrivileges = a})
      . _Default
      . _Coerce

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

instance ToJSON Privilege where
        toJSON Privilege'{..}
          = object
              (catMaybes
                 [("etag" .=) <$> _priEtag,
                  ("isOuScopable" .=) <$> _priIsOuScopable,
                  Just ("kind" .= _priKind),
                  ("serviceName" .=) <$> _priServiceName,
                  ("serviceId" .=) <$> _priServiceId,
                  ("privilegeName" .=) <$> _priPrivilegeName,
                  ("childPrivileges" .=) <$> _priChildPrivileges])

-- | JSON response template for List roles operation in Directory API.
--
-- /See:/ 'roles' smart constructor.
data Roles = Roles'
    { _rEtag          :: !(Maybe Text)
    , _rNextPageToken :: !(Maybe Text)
    , _rKind          :: !Text
    , _rItems         :: !(Maybe [Role])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Roles' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'rEtag'
--
-- * 'rNextPageToken'
--
-- * 'rKind'
--
-- * 'rItems'
roles
    :: Roles
roles =
    Roles'
    { _rEtag = Nothing
    , _rNextPageToken = Nothing
    , _rKind = "admin#directory#roles"
    , _rItems = Nothing
    }

-- | ETag of the resource.
rEtag :: Lens' Roles (Maybe Text)
rEtag = lens _rEtag (\ s a -> s{_rEtag = a})

rNextPageToken :: Lens' Roles (Maybe Text)
rNextPageToken
  = lens _rNextPageToken
      (\ s a -> s{_rNextPageToken = a})

-- | The type of the API resource. This is always admin#directory#roles.
rKind :: Lens' Roles Text
rKind = lens _rKind (\ s a -> s{_rKind = a})

-- | A list of Role resources.
rItems :: Lens' Roles [Role]
rItems
  = lens _rItems (\ s a -> s{_rItems = a}) . _Default .
      _Coerce

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

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

--
-- /See:/ 'chromeOSDeviceDiskVolumeReportsItem' smart constructor.
newtype ChromeOSDeviceDiskVolumeReportsItem = ChromeOSDeviceDiskVolumeReportsItem'
    { _coddvriVolumeInfo :: Maybe [ChromeOSDeviceDiskVolumeReportsItemVolumeInfoItem]
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ChromeOSDeviceDiskVolumeReportsItem' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'coddvriVolumeInfo'
chromeOSDeviceDiskVolumeReportsItem
    :: ChromeOSDeviceDiskVolumeReportsItem
chromeOSDeviceDiskVolumeReportsItem =
    ChromeOSDeviceDiskVolumeReportsItem'
    { _coddvriVolumeInfo = Nothing
    }

-- | Disk volumes
coddvriVolumeInfo :: Lens' ChromeOSDeviceDiskVolumeReportsItem [ChromeOSDeviceDiskVolumeReportsItemVolumeInfoItem]
coddvriVolumeInfo
  = lens _coddvriVolumeInfo
      (\ s a -> s{_coddvriVolumeInfo = a})
      . _Default
      . _Coerce

instance FromJSON ChromeOSDeviceDiskVolumeReportsItem
         where
        parseJSON
          = withObject "ChromeOSDeviceDiskVolumeReportsItem"
              (\ o ->
                 ChromeOSDeviceDiskVolumeReportsItem' <$>
                   (o .:? "volumeInfo" .!= mempty))

instance ToJSON ChromeOSDeviceDiskVolumeReportsItem
         where
        toJSON ChromeOSDeviceDiskVolumeReportsItem'{..}
          = object
              (catMaybes
                 [("volumeInfo" .=) <$> _coddvriVolumeInfo])

-- | JSON template for address.
--
-- /See:/ 'userAddress' smart constructor.
data UserAddress = UserAddress'
    { _uaStreetAddress      :: !(Maybe Text)
    , _uaPoBox              :: !(Maybe Text)
    , _uaCountry            :: !(Maybe Text)
    , _uaPostalCode         :: !(Maybe Text)
    , _uaFormatted          :: !(Maybe Text)
    , _uaExtendedAddress    :: !(Maybe Text)
    , _uaLocality           :: !(Maybe Text)
    , _uaPrimary            :: !(Maybe Bool)
    , _uaCountryCode        :: !(Maybe Text)
    , _uaRegion             :: !(Maybe Text)
    , _uaType               :: !(Maybe Text)
    , _uaCustomType         :: !(Maybe Text)
    , _uaSourceIsStructured :: !(Maybe Bool)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'UserAddress' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'uaStreetAddress'
--
-- * 'uaPoBox'
--
-- * 'uaCountry'
--
-- * 'uaPostalCode'
--
-- * 'uaFormatted'
--
-- * 'uaExtendedAddress'
--
-- * 'uaLocality'
--
-- * 'uaPrimary'
--
-- * 'uaCountryCode'
--
-- * 'uaRegion'
--
-- * 'uaType'
--
-- * 'uaCustomType'
--
-- * 'uaSourceIsStructured'
userAddress
    :: UserAddress
userAddress =
    UserAddress'
    { _uaStreetAddress = Nothing
    , _uaPoBox = Nothing
    , _uaCountry = Nothing
    , _uaPostalCode = Nothing
    , _uaFormatted = Nothing
    , _uaExtendedAddress = Nothing
    , _uaLocality = Nothing
    , _uaPrimary = Nothing
    , _uaCountryCode = Nothing
    , _uaRegion = Nothing
    , _uaType = Nothing
    , _uaCustomType = Nothing
    , _uaSourceIsStructured = Nothing
    }

-- | Street.
uaStreetAddress :: Lens' UserAddress (Maybe Text)
uaStreetAddress
  = lens _uaStreetAddress
      (\ s a -> s{_uaStreetAddress = a})

-- | Other parts of address.
uaPoBox :: Lens' UserAddress (Maybe Text)
uaPoBox = lens _uaPoBox (\ s a -> s{_uaPoBox = a})

-- | Country.
uaCountry :: Lens' UserAddress (Maybe Text)
uaCountry
  = lens _uaCountry (\ s a -> s{_uaCountry = a})

-- | Postal code.
uaPostalCode :: Lens' UserAddress (Maybe Text)
uaPostalCode
  = lens _uaPostalCode (\ s a -> s{_uaPostalCode = a})

-- | Formatted address.
uaFormatted :: Lens' UserAddress (Maybe Text)
uaFormatted
  = lens _uaFormatted (\ s a -> s{_uaFormatted = a})

-- | Extended Address.
uaExtendedAddress :: Lens' UserAddress (Maybe Text)
uaExtendedAddress
  = lens _uaExtendedAddress
      (\ s a -> s{_uaExtendedAddress = a})

-- | Locality.
uaLocality :: Lens' UserAddress (Maybe Text)
uaLocality
  = lens _uaLocality (\ s a -> s{_uaLocality = a})

-- | If this is user\'s primary address. Only one entry could be marked as
-- primary.
uaPrimary :: Lens' UserAddress (Maybe Bool)
uaPrimary
  = lens _uaPrimary (\ s a -> s{_uaPrimary = a})

-- | Country code.
uaCountryCode :: Lens' UserAddress (Maybe Text)
uaCountryCode
  = lens _uaCountryCode
      (\ s a -> s{_uaCountryCode = a})

-- | Region.
uaRegion :: Lens' UserAddress (Maybe Text)
uaRegion = lens _uaRegion (\ s a -> s{_uaRegion = a})

-- | 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.
uaType :: Lens' UserAddress (Maybe Text)
uaType = lens _uaType (\ s a -> s{_uaType = a})

-- | Custom type.
uaCustomType :: Lens' UserAddress (Maybe Text)
uaCustomType
  = lens _uaCustomType (\ s a -> s{_uaCustomType = a})

-- | 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.
uaSourceIsStructured :: Lens' UserAddress (Maybe Bool)
uaSourceIsStructured
  = lens _uaSourceIsStructured
      (\ s a -> s{_uaSourceIsStructured = a})

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

instance ToJSON UserAddress where
        toJSON UserAddress'{..}
          = object
              (catMaybes
                 [("streetAddress" .=) <$> _uaStreetAddress,
                  ("poBox" .=) <$> _uaPoBox,
                  ("country" .=) <$> _uaCountry,
                  ("postalCode" .=) <$> _uaPostalCode,
                  ("formatted" .=) <$> _uaFormatted,
                  ("extendedAddress" .=) <$> _uaExtendedAddress,
                  ("locality" .=) <$> _uaLocality,
                  ("primary" .=) <$> _uaPrimary,
                  ("countryCode" .=) <$> _uaCountryCode,
                  ("region" .=) <$> _uaRegion, ("type" .=) <$> _uaType,
                  ("customType" .=) <$> _uaCustomType,
                  ("sourceIsStructured" .=) <$> _uaSourceIsStructured])

-- | JSON template for postal address of a customer.
--
-- /See:/ 'customerPostalAddress' smart constructor.
data CustomerPostalAddress = CustomerPostalAddress'
    { _cpaOrganizationName :: !(Maybe Text)
    , _cpaPostalCode       :: !(Maybe Text)
    , _cpaAddressLine1     :: !(Maybe Text)
    , _cpaLocality         :: !(Maybe Text)
    , _cpaContactName      :: !(Maybe Text)
    , _cpaAddressLine2     :: !(Maybe Text)
    , _cpaCountryCode      :: !(Maybe Text)
    , _cpaRegion           :: !(Maybe Text)
    , _cpaAddressLine3     :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'CustomerPostalAddress' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'cpaOrganizationName'
--
-- * 'cpaPostalCode'
--
-- * 'cpaAddressLine1'
--
-- * 'cpaLocality'
--
-- * 'cpaContactName'
--
-- * 'cpaAddressLine2'
--
-- * 'cpaCountryCode'
--
-- * 'cpaRegion'
--
-- * 'cpaAddressLine3'
customerPostalAddress
    :: CustomerPostalAddress
customerPostalAddress =
    CustomerPostalAddress'
    { _cpaOrganizationName = Nothing
    , _cpaPostalCode = Nothing
    , _cpaAddressLine1 = Nothing
    , _cpaLocality = Nothing
    , _cpaContactName = Nothing
    , _cpaAddressLine2 = Nothing
    , _cpaCountryCode = Nothing
    , _cpaRegion = Nothing
    , _cpaAddressLine3 = Nothing
    }

-- | The company or company division name.
cpaOrganizationName :: Lens' CustomerPostalAddress (Maybe Text)
cpaOrganizationName
  = lens _cpaOrganizationName
      (\ s a -> s{_cpaOrganizationName = a})

-- | 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.
cpaPostalCode :: Lens' CustomerPostalAddress (Maybe Text)
cpaPostalCode
  = lens _cpaPostalCode
      (\ s a -> s{_cpaPostalCode = a})

-- | A customer\'s physical address. The address can be composed of one to
-- three lines.
cpaAddressLine1 :: Lens' CustomerPostalAddress (Maybe Text)
cpaAddressLine1
  = lens _cpaAddressLine1
      (\ s a -> s{_cpaAddressLine1 = a})

-- | Name of the locality. An example of a locality value is the city of San
-- Francisco.
cpaLocality :: Lens' CustomerPostalAddress (Maybe Text)
cpaLocality
  = lens _cpaLocality (\ s a -> s{_cpaLocality = a})

-- | The customer contact\'s name.
cpaContactName :: Lens' CustomerPostalAddress (Maybe Text)
cpaContactName
  = lens _cpaContactName
      (\ s a -> s{_cpaContactName = a})

-- | Address line 2 of the address.
cpaAddressLine2 :: Lens' CustomerPostalAddress (Maybe Text)
cpaAddressLine2
  = lens _cpaAddressLine2
      (\ s a -> s{_cpaAddressLine2 = a})

-- | This is a required property. For countryCode information see the ISO
-- 3166 country code elements.
cpaCountryCode :: Lens' CustomerPostalAddress (Maybe Text)
cpaCountryCode
  = lens _cpaCountryCode
      (\ s a -> s{_cpaCountryCode = a})

-- | Name of the region. An example of a region value is NY for the state of
-- New York.
cpaRegion :: Lens' CustomerPostalAddress (Maybe Text)
cpaRegion
  = lens _cpaRegion (\ s a -> s{_cpaRegion = a})

-- | Address line 3 of the address.
cpaAddressLine3 :: Lens' CustomerPostalAddress (Maybe Text)
cpaAddressLine3
  = lens _cpaAddressLine3
      (\ s a -> s{_cpaAddressLine3 = a})

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

instance ToJSON CustomerPostalAddress where
        toJSON CustomerPostalAddress'{..}
          = object
              (catMaybes
                 [("organizationName" .=) <$> _cpaOrganizationName,
                  ("postalCode" .=) <$> _cpaPostalCode,
                  ("addressLine1" .=) <$> _cpaAddressLine1,
                  ("locality" .=) <$> _cpaLocality,
                  ("contactName" .=) <$> _cpaContactName,
                  ("addressLine2" .=) <$> _cpaAddressLine2,
                  ("countryCode" .=) <$> _cpaCountryCode,
                  ("region" .=) <$> _cpaRegion,
                  ("addressLine3" .=) <$> _cpaAddressLine3])

-- | JSON template for roleAssignment resource in Directory API.
--
-- /See:/ 'roleAssignment' smart constructor.
data RoleAssignment = RoleAssignment'
    { _rolEtag             :: !(Maybe Text)
    , _rolScopeType        :: !(Maybe Text)
    , _rolKind             :: !Text
    , _rolAssignedTo       :: !(Maybe Text)
    , _rolRoleId           :: !(Maybe (Textual Int64))
    , _rolRoleAssignmentId :: !(Maybe (Textual Int64))
    , _rolOrgUnitId        :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'RoleAssignment' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'rolEtag'
--
-- * 'rolScopeType'
--
-- * 'rolKind'
--
-- * 'rolAssignedTo'
--
-- * 'rolRoleId'
--
-- * 'rolRoleAssignmentId'
--
-- * 'rolOrgUnitId'
roleAssignment
    :: RoleAssignment
roleAssignment =
    RoleAssignment'
    { _rolEtag = Nothing
    , _rolScopeType = Nothing
    , _rolKind = "admin#directory#roleAssignment"
    , _rolAssignedTo = Nothing
    , _rolRoleId = Nothing
    , _rolRoleAssignmentId = Nothing
    , _rolOrgUnitId = Nothing
    }

-- | ETag of the resource.
rolEtag :: Lens' RoleAssignment (Maybe Text)
rolEtag = lens _rolEtag (\ s a -> s{_rolEtag = a})

-- | The scope in which this role is assigned. Possible values are: -
-- CUSTOMER - ORG_UNIT
rolScopeType :: Lens' RoleAssignment (Maybe Text)
rolScopeType
  = lens _rolScopeType (\ s a -> s{_rolScopeType = a})

-- | The type of the API resource. This is always
-- admin#directory#roleAssignment.
rolKind :: Lens' RoleAssignment Text
rolKind = lens _rolKind (\ s a -> s{_rolKind = a})

-- | The unique ID of the user this role is assigned to.
rolAssignedTo :: Lens' RoleAssignment (Maybe Text)
rolAssignedTo
  = lens _rolAssignedTo
      (\ s a -> s{_rolAssignedTo = a})

-- | The ID of the role that is assigned.
rolRoleId :: Lens' RoleAssignment (Maybe Int64)
rolRoleId
  = lens _rolRoleId (\ s a -> s{_rolRoleId = a}) .
      mapping _Coerce

-- | ID of this roleAssignment.
rolRoleAssignmentId :: Lens' RoleAssignment (Maybe Int64)
rolRoleAssignmentId
  = lens _rolRoleAssignmentId
      (\ s a -> s{_rolRoleAssignmentId = a})
      . mapping _Coerce

-- | 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.
rolOrgUnitId :: Lens' RoleAssignment (Maybe Text)
rolOrgUnitId
  = lens _rolOrgUnitId (\ s a -> s{_rolOrgUnitId = a})

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

instance ToJSON RoleAssignment where
        toJSON RoleAssignment'{..}
          = object
              (catMaybes
                 [("etag" .=) <$> _rolEtag,
                  ("scopeType" .=) <$> _rolScopeType,
                  Just ("kind" .= _rolKind),
                  ("assignedTo" .=) <$> _rolAssignedTo,
                  ("roleId" .=) <$> _rolRoleId,
                  ("roleAssignmentId" .=) <$> _rolRoleAssignmentId,
                  ("orgUnitId" .=) <$> _rolOrgUnitId])

-- | JSON template for Group resource in Directory API.
--
-- /See:/ 'group'' smart constructor.
data Group = Group'
    { _groEmail              :: !(Maybe Text)
    , _groEtag               :: !(Maybe Text)
    , _groDirectMembersCount :: !(Maybe (Textual Int64))
    , _groKind               :: !Text
    , _groAliases            :: !(Maybe [Text])
    , _groNonEditableAliases :: !(Maybe [Text])
    , _groName               :: !(Maybe Text)
    , _groAdminCreated       :: !(Maybe Bool)
    , _groId                 :: !(Maybe Text)
    , _groDescription        :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Group' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'groEmail'
--
-- * 'groEtag'
--
-- * 'groDirectMembersCount'
--
-- * 'groKind'
--
-- * 'groAliases'
--
-- * 'groNonEditableAliases'
--
-- * 'groName'
--
-- * 'groAdminCreated'
--
-- * 'groId'
--
-- * 'groDescription'
group'
    :: Group
group' =
    Group'
    { _groEmail = Nothing
    , _groEtag = Nothing
    , _groDirectMembersCount = Nothing
    , _groKind = "admin#directory#group"
    , _groAliases = Nothing
    , _groNonEditableAliases = Nothing
    , _groName = Nothing
    , _groAdminCreated = Nothing
    , _groId = Nothing
    , _groDescription = Nothing
    }

-- | Email of Group
groEmail :: Lens' Group (Maybe Text)
groEmail = lens _groEmail (\ s a -> s{_groEmail = a})

-- | ETag of the resource.
groEtag :: Lens' Group (Maybe Text)
groEtag = lens _groEtag (\ s a -> s{_groEtag = a})

-- | Group direct members count
groDirectMembersCount :: Lens' Group (Maybe Int64)
groDirectMembersCount
  = lens _groDirectMembersCount
      (\ s a -> s{_groDirectMembersCount = a})
      . mapping _Coerce

-- | Kind of resource this is.
groKind :: Lens' Group Text
groKind = lens _groKind (\ s a -> s{_groKind = a})

-- | List of aliases (Read-only)
groAliases :: Lens' Group [Text]
groAliases
  = lens _groAliases (\ s a -> s{_groAliases = a}) .
      _Default
      . _Coerce

-- | List of non editable aliases (Read-only)
groNonEditableAliases :: Lens' Group [Text]
groNonEditableAliases
  = lens _groNonEditableAliases
      (\ s a -> s{_groNonEditableAliases = a})
      . _Default
      . _Coerce

-- | Group name
groName :: Lens' Group (Maybe Text)
groName = lens _groName (\ s a -> s{_groName = a})

-- | Is the group created by admin (Read-only) *
groAdminCreated :: Lens' Group (Maybe Bool)
groAdminCreated
  = lens _groAdminCreated
      (\ s a -> s{_groAdminCreated = a})

-- | Unique identifier of Group (Read-only)
groId :: Lens' Group (Maybe Text)
groId = lens _groId (\ s a -> s{_groId = a})

-- | Description of the group
groDescription :: Lens' Group (Maybe Text)
groDescription
  = lens _groDescription
      (\ s a -> s{_groDescription = a})

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

instance ToJSON Group where
        toJSON Group'{..}
          = object
              (catMaybes
                 [("email" .=) <$> _groEmail,
                  ("etag" .=) <$> _groEtag,
                  ("directMembersCount" .=) <$> _groDirectMembersCount,
                  Just ("kind" .= _groKind),
                  ("aliases" .=) <$> _groAliases,
                  ("nonEditableAliases" .=) <$> _groNonEditableAliases,
                  ("name" .=) <$> _groName,
                  ("adminCreated" .=) <$> _groAdminCreated,
                  ("id" .=) <$> _groId,
                  ("description" .=) <$> _groDescription])

-- | JSON template for Chrome Os Device resource in Directory API.
--
-- /See:/ 'chromeOSDevice' smart constructor.
data ChromeOSDevice = ChromeOSDevice'
    { _codStatus               :: !(Maybe Text)
    , _codEtag                 :: !(Maybe Text)
    , _codCPUStatusReports     :: !(Maybe [ChromeOSDeviceCPUStatusReportsItem])
    , _codAnnotatedUser        :: !(Maybe Text)
    , _codSystemRamFreeReports :: !(Maybe [ChromeOSDeviceSystemRamFreeReportsItem])
    , _codPlatformVersion      :: !(Maybe Text)
    , _codLastSync             :: !(Maybe DateTime')
    , _codActiveTimeRanges     :: !(Maybe [ChromeOSDeviceActiveTimeRangesItem])
    , _codKind                 :: !Text
    , _codEthernetMACAddress   :: !(Maybe Text)
    , _codLastEnrollmentTime   :: !(Maybe DateTime')
    , _codAnnotatedLocation    :: !(Maybe Text)
    , _codMACAddress           :: !(Maybe Text)
    , _codOrgUnitPath          :: !(Maybe Text)
    , _codRecentUsers          :: !(Maybe [ChromeOSDeviceRecentUsersItem])
    , _codSupportEndDate       :: !(Maybe DateTime')
    , _codModel                :: !(Maybe Text)
    , _codWillAutoRenew        :: !(Maybe Bool)
    , _codMeid                 :: !(Maybe Text)
    , _codDeviceFiles          :: !(Maybe [ChromeOSDeviceDeviceFilesItem])
    , _codDeviceId             :: !(Maybe Text)
    , _codBootMode             :: !(Maybe Text)
    , _codTpmVersionInfo       :: !(Maybe ChromeOSDeviceTpmVersionInfo)
    , _codOrderNumber          :: !(Maybe Text)
    , _codDiskVolumeReports    :: !(Maybe [ChromeOSDeviceDiskVolumeReportsItem])
    , _codAnnotatedAssetId     :: !(Maybe Text)
    , _codNotes                :: !(Maybe Text)
    , _codSerialNumber         :: !(Maybe Text)
    , _codFirmwareVersion      :: !(Maybe Text)
    , _codOSVersion            :: !(Maybe Text)
    , _codSystemRamTotal       :: !(Maybe (Textual Int64))
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ChromeOSDevice' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'codStatus'
--
-- * 'codEtag'
--
-- * 'codCPUStatusReports'
--
-- * 'codAnnotatedUser'
--
-- * 'codSystemRamFreeReports'
--
-- * 'codPlatformVersion'
--
-- * 'codLastSync'
--
-- * 'codActiveTimeRanges'
--
-- * 'codKind'
--
-- * 'codEthernetMACAddress'
--
-- * 'codLastEnrollmentTime'
--
-- * 'codAnnotatedLocation'
--
-- * 'codMACAddress'
--
-- * 'codOrgUnitPath'
--
-- * 'codRecentUsers'
--
-- * 'codSupportEndDate'
--
-- * 'codModel'
--
-- * 'codWillAutoRenew'
--
-- * 'codMeid'
--
-- * 'codDeviceFiles'
--
-- * 'codDeviceId'
--
-- * 'codBootMode'
--
-- * 'codTpmVersionInfo'
--
-- * 'codOrderNumber'
--
-- * 'codDiskVolumeReports'
--
-- * 'codAnnotatedAssetId'
--
-- * 'codNotes'
--
-- * 'codSerialNumber'
--
-- * 'codFirmwareVersion'
--
-- * 'codOSVersion'
--
-- * 'codSystemRamTotal'
chromeOSDevice
    :: ChromeOSDevice
chromeOSDevice =
    ChromeOSDevice'
    { _codStatus = Nothing
    , _codEtag = Nothing
    , _codCPUStatusReports = Nothing
    , _codAnnotatedUser = Nothing
    , _codSystemRamFreeReports = Nothing
    , _codPlatformVersion = Nothing
    , _codLastSync = Nothing
    , _codActiveTimeRanges = Nothing
    , _codKind = "admin#directory#chromeosdevice"
    , _codEthernetMACAddress = Nothing
    , _codLastEnrollmentTime = Nothing
    , _codAnnotatedLocation = Nothing
    , _codMACAddress = Nothing
    , _codOrgUnitPath = Nothing
    , _codRecentUsers = Nothing
    , _codSupportEndDate = Nothing
    , _codModel = Nothing
    , _codWillAutoRenew = Nothing
    , _codMeid = Nothing
    , _codDeviceFiles = Nothing
    , _codDeviceId = Nothing
    , _codBootMode = Nothing
    , _codTpmVersionInfo = Nothing
    , _codOrderNumber = Nothing
    , _codDiskVolumeReports = Nothing
    , _codAnnotatedAssetId = Nothing
    , _codNotes = Nothing
    , _codSerialNumber = Nothing
    , _codFirmwareVersion = Nothing
    , _codOSVersion = Nothing
    , _codSystemRamTotal = Nothing
    }

-- | status of the device (Read-only)
codStatus :: Lens' ChromeOSDevice (Maybe Text)
codStatus
  = lens _codStatus (\ s a -> s{_codStatus = a})

-- | ETag of the resource.
codEtag :: Lens' ChromeOSDevice (Maybe Text)
codEtag = lens _codEtag (\ s a -> s{_codEtag = a})

-- | Reports of CPU utilization and temperature (Read-only)
codCPUStatusReports :: Lens' ChromeOSDevice [ChromeOSDeviceCPUStatusReportsItem]
codCPUStatusReports
  = lens _codCPUStatusReports
      (\ s a -> s{_codCPUStatusReports = a})
      . _Default
      . _Coerce

-- | User of the device
codAnnotatedUser :: Lens' ChromeOSDevice (Maybe Text)
codAnnotatedUser
  = lens _codAnnotatedUser
      (\ s a -> s{_codAnnotatedUser = a})

-- | Reports of amounts of available RAM memory (Read-only)
codSystemRamFreeReports :: Lens' ChromeOSDevice [ChromeOSDeviceSystemRamFreeReportsItem]
codSystemRamFreeReports
  = lens _codSystemRamFreeReports
      (\ s a -> s{_codSystemRamFreeReports = a})
      . _Default
      . _Coerce

-- | Chromebook platform version (Read-only)
codPlatformVersion :: Lens' ChromeOSDevice (Maybe Text)
codPlatformVersion
  = lens _codPlatformVersion
      (\ s a -> s{_codPlatformVersion = a})

-- | Date and time the device was last synchronized with the policy settings
-- in the G Suite administrator control panel (Read-only)
codLastSync :: Lens' ChromeOSDevice (Maybe UTCTime)
codLastSync
  = lens _codLastSync (\ s a -> s{_codLastSync = a}) .
      mapping _DateTime

-- | List of active time ranges (Read-only)
codActiveTimeRanges :: Lens' ChromeOSDevice [ChromeOSDeviceActiveTimeRangesItem]
codActiveTimeRanges
  = lens _codActiveTimeRanges
      (\ s a -> s{_codActiveTimeRanges = a})
      . _Default
      . _Coerce

-- | Kind of resource this is.
codKind :: Lens' ChromeOSDevice Text
codKind = lens _codKind (\ s a -> s{_codKind = a})

-- | Chromebook Mac Address on ethernet network interface (Read-only)
codEthernetMACAddress :: Lens' ChromeOSDevice (Maybe Text)
codEthernetMACAddress
  = lens _codEthernetMACAddress
      (\ s a -> s{_codEthernetMACAddress = a})

-- | Date and time the device was last enrolled (Read-only)
codLastEnrollmentTime :: Lens' ChromeOSDevice (Maybe UTCTime)
codLastEnrollmentTime
  = lens _codLastEnrollmentTime
      (\ s a -> s{_codLastEnrollmentTime = a})
      . mapping _DateTime

-- | Address or location of the device as noted by the administrator
codAnnotatedLocation :: Lens' ChromeOSDevice (Maybe Text)
codAnnotatedLocation
  = lens _codAnnotatedLocation
      (\ s a -> s{_codAnnotatedLocation = a})

-- | Chromebook Mac Address on wifi network interface (Read-only)
codMACAddress :: Lens' ChromeOSDevice (Maybe Text)
codMACAddress
  = lens _codMACAddress
      (\ s a -> s{_codMACAddress = a})

-- | OrgUnit of the device
codOrgUnitPath :: Lens' ChromeOSDevice (Maybe Text)
codOrgUnitPath
  = lens _codOrgUnitPath
      (\ s a -> s{_codOrgUnitPath = a})

-- | List of recent device users, in descending order by last login time
-- (Read-only)
codRecentUsers :: Lens' ChromeOSDevice [ChromeOSDeviceRecentUsersItem]
codRecentUsers
  = lens _codRecentUsers
      (\ s a -> s{_codRecentUsers = a})
      . _Default
      . _Coerce

-- | Final date the device will be supported (Read-only)
codSupportEndDate :: Lens' ChromeOSDevice (Maybe UTCTime)
codSupportEndDate
  = lens _codSupportEndDate
      (\ s a -> s{_codSupportEndDate = a})
      . mapping _DateTime

-- | Chromebook Model (Read-only)
codModel :: Lens' ChromeOSDevice (Maybe Text)
codModel = lens _codModel (\ s a -> s{_codModel = a})

-- | Will Chromebook auto renew after support end date (Read-only)
codWillAutoRenew :: Lens' ChromeOSDevice (Maybe Bool)
codWillAutoRenew
  = lens _codWillAutoRenew
      (\ s a -> s{_codWillAutoRenew = a})

-- | Mobile Equipment identifier for the 3G mobile card in the Chromebook
-- (Read-only)
codMeid :: Lens' ChromeOSDevice (Maybe Text)
codMeid = lens _codMeid (\ s a -> s{_codMeid = a})

-- | List of device files to download (Read-only)
codDeviceFiles :: Lens' ChromeOSDevice [ChromeOSDeviceDeviceFilesItem]
codDeviceFiles
  = lens _codDeviceFiles
      (\ s a -> s{_codDeviceFiles = a})
      . _Default
      . _Coerce

-- | Unique identifier of Chrome OS Device (Read-only)
codDeviceId :: Lens' ChromeOSDevice (Maybe Text)
codDeviceId
  = lens _codDeviceId (\ s a -> s{_codDeviceId = a})

-- | Chromebook boot mode (Read-only)
codBootMode :: Lens' ChromeOSDevice (Maybe Text)
codBootMode
  = lens _codBootMode (\ s a -> s{_codBootMode = a})

-- | Trusted Platform Module (TPM) (Read-only)
codTpmVersionInfo :: Lens' ChromeOSDevice (Maybe ChromeOSDeviceTpmVersionInfo)
codTpmVersionInfo
  = lens _codTpmVersionInfo
      (\ s a -> s{_codTpmVersionInfo = a})

-- | Chromebook order number (Read-only)
codOrderNumber :: Lens' ChromeOSDevice (Maybe Text)
codOrderNumber
  = lens _codOrderNumber
      (\ s a -> s{_codOrderNumber = a})

-- | Reports of disk space and other info about mounted\/connected volumes.
codDiskVolumeReports :: Lens' ChromeOSDevice [ChromeOSDeviceDiskVolumeReportsItem]
codDiskVolumeReports
  = lens _codDiskVolumeReports
      (\ s a -> s{_codDiskVolumeReports = a})
      . _Default
      . _Coerce

-- | AssetId specified during enrollment or through later annotation
codAnnotatedAssetId :: Lens' ChromeOSDevice (Maybe Text)
codAnnotatedAssetId
  = lens _codAnnotatedAssetId
      (\ s a -> s{_codAnnotatedAssetId = a})

-- | Notes added by the administrator
codNotes :: Lens' ChromeOSDevice (Maybe Text)
codNotes = lens _codNotes (\ s a -> s{_codNotes = a})

-- | Chromebook serial number (Read-only)
codSerialNumber :: Lens' ChromeOSDevice (Maybe Text)
codSerialNumber
  = lens _codSerialNumber
      (\ s a -> s{_codSerialNumber = a})

-- | Chromebook firmware version (Read-only)
codFirmwareVersion :: Lens' ChromeOSDevice (Maybe Text)
codFirmwareVersion
  = lens _codFirmwareVersion
      (\ s a -> s{_codFirmwareVersion = a})

-- | Chromebook Os Version (Read-only)
codOSVersion :: Lens' ChromeOSDevice (Maybe Text)
codOSVersion
  = lens _codOSVersion (\ s a -> s{_codOSVersion = a})

-- | Total RAM on the device [in bytes] (Read-only)
codSystemRamTotal :: Lens' ChromeOSDevice (Maybe Int64)
codSystemRamTotal
  = lens _codSystemRamTotal
      (\ s a -> s{_codSystemRamTotal = a})
      . mapping _Coerce

instance FromJSON ChromeOSDevice where
        parseJSON
          = withObject "ChromeOSDevice"
              (\ o ->
                 ChromeOSDevice' <$>
                   (o .:? "status") <*> (o .:? "etag") <*>
                     (o .:? "cpuStatusReports" .!= mempty)
                     <*> (o .:? "annotatedUser")
                     <*> (o .:? "systemRamFreeReports" .!= mempty)
                     <*> (o .:? "platformVersion")
                     <*> (o .:? "lastSync")
                     <*> (o .:? "activeTimeRanges" .!= mempty)
                     <*>
                     (o .:? "kind" .!= "admin#directory#chromeosdevice")
                     <*> (o .:? "ethernetMacAddress")
                     <*> (o .:? "lastEnrollmentTime")
                     <*> (o .:? "annotatedLocation")
                     <*> (o .:? "macAddress")
                     <*> (o .:? "orgUnitPath")
                     <*> (o .:? "recentUsers" .!= mempty)
                     <*> (o .:? "supportEndDate")
                     <*> (o .:? "model")
                     <*> (o .:? "willAutoRenew")
                     <*> (o .:? "meid")
                     <*> (o .:? "deviceFiles" .!= mempty)
                     <*> (o .:? "deviceId")
                     <*> (o .:? "bootMode")
                     <*> (o .:? "tpmVersionInfo")
                     <*> (o .:? "orderNumber")
                     <*> (o .:? "diskVolumeReports" .!= mempty)
                     <*> (o .:? "annotatedAssetId")
                     <*> (o .:? "notes")
                     <*> (o .:? "serialNumber")
                     <*> (o .:? "firmwareVersion")
                     <*> (o .:? "osVersion")
                     <*> (o .:? "systemRamTotal"))

instance ToJSON ChromeOSDevice where
        toJSON ChromeOSDevice'{..}
          = object
              (catMaybes
                 [("status" .=) <$> _codStatus,
                  ("etag" .=) <$> _codEtag,
                  ("cpuStatusReports" .=) <$> _codCPUStatusReports,
                  ("annotatedUser" .=) <$> _codAnnotatedUser,
                  ("systemRamFreeReports" .=) <$>
                    _codSystemRamFreeReports,
                  ("platformVersion" .=) <$> _codPlatformVersion,
                  ("lastSync" .=) <$> _codLastSync,
                  ("activeTimeRanges" .=) <$> _codActiveTimeRanges,
                  Just ("kind" .= _codKind),
                  ("ethernetMacAddress" .=) <$> _codEthernetMACAddress,
                  ("lastEnrollmentTime" .=) <$> _codLastEnrollmentTime,
                  ("annotatedLocation" .=) <$> _codAnnotatedLocation,
                  ("macAddress" .=) <$> _codMACAddress,
                  ("orgUnitPath" .=) <$> _codOrgUnitPath,
                  ("recentUsers" .=) <$> _codRecentUsers,
                  ("supportEndDate" .=) <$> _codSupportEndDate,
                  ("model" .=) <$> _codModel,
                  ("willAutoRenew" .=) <$> _codWillAutoRenew,
                  ("meid" .=) <$> _codMeid,
                  ("deviceFiles" .=) <$> _codDeviceFiles,
                  ("deviceId" .=) <$> _codDeviceId,
                  ("bootMode" .=) <$> _codBootMode,
                  ("tpmVersionInfo" .=) <$> _codTpmVersionInfo,
                  ("orderNumber" .=) <$> _codOrderNumber,
                  ("diskVolumeReports" .=) <$> _codDiskVolumeReports,
                  ("annotatedAssetId" .=) <$> _codAnnotatedAssetId,
                  ("notes" .=) <$> _codNotes,
                  ("serialNumber" .=) <$> _codSerialNumber,
                  ("firmwareVersion" .=) <$> _codFirmwareVersion,
                  ("osVersion" .=) <$> _codOSVersion,
                  ("systemRamTotal" .=) <$> _codSystemRamTotal])

-- | JSON response template for List Users operation in Apps Directory API.
--
-- /See:/ 'users' smart constructor.
data Users = Users'
    { _uEtag          :: !(Maybe Text)
    , _uNextPageToken :: !(Maybe Text)
    , _uUsers         :: !(Maybe [User])
    , _uKind          :: !Text
    , _uTriggerEvent  :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Users' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'uEtag'
--
-- * 'uNextPageToken'
--
-- * 'uUsers'
--
-- * 'uKind'
--
-- * 'uTriggerEvent'
users
    :: Users
users =
    Users'
    { _uEtag = Nothing
    , _uNextPageToken = Nothing
    , _uUsers = Nothing
    , _uKind = "admin#directory#users"
    , _uTriggerEvent = Nothing
    }

-- | ETag of the resource.
uEtag :: Lens' Users (Maybe Text)
uEtag = lens _uEtag (\ s a -> s{_uEtag = a})

-- | Token used to access next page of this result.
uNextPageToken :: Lens' Users (Maybe Text)
uNextPageToken
  = lens _uNextPageToken
      (\ s a -> s{_uNextPageToken = a})

-- | List of user objects.
uUsers :: Lens' Users [User]
uUsers
  = lens _uUsers (\ s a -> s{_uUsers = a}) . _Default .
      _Coerce

-- | Kind of resource this is.
uKind :: Lens' Users Text
uKind = lens _uKind (\ s a -> s{_uKind = a})

-- | Event that triggered this response (only used in case of Push Response)
uTriggerEvent :: Lens' Users (Maybe Text)
uTriggerEvent
  = lens _uTriggerEvent
      (\ s a -> s{_uTriggerEvent = a})

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

instance ToJSON Users where
        toJSON Users'{..}
          = object
              (catMaybes
                 [("etag" .=) <$> _uEtag,
                  ("nextPageToken" .=) <$> _uNextPageToken,
                  ("users" .=) <$> _uUsers, Just ("kind" .= _uKind),
                  ("trigger_event" .=) <$> _uTriggerEvent])

-- | The template that returns individual ASP (Access Code) data.
--
-- /See:/ 'asp' smart constructor.
data Asp = Asp'
    { _aCreationTime :: !(Maybe (Textual Int64))
    , _aEtag         :: !(Maybe Text)
    , _aCodeId       :: !(Maybe (Textual Int32))
    , _aKind         :: !Text
    , _aName         :: !(Maybe Text)
    , _aLastTimeUsed :: !(Maybe (Textual Int64))
    , _aUserKey      :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Asp' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'aCreationTime'
--
-- * 'aEtag'
--
-- * 'aCodeId'
--
-- * 'aKind'
--
-- * 'aName'
--
-- * 'aLastTimeUsed'
--
-- * 'aUserKey'
asp
    :: Asp
asp =
    Asp'
    { _aCreationTime = Nothing
    , _aEtag = Nothing
    , _aCodeId = Nothing
    , _aKind = "admin#directory#asp"
    , _aName = Nothing
    , _aLastTimeUsed = Nothing
    , _aUserKey = Nothing
    }

-- | The time when the ASP was created. Expressed in Unix time format.
aCreationTime :: Lens' Asp (Maybe Int64)
aCreationTime
  = lens _aCreationTime
      (\ s a -> s{_aCreationTime = a})
      . mapping _Coerce

-- | ETag of the ASP.
aEtag :: Lens' Asp (Maybe Text)
aEtag = lens _aEtag (\ s a -> s{_aEtag = a})

-- | The unique ID of the ASP.
aCodeId :: Lens' Asp (Maybe Int32)
aCodeId
  = lens _aCodeId (\ s a -> s{_aCodeId = a}) .
      mapping _Coerce

-- | The type of the API resource. This is always admin#directory#asp.
aKind :: Lens' Asp Text
aKind = lens _aKind (\ s a -> s{_aKind = a})

-- | The name of the application that the user, represented by their userId,
-- entered when the ASP was created.
aName :: Lens' Asp (Maybe Text)
aName = lens _aName (\ s a -> s{_aName = a})

-- | The time when the ASP was last used. Expressed in Unix time format.
aLastTimeUsed :: Lens' Asp (Maybe Int64)
aLastTimeUsed
  = lens _aLastTimeUsed
      (\ s a -> s{_aLastTimeUsed = a})
      . mapping _Coerce

-- | The unique ID of the user who issued the ASP.
aUserKey :: Lens' Asp (Maybe Text)
aUserKey = lens _aUserKey (\ s a -> s{_aUserKey = a})

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

instance ToJSON Asp where
        toJSON Asp'{..}
          = object
              (catMaybes
                 [("creationTime" .=) <$> _aCreationTime,
                  ("etag" .=) <$> _aEtag, ("codeId" .=) <$> _aCodeId,
                  Just ("kind" .= _aKind), ("name" .=) <$> _aName,
                  ("lastTimeUsed" .=) <$> _aLastTimeUsed,
                  ("userKey" .=) <$> _aUserKey])

-- | JSON response template for List Schema operation in Directory API.
--
-- /See:/ 'schemas' smart constructor.
data Schemas = Schemas'
    { _sEtag    :: !(Maybe Text)
    , _sSchemas :: !(Maybe [Schema])
    , _sKind    :: !Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Schemas' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'sEtag'
--
-- * 'sSchemas'
--
-- * 'sKind'
schemas
    :: Schemas
schemas =
    Schemas'
    { _sEtag = Nothing
    , _sSchemas = Nothing
    , _sKind = "admin#directory#schemas"
    }

-- | ETag of the resource.
sEtag :: Lens' Schemas (Maybe Text)
sEtag = lens _sEtag (\ s a -> s{_sEtag = a})

-- | List of UserSchema objects.
sSchemas :: Lens' Schemas [Schema]
sSchemas
  = lens _sSchemas (\ s a -> s{_sSchemas = a}) .
      _Default
      . _Coerce

-- | Kind of resource this is.
sKind :: Lens' Schemas Text
sKind = lens _sKind (\ s a -> s{_sKind = a})

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

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

--
-- /See:/ 'chromeOSDeviceDeviceFilesItem' smart constructor.
data ChromeOSDeviceDeviceFilesItem = ChromeOSDeviceDeviceFilesItem'
    { _coddfiName        :: !(Maybe Text)
    , _coddfiDownloadURL :: !(Maybe Text)
    , _coddfiType        :: !(Maybe Text)
    , _coddfiCreateTime  :: !(Maybe DateTime')
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ChromeOSDeviceDeviceFilesItem' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'coddfiName'
--
-- * 'coddfiDownloadURL'
--
-- * 'coddfiType'
--
-- * 'coddfiCreateTime'
chromeOSDeviceDeviceFilesItem
    :: ChromeOSDeviceDeviceFilesItem
chromeOSDeviceDeviceFilesItem =
    ChromeOSDeviceDeviceFilesItem'
    { _coddfiName = Nothing
    , _coddfiDownloadURL = Nothing
    , _coddfiType = Nothing
    , _coddfiCreateTime = Nothing
    }

-- | File name
coddfiName :: Lens' ChromeOSDeviceDeviceFilesItem (Maybe Text)
coddfiName
  = lens _coddfiName (\ s a -> s{_coddfiName = a})

-- | File download URL
coddfiDownloadURL :: Lens' ChromeOSDeviceDeviceFilesItem (Maybe Text)
coddfiDownloadURL
  = lens _coddfiDownloadURL
      (\ s a -> s{_coddfiDownloadURL = a})

-- | File type
coddfiType :: Lens' ChromeOSDeviceDeviceFilesItem (Maybe Text)
coddfiType
  = lens _coddfiType (\ s a -> s{_coddfiType = a})

-- | Date and time the file was created
coddfiCreateTime :: Lens' ChromeOSDeviceDeviceFilesItem (Maybe UTCTime)
coddfiCreateTime
  = lens _coddfiCreateTime
      (\ s a -> s{_coddfiCreateTime = a})
      . mapping _DateTime

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

instance ToJSON ChromeOSDeviceDeviceFilesItem where
        toJSON ChromeOSDeviceDeviceFilesItem'{..}
          = object
              (catMaybes
                 [("name" .=) <$> _coddfiName,
                  ("downloadUrl" .=) <$> _coddfiDownloadURL,
                  ("type" .=) <$> _coddfiType,
                  ("createTime" .=) <$> _coddfiCreateTime])

-- | JSON template for Building List Response object in Directory API.
--
-- /See:/ 'buildings' smart constructor.
data Buildings = Buildings'
    { _bEtag          :: !(Maybe Text)
    , _bNextPageToken :: !(Maybe Text)
    , _bBuildings     :: !(Maybe [Building])
    , _bKind          :: !Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Buildings' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'bEtag'
--
-- * 'bNextPageToken'
--
-- * 'bBuildings'
--
-- * 'bKind'
buildings
    :: Buildings
buildings =
    Buildings'
    { _bEtag = Nothing
    , _bNextPageToken = Nothing
    , _bBuildings = Nothing
    , _bKind = "admin#directory#resources#buildings#buildingsList"
    }

-- | ETag of the resource.
bEtag :: Lens' Buildings (Maybe Text)
bEtag = lens _bEtag (\ s a -> s{_bEtag = a})

-- | The continuation token, used to page through large result sets. Provide
-- this value in a subsequent request to return the next page of results.
bNextPageToken :: Lens' Buildings (Maybe Text)
bNextPageToken
  = lens _bNextPageToken
      (\ s a -> s{_bNextPageToken = a})

-- | The Buildings in this page of results.
bBuildings :: Lens' Buildings [Building]
bBuildings
  = lens _bBuildings (\ s a -> s{_bBuildings = a}) .
      _Default
      . _Coerce

-- | Kind of resource this is.
bKind :: Lens' Buildings Text
bKind = lens _bKind (\ s a -> s{_bKind = a})

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

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

-- | Template for a notification resource.
--
-- /See:/ 'notification' smart constructor.
data Notification = Notification'
    { _nSubject        :: !(Maybe Text)
    , _nEtag           :: !(Maybe Text)
    , _nKind           :: !Text
    , _nBody           :: !(Maybe Text)
    , _nFromAddress    :: !(Maybe Text)
    , _nIsUnread       :: !(Maybe Bool)
    , _nNotificationId :: !(Maybe Text)
    , _nSendTime       :: !(Maybe DateTime')
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Notification' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'nSubject'
--
-- * 'nEtag'
--
-- * 'nKind'
--
-- * 'nBody'
--
-- * 'nFromAddress'
--
-- * 'nIsUnread'
--
-- * 'nNotificationId'
--
-- * 'nSendTime'
notification
    :: Notification
notification =
    Notification'
    { _nSubject = Nothing
    , _nEtag = Nothing
    , _nKind = "admin#directory#notification"
    , _nBody = Nothing
    , _nFromAddress = Nothing
    , _nIsUnread = Nothing
    , _nNotificationId = Nothing
    , _nSendTime = Nothing
    }

-- | Subject of the notification (Read-only)
nSubject :: Lens' Notification (Maybe Text)
nSubject = lens _nSubject (\ s a -> s{_nSubject = a})

-- | ETag of the resource.
nEtag :: Lens' Notification (Maybe Text)
nEtag = lens _nEtag (\ s a -> s{_nEtag = a})

-- | The type of the resource.
nKind :: Lens' Notification Text
nKind = lens _nKind (\ s a -> s{_nKind = a})

-- | Body of the notification (Read-only)
nBody :: Lens' Notification (Maybe Text)
nBody = lens _nBody (\ s a -> s{_nBody = a})

-- | Address from which the notification is received (Read-only)
nFromAddress :: Lens' Notification (Maybe Text)
nFromAddress
  = lens _nFromAddress (\ s a -> s{_nFromAddress = a})

-- | Boolean indicating whether the notification is unread or not.
nIsUnread :: Lens' Notification (Maybe Bool)
nIsUnread
  = lens _nIsUnread (\ s a -> s{_nIsUnread = a})

nNotificationId :: Lens' Notification (Maybe Text)
nNotificationId
  = lens _nNotificationId
      (\ s a -> s{_nNotificationId = a})

-- | Time at which notification was sent (Read-only)
nSendTime :: Lens' Notification (Maybe UTCTime)
nSendTime
  = lens _nSendTime (\ s a -> s{_nSendTime = a}) .
      mapping _DateTime

instance FromJSON Notification where
        parseJSON
          = withObject "Notification"
              (\ o ->
                 Notification' <$>
                   (o .:? "subject") <*> (o .:? "etag") <*>
                     (o .:? "kind" .!= "admin#directory#notification")
                     <*> (o .:? "body")
                     <*> (o .:? "fromAddress")
                     <*> (o .:? "isUnread")
                     <*> (o .:? "notificationId")
                     <*> (o .:? "sendTime"))

instance ToJSON Notification where
        toJSON Notification'{..}
          = object
              (catMaybes
                 [("subject" .=) <$> _nSubject,
                  ("etag" .=) <$> _nEtag, Just ("kind" .= _nKind),
                  ("body" .=) <$> _nBody,
                  ("fromAddress" .=) <$> _nFromAddress,
                  ("isUnread" .=) <$> _nIsUnread,
                  ("notificationId" .=) <$> _nNotificationId,
                  ("sendTime" .=) <$> _nSendTime])

-- | JSON template for instant messenger of an user.
--
-- /See:/ 'userIm' smart constructor.
data UserIm = UserIm'
    { _uiIm             :: !(Maybe Text)
    , _uiProtocol       :: !(Maybe Text)
    , _uiPrimary        :: !(Maybe Bool)
    , _uiCustomProtocol :: !(Maybe Text)
    , _uiType           :: !(Maybe Text)
    , _uiCustomType     :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'UserIm' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'uiIm'
--
-- * 'uiProtocol'
--
-- * 'uiPrimary'
--
-- * 'uiCustomProtocol'
--
-- * 'uiType'
--
-- * 'uiCustomType'
userIm
    :: UserIm
userIm =
    UserIm'
    { _uiIm = Nothing
    , _uiProtocol = Nothing
    , _uiPrimary = Nothing
    , _uiCustomProtocol = Nothing
    , _uiType = Nothing
    , _uiCustomType = Nothing
    }

-- | Instant messenger id.
uiIm :: Lens' UserIm (Maybe Text)
uiIm = lens _uiIm (\ s a -> s{_uiIm = a})

-- | 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.
uiProtocol :: Lens' UserIm (Maybe Text)
uiProtocol
  = lens _uiProtocol (\ s a -> s{_uiProtocol = a})

-- | If this is user\'s primary im. Only one entry could be marked as
-- primary.
uiPrimary :: Lens' UserIm (Maybe Bool)
uiPrimary
  = lens _uiPrimary (\ s a -> s{_uiPrimary = a})

-- | Custom protocol.
uiCustomProtocol :: Lens' UserIm (Maybe Text)
uiCustomProtocol
  = lens _uiCustomProtocol
      (\ s a -> s{_uiCustomProtocol = a})

-- | 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.
uiType :: Lens' UserIm (Maybe Text)
uiType = lens _uiType (\ s a -> s{_uiType = a})

-- | Custom type.
uiCustomType :: Lens' UserIm (Maybe Text)
uiCustomType
  = lens _uiCustomType (\ s a -> s{_uiCustomType = a})

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

instance ToJSON UserIm where
        toJSON UserIm'{..}
          = object
              (catMaybes
                 [("im" .=) <$> _uiIm,
                  ("protocol" .=) <$> _uiProtocol,
                  ("primary" .=) <$> _uiPrimary,
                  ("customProtocol" .=) <$> _uiCustomProtocol,
                  ("type" .=) <$> _uiType,
                  ("customType" .=) <$> _uiCustomType])

-- | JSON response template for List tokens operation in Directory API.
--
-- /See:/ 'tokens' smart constructor.
data Tokens = Tokens'
    { _tEtag  :: !(Maybe Text)
    , _tKind  :: !Text
    , _tItems :: !(Maybe [Token])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Tokens' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'tEtag'
--
-- * 'tKind'
--
-- * 'tItems'
tokens
    :: Tokens
tokens =
    Tokens'
    { _tEtag = Nothing
    , _tKind = "admin#directory#tokenList"
    , _tItems = Nothing
    }

-- | ETag of the resource.
tEtag :: Lens' Tokens (Maybe Text)
tEtag = lens _tEtag (\ s a -> s{_tEtag = a})

-- | The type of the API resource. This is always admin#directory#tokenList.
tKind :: Lens' Tokens Text
tKind = lens _tKind (\ s a -> s{_tKind = a})

-- | A list of Token resources.
tItems :: Lens' Tokens [Token]
tItems
  = lens _tItems (\ s a -> s{_tItems = a}) . _Default .
      _Coerce

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

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

-- | Custom fields of the user.
--
-- /See:/ 'userCustomSchemas' smart constructor.
newtype UserCustomSchemas = UserCustomSchemas'
    { _ucsAddtional :: HashMap Text UserCustomProperties
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'UserCustomSchemas' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ucsAddtional'
userCustomSchemas
    :: HashMap Text UserCustomProperties -- ^ 'ucsAddtional'
    -> UserCustomSchemas
userCustomSchemas pUcsAddtional_ =
    UserCustomSchemas'
    { _ucsAddtional = _Coerce # pUcsAddtional_
    }

ucsAddtional :: Lens' UserCustomSchemas (HashMap Text UserCustomProperties)
ucsAddtional
  = lens _ucsAddtional (\ s a -> s{_ucsAddtional = a})
      . _Coerce

instance FromJSON UserCustomSchemas where
        parseJSON
          = withObject "UserCustomSchemas"
              (\ o -> UserCustomSchemas' <$> (parseJSONObject o))

instance ToJSON UserCustomSchemas where
        toJSON = toJSON . _ucsAddtional

-- | JSON template for a keyword entry.
--
-- /See:/ 'userKeyword' smart constructor.
data UserKeyword = UserKeyword'
    { _ukValue      :: !(Maybe Text)
    , _ukType       :: !(Maybe Text)
    , _ukCustomType :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'UserKeyword' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ukValue'
--
-- * 'ukType'
--
-- * 'ukCustomType'
userKeyword
    :: UserKeyword
userKeyword =
    UserKeyword'
    { _ukValue = Nothing
    , _ukType = Nothing
    , _ukCustomType = Nothing
    }

-- | Keyword.
ukValue :: Lens' UserKeyword (Maybe Text)
ukValue = lens _ukValue (\ s a -> s{_ukValue = a})

-- | 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.
ukType :: Lens' UserKeyword (Maybe Text)
ukType = lens _ukType (\ s a -> s{_ukType = a})

-- | Custom Type.
ukCustomType :: Lens' UserKeyword (Maybe Text)
ukCustomType
  = lens _ukCustomType (\ s a -> s{_ukCustomType = a})

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

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

-- | JSON response template to list domain aliases in Directory API.
--
-- /See:/ 'domainAliases' smart constructor.
data DomainAliases = DomainAliases'
    { _daEtag          :: !(Maybe Text)
    , _daKind          :: !Text
    , _daDomainAliases :: !(Maybe [DomainAlias])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'DomainAliases' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'daEtag'
--
-- * 'daKind'
--
-- * 'daDomainAliases'
domainAliases
    :: DomainAliases
domainAliases =
    DomainAliases'
    { _daEtag = Nothing
    , _daKind = "admin#directory#domainAliases"
    , _daDomainAliases = Nothing
    }

-- | ETag of the resource.
daEtag :: Lens' DomainAliases (Maybe Text)
daEtag = lens _daEtag (\ s a -> s{_daEtag = a})

-- | Kind of resource this is.
daKind :: Lens' DomainAliases Text
daKind = lens _daKind (\ s a -> s{_daKind = a})

-- | List of domain alias objects.
daDomainAliases :: Lens' DomainAliases [DomainAlias]
daDomainAliases
  = lens _daDomainAliases
      (\ s a -> s{_daDomainAliases = a})
      . _Default
      . _Coerce

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

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

-- | JSON response template to list aliases in Directory API.
--
-- /See:/ 'aliases' smart constructor.
data Aliases = Aliases'
    { _aliEtag    :: !(Maybe Text)
    , _aliKind    :: !Text
    , _aliAliases :: !(Maybe [JSONValue])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Aliases' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'aliEtag'
--
-- * 'aliKind'
--
-- * 'aliAliases'
aliases
    :: Aliases
aliases =
    Aliases'
    { _aliEtag = Nothing
    , _aliKind = "admin#directory#aliases"
    , _aliAliases = Nothing
    }

-- | ETag of the resource.
aliEtag :: Lens' Aliases (Maybe Text)
aliEtag = lens _aliEtag (\ s a -> s{_aliEtag = a})

-- | Kind of resource this is.
aliKind :: Lens' Aliases Text
aliKind = lens _aliKind (\ s a -> s{_aliKind = a})

-- | List of alias objects.
aliAliases :: Lens' Aliases [JSONValue]
aliAliases
  = lens _aliAliases (\ s a -> s{_aliAliases = a}) .
      _Default
      . _Coerce

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

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

-- | JSON template for Calendar Resource object in Directory API.
--
-- /See:/ 'calendarResource' smart constructor.
data CalendarResource = CalendarResource'
    { _crEtags                  :: !(Maybe Text)
    , _crResourceId             :: !(Maybe Text)
    , _crResourceType           :: !(Maybe Text)
    , _crResourceName           :: !(Maybe Text)
    , _crKind                   :: !Text
    , _crBuildingId             :: !(Maybe Text)
    , _crFeatureInstances       :: !(Maybe JSONValue)
    , _crResourceEmail          :: !(Maybe Text)
    , _crCapacity               :: !(Maybe (Textual Int32))
    , _crResourceDescription    :: !(Maybe Text)
    , _crFloorName              :: !(Maybe Text)
    , _crGeneratedResourceName  :: !(Maybe Text)
    , _crResourceCategory       :: !(Maybe Text)
    , _crFloorSection           :: !(Maybe Text)
    , _crUserVisibleDescription :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'CalendarResource' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'crEtags'
--
-- * 'crResourceId'
--
-- * 'crResourceType'
--
-- * 'crResourceName'
--
-- * 'crKind'
--
-- * 'crBuildingId'
--
-- * 'crFeatureInstances'
--
-- * 'crResourceEmail'
--
-- * 'crCapacity'
--
-- * 'crResourceDescription'
--
-- * 'crFloorName'
--
-- * 'crGeneratedResourceName'
--
-- * 'crResourceCategory'
--
-- * 'crFloorSection'
--
-- * 'crUserVisibleDescription'
calendarResource
    :: CalendarResource
calendarResource =
    CalendarResource'
    { _crEtags = Nothing
    , _crResourceId = Nothing
    , _crResourceType = Nothing
    , _crResourceName = Nothing
    , _crKind = "admin#directory#resources#calendars#CalendarResource"
    , _crBuildingId = Nothing
    , _crFeatureInstances = Nothing
    , _crResourceEmail = Nothing
    , _crCapacity = Nothing
    , _crResourceDescription = Nothing
    , _crFloorName = Nothing
    , _crGeneratedResourceName = Nothing
    , _crResourceCategory = Nothing
    , _crFloorSection = Nothing
    , _crUserVisibleDescription = Nothing
    }

-- | ETag of the resource.
crEtags :: Lens' CalendarResource (Maybe Text)
crEtags = lens _crEtags (\ s a -> s{_crEtags = a})

-- | The unique ID for the calendar resource.
crResourceId :: Lens' CalendarResource (Maybe Text)
crResourceId
  = lens _crResourceId (\ s a -> s{_crResourceId = a})

-- | The type of the calendar resource, intended for non-room resources.
crResourceType :: Lens' CalendarResource (Maybe Text)
crResourceType
  = lens _crResourceType
      (\ s a -> s{_crResourceType = a})

-- | The name of the calendar resource. For example, \"Training Room 1A\".
crResourceName :: Lens' CalendarResource (Maybe Text)
crResourceName
  = lens _crResourceName
      (\ s a -> s{_crResourceName = a})

-- | The type of the resource. For calendar resources, the value is
-- admin#directory#resources#calendars#CalendarResource.
crKind :: Lens' CalendarResource Text
crKind = lens _crKind (\ s a -> s{_crKind = a})

-- | Unique ID for the building a resource is located in.
crBuildingId :: Lens' CalendarResource (Maybe Text)
crBuildingId
  = lens _crBuildingId (\ s a -> s{_crBuildingId = a})

crFeatureInstances :: Lens' CalendarResource (Maybe JSONValue)
crFeatureInstances
  = lens _crFeatureInstances
      (\ s a -> s{_crFeatureInstances = a})

-- | The read-only email for the calendar resource. Generated as part of
-- creating a new calendar resource.
crResourceEmail :: Lens' CalendarResource (Maybe Text)
crResourceEmail
  = lens _crResourceEmail
      (\ s a -> s{_crResourceEmail = a})

-- | Capacity of a resource, number of seats in a room.
crCapacity :: Lens' CalendarResource (Maybe Int32)
crCapacity
  = lens _crCapacity (\ s a -> s{_crCapacity = a}) .
      mapping _Coerce

-- | Description of the resource, visible only to admins.
crResourceDescription :: Lens' CalendarResource (Maybe Text)
crResourceDescription
  = lens _crResourceDescription
      (\ s a -> s{_crResourceDescription = a})

-- | Name of the floor a resource is located on.
crFloorName :: Lens' CalendarResource (Maybe Text)
crFloorName
  = lens _crFloorName (\ s a -> s{_crFloorName = a})

-- | 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)\".
crGeneratedResourceName :: Lens' CalendarResource (Maybe Text)
crGeneratedResourceName
  = lens _crGeneratedResourceName
      (\ s a -> s{_crGeneratedResourceName = a})

-- | The category of the calendar resource. Either CONFERENCE_ROOM or OTHER.
-- Legacy data is set to CATEGORY_UNKNOWN.
crResourceCategory :: Lens' CalendarResource (Maybe Text)
crResourceCategory
  = lens _crResourceCategory
      (\ s a -> s{_crResourceCategory = a})

-- | Name of the section within a floor a resource is located in.
crFloorSection :: Lens' CalendarResource (Maybe Text)
crFloorSection
  = lens _crFloorSection
      (\ s a -> s{_crFloorSection = a})

-- | Description of the resource, visible to users and admins.
crUserVisibleDescription :: Lens' CalendarResource (Maybe Text)
crUserVisibleDescription
  = lens _crUserVisibleDescription
      (\ s a -> s{_crUserVisibleDescription = a})

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

instance ToJSON CalendarResource where
        toJSON CalendarResource'{..}
          = object
              (catMaybes
                 [("etags" .=) <$> _crEtags,
                  ("resourceId" .=) <$> _crResourceId,
                  ("resourceType" .=) <$> _crResourceType,
                  ("resourceName" .=) <$> _crResourceName,
                  Just ("kind" .= _crKind),
                  ("buildingId" .=) <$> _crBuildingId,
                  ("featureInstances" .=) <$> _crFeatureInstances,
                  ("resourceEmail" .=) <$> _crResourceEmail,
                  ("capacity" .=) <$> _crCapacity,
                  ("resourceDescription" .=) <$>
                    _crResourceDescription,
                  ("floorName" .=) <$> _crFloorName,
                  ("generatedResourceName" .=) <$>
                    _crGeneratedResourceName,
                  ("resourceCategory" .=) <$> _crResourceCategory,
                  ("floorSection" .=) <$> _crFloorSection,
                  ("userVisibleDescription" .=) <$>
                    _crUserVisibleDescription])

-- | JSON request template to undelete a user in Directory API.
--
-- /See:/ 'userUndelete' smart constructor.
newtype UserUndelete = UserUndelete'
    { _uuOrgUnitPath :: Maybe Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'UserUndelete' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'uuOrgUnitPath'
userUndelete
    :: UserUndelete
userUndelete =
    UserUndelete'
    { _uuOrgUnitPath = Nothing
    }

-- | OrgUnit of User
uuOrgUnitPath :: Lens' UserUndelete (Maybe Text)
uuOrgUnitPath
  = lens _uuOrgUnitPath
      (\ s a -> s{_uuOrgUnitPath = a})

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

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

-- | JSON response template for List Members operation in Directory API.
--
-- /See:/ 'members' smart constructor.
data Members = Members'
    { _mEtag          :: !(Maybe Text)
    , _mNextPageToken :: !(Maybe Text)
    , _mKind          :: !Text
    , _mMembers       :: !(Maybe [Member])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Members' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'mEtag'
--
-- * 'mNextPageToken'
--
-- * 'mKind'
--
-- * 'mMembers'
members
    :: Members
members =
    Members'
    { _mEtag = Nothing
    , _mNextPageToken = Nothing
    , _mKind = "admin#directory#members"
    , _mMembers = Nothing
    }

-- | ETag of the resource.
mEtag :: Lens' Members (Maybe Text)
mEtag = lens _mEtag (\ s a -> s{_mEtag = a})

-- | Token used to access next page of this result.
mNextPageToken :: Lens' Members (Maybe Text)
mNextPageToken
  = lens _mNextPageToken
      (\ s a -> s{_mNextPageToken = a})

-- | Kind of resource this is.
mKind :: Lens' Members Text
mKind = lens _mKind (\ s a -> s{_mKind = a})

-- | List of member objects.
mMembers :: Lens' Members [Member]
mMembers
  = lens _mMembers (\ s a -> s{_mMembers = a}) .
      _Default
      . _Coerce

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

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

-- | An notification channel used to watch for resource changes.
--
-- /See:/ 'channel' smart constructor.
data Channel = Channel'
    { _cResourceURI :: !(Maybe Text)
    , _cResourceId  :: !(Maybe Text)
    , _cKind        :: !Text
    , _cExpiration  :: !(Maybe (Textual Int64))
    , _cToken       :: !(Maybe Text)
    , _cAddress     :: !(Maybe Text)
    , _cPayload     :: !(Maybe Bool)
    , _cParams      :: !(Maybe ChannelParams)
    , _cId          :: !(Maybe Text)
    , _cType        :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Channel' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'cResourceURI'
--
-- * 'cResourceId'
--
-- * 'cKind'
--
-- * 'cExpiration'
--
-- * 'cToken'
--
-- * 'cAddress'
--
-- * 'cPayload'
--
-- * 'cParams'
--
-- * 'cId'
--
-- * 'cType'
channel
    :: Channel
channel =
    Channel'
    { _cResourceURI = Nothing
    , _cResourceId = Nothing
    , _cKind = "api#channel"
    , _cExpiration = Nothing
    , _cToken = Nothing
    , _cAddress = Nothing
    , _cPayload = Nothing
    , _cParams = Nothing
    , _cId = Nothing
    , _cType = Nothing
    }

-- | A version-specific identifier for the watched resource.
cResourceURI :: Lens' Channel (Maybe Text)
cResourceURI
  = lens _cResourceURI (\ s a -> s{_cResourceURI = a})

-- | An opaque ID that identifies the resource being watched on this channel.
-- Stable across different API versions.
cResourceId :: Lens' Channel (Maybe Text)
cResourceId
  = lens _cResourceId (\ s a -> s{_cResourceId = a})

-- | Identifies this as a notification channel used to watch for changes to a
-- resource. Value: the fixed string \"api#channel\".
cKind :: Lens' Channel Text
cKind = lens _cKind (\ s a -> s{_cKind = a})

-- | Date and time of notification channel expiration, expressed as a Unix
-- timestamp, in milliseconds. Optional.
cExpiration :: Lens' Channel (Maybe Int64)
cExpiration
  = lens _cExpiration (\ s a -> s{_cExpiration = a}) .
      mapping _Coerce

-- | An arbitrary string delivered to the target address with each
-- notification delivered over this channel. Optional.
cToken :: Lens' Channel (Maybe Text)
cToken = lens _cToken (\ s a -> s{_cToken = a})

-- | The address where notifications are delivered for this channel.
cAddress :: Lens' Channel (Maybe Text)
cAddress = lens _cAddress (\ s a -> s{_cAddress = a})

-- | A Boolean value to indicate whether payload is wanted. Optional.
cPayload :: Lens' Channel (Maybe Bool)
cPayload = lens _cPayload (\ s a -> s{_cPayload = a})

-- | Additional parameters controlling delivery channel behavior. Optional.
cParams :: Lens' Channel (Maybe ChannelParams)
cParams = lens _cParams (\ s a -> s{_cParams = a})

-- | A UUID or similar unique string that identifies this channel.
cId :: Lens' Channel (Maybe Text)
cId = lens _cId (\ s a -> s{_cId = a})

-- | The type of delivery mechanism used for this channel.
cType :: Lens' Channel (Maybe Text)
cType = lens _cType (\ s a -> s{_cType = a})

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

instance ToJSON Channel where
        toJSON Channel'{..}
          = object
              (catMaybes
                 [("resourceUri" .=) <$> _cResourceURI,
                  ("resourceId" .=) <$> _cResourceId,
                  Just ("kind" .= _cKind),
                  ("expiration" .=) <$> _cExpiration,
                  ("token" .=) <$> _cToken,
                  ("address" .=) <$> _cAddress,
                  ("payload" .=) <$> _cPayload,
                  ("params" .=) <$> _cParams, ("id" .=) <$> _cId,
                  ("type" .=) <$> _cType])

-- | JSON response template for List Mobile Devices operation in Directory
-- API.
--
-- /See:/ 'mobileDevices' smart constructor.
data MobileDevices = MobileDevices'
    { _mdEtag          :: !(Maybe Text)
    , _mdNextPageToken :: !(Maybe Text)
    , _mdKind          :: !Text
    , _mdMobileDevices :: !(Maybe [MobileDevice])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'MobileDevices' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'mdEtag'
--
-- * 'mdNextPageToken'
--
-- * 'mdKind'
--
-- * 'mdMobileDevices'
mobileDevices
    :: MobileDevices
mobileDevices =
    MobileDevices'
    { _mdEtag = Nothing
    , _mdNextPageToken = Nothing
    , _mdKind = "admin#directory#mobiledevices"
    , _mdMobileDevices = Nothing
    }

-- | ETag of the resource.
mdEtag :: Lens' MobileDevices (Maybe Text)
mdEtag = lens _mdEtag (\ s a -> s{_mdEtag = a})

-- | Token used to access next page of this result.
mdNextPageToken :: Lens' MobileDevices (Maybe Text)
mdNextPageToken
  = lens _mdNextPageToken
      (\ s a -> s{_mdNextPageToken = a})

-- | Kind of resource this is.
mdKind :: Lens' MobileDevices Text
mdKind = lens _mdKind (\ s a -> s{_mdKind = a})

-- | List of Mobile Device objects.
mdMobileDevices :: Lens' MobileDevices [MobileDevice]
mdMobileDevices
  = lens _mdMobileDevices
      (\ s a -> s{_mdMobileDevices = a})
      . _Default
      . _Coerce

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

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

-- | JSON template for token resource in Directory API.
--
-- /See:/ 'token' smart constructor.
data Token = Token'
    { _tokClientId    :: !(Maybe Text)
    , _tokEtag        :: !(Maybe Text)
    , _tokDisplayText :: !(Maybe Text)
    , _tokKind        :: !Text
    , _tokScopes      :: !(Maybe [Text])
    , _tokNATiveApp   :: !(Maybe Bool)
    , _tokAnonymous   :: !(Maybe Bool)
    , _tokUserKey     :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Token' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'tokClientId'
--
-- * 'tokEtag'
--
-- * 'tokDisplayText'
--
-- * 'tokKind'
--
-- * 'tokScopes'
--
-- * 'tokNATiveApp'
--
-- * 'tokAnonymous'
--
-- * 'tokUserKey'
token
    :: Token
token =
    Token'
    { _tokClientId = Nothing
    , _tokEtag = Nothing
    , _tokDisplayText = Nothing
    , _tokKind = "admin#directory#token"
    , _tokScopes = Nothing
    , _tokNATiveApp = Nothing
    , _tokAnonymous = Nothing
    , _tokUserKey = Nothing
    }

-- | The Client ID of the application the token is issued to.
tokClientId :: Lens' Token (Maybe Text)
tokClientId
  = lens _tokClientId (\ s a -> s{_tokClientId = a})

-- | ETag of the resource.
tokEtag :: Lens' Token (Maybe Text)
tokEtag = lens _tokEtag (\ s a -> s{_tokEtag = a})

-- | The displayable name of the application the token is issued to.
tokDisplayText :: Lens' Token (Maybe Text)
tokDisplayText
  = lens _tokDisplayText
      (\ s a -> s{_tokDisplayText = a})

-- | The type of the API resource. This is always admin#directory#token.
tokKind :: Lens' Token Text
tokKind = lens _tokKind (\ s a -> s{_tokKind = a})

-- | A list of authorization scopes the application is granted.
tokScopes :: Lens' Token [Text]
tokScopes
  = lens _tokScopes (\ s a -> s{_tokScopes = a}) .
      _Default
      . _Coerce

-- | Whether the token is issued to an installed application. The value is
-- true if the application is installed to a desktop or mobile device.
tokNATiveApp :: Lens' Token (Maybe Bool)
tokNATiveApp
  = lens _tokNATiveApp (\ s a -> s{_tokNATiveApp = a})

-- | Whether the application is registered with Google. The value is true if
-- the application has an anonymous Client ID.
tokAnonymous :: Lens' Token (Maybe Bool)
tokAnonymous
  = lens _tokAnonymous (\ s a -> s{_tokAnonymous = a})

-- | The unique ID of the user that issued the token.
tokUserKey :: Lens' Token (Maybe Text)
tokUserKey
  = lens _tokUserKey (\ s a -> s{_tokUserKey = a})

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

instance ToJSON Token where
        toJSON Token'{..}
          = object
              (catMaybes
                 [("clientId" .=) <$> _tokClientId,
                  ("etag" .=) <$> _tokEtag,
                  ("displayText" .=) <$> _tokDisplayText,
                  Just ("kind" .= _tokKind),
                  ("scopes" .=) <$> _tokScopes,
                  ("nativeApp" .=) <$> _tokNATiveApp,
                  ("anonymous" .=) <$> _tokAnonymous,
                  ("userKey" .=) <$> _tokUserKey])

-- | JSON template for name of a user in Directory API.
--
-- /See:/ 'userName' smart constructor.
data UserName = UserName'
    { _unGivenName  :: !(Maybe Text)
    , _unFullName   :: !(Maybe Text)
    , _unFamilyName :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'UserName' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'unGivenName'
--
-- * 'unFullName'
--
-- * 'unFamilyName'
userName
    :: UserName
userName =
    UserName'
    { _unGivenName = Nothing
    , _unFullName = Nothing
    , _unFamilyName = Nothing
    }

-- | First Name
unGivenName :: Lens' UserName (Maybe Text)
unGivenName
  = lens _unGivenName (\ s a -> s{_unGivenName = a})

-- | Full Name
unFullName :: Lens' UserName (Maybe Text)
unFullName
  = lens _unFullName (\ s a -> s{_unFullName = a})

-- | Last Name
unFamilyName :: Lens' UserName (Maybe Text)
unFamilyName
  = lens _unFamilyName (\ s a -> s{_unFamilyName = a})

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

instance ToJSON UserName where
        toJSON UserName'{..}
          = object
              (catMaybes
                 [("givenName" .=) <$> _unGivenName,
                  ("fullName" .=) <$> _unFullName,
                  ("familyName" .=) <$> _unFamilyName])

-- | JSON template for Building object in Directory API.
--
-- /See:/ 'building' smart constructor.
data Building = Building'
    { _buiEtags        :: !(Maybe Text)
    , _buiKind         :: !Text
    , _buiBuildingId   :: !(Maybe Text)
    , _buiCoordinates  :: !(Maybe BuildingCoordinates)
    , _buiBuildingName :: !(Maybe Text)
    , _buiFloorNames   :: !(Maybe [Text])
    , _buiDescription  :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Building' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'buiEtags'
--
-- * 'buiKind'
--
-- * 'buiBuildingId'
--
-- * 'buiCoordinates'
--
-- * 'buiBuildingName'
--
-- * 'buiFloorNames'
--
-- * 'buiDescription'
building
    :: Building
building =
    Building'
    { _buiEtags = Nothing
    , _buiKind = "admin#directory#resources#buildings#Building"
    , _buiBuildingId = Nothing
    , _buiCoordinates = Nothing
    , _buiBuildingName = Nothing
    , _buiFloorNames = Nothing
    , _buiDescription = Nothing
    }

-- | ETag of the resource.
buiEtags :: Lens' Building (Maybe Text)
buiEtags = lens _buiEtags (\ s a -> s{_buiEtags = a})

-- | Kind of resource this is.
buiKind :: Lens' Building Text
buiKind = lens _buiKind (\ s a -> s{_buiKind = a})

-- | Unique identifier for the building. The maximum length is 100
-- characters.
buiBuildingId :: Lens' Building (Maybe Text)
buiBuildingId
  = lens _buiBuildingId
      (\ s a -> s{_buiBuildingId = a})

-- | The geographic coordinates of the center of the building, expressed as
-- latitude and longitude in decimal degrees.
buiCoordinates :: Lens' Building (Maybe BuildingCoordinates)
buiCoordinates
  = lens _buiCoordinates
      (\ s a -> s{_buiCoordinates = a})

-- | 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.
buiBuildingName :: Lens' Building (Maybe Text)
buiBuildingName
  = lens _buiBuildingName
      (\ s a -> s{_buiBuildingName = a})

-- | 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.
buiFloorNames :: Lens' Building [Text]
buiFloorNames
  = lens _buiFloorNames
      (\ s a -> s{_buiFloorNames = a})
      . _Default
      . _Coerce

-- | A brief description of the building. For example, \"Chelsea Market\".
buiDescription :: Lens' Building (Maybe Text)
buiDescription
  = lens _buiDescription
      (\ s a -> s{_buiDescription = a})

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

instance ToJSON Building where
        toJSON Building'{..}
          = object
              (catMaybes
                 [("etags" .=) <$> _buiEtags,
                  Just ("kind" .= _buiKind),
                  ("buildingId" .=) <$> _buiBuildingId,
                  ("coordinates" .=) <$> _buiCoordinates,
                  ("buildingName" .=) <$> _buiBuildingName,
                  ("floorNames" .=) <$> _buiFloorNames,
                  ("description" .=) <$> _buiDescription])

--
-- /See:/ 'chromeOSDeviceRecentUsersItem' smart constructor.
data ChromeOSDeviceRecentUsersItem = ChromeOSDeviceRecentUsersItem'
    { _codruiEmail :: !(Maybe Text)
    , _codruiType  :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ChromeOSDeviceRecentUsersItem' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'codruiEmail'
--
-- * 'codruiType'
chromeOSDeviceRecentUsersItem
    :: ChromeOSDeviceRecentUsersItem
chromeOSDeviceRecentUsersItem =
    ChromeOSDeviceRecentUsersItem'
    { _codruiEmail = Nothing
    , _codruiType = Nothing
    }

-- | Email address of the user. Present only if the user type is managed
codruiEmail :: Lens' ChromeOSDeviceRecentUsersItem (Maybe Text)
codruiEmail
  = lens _codruiEmail (\ s a -> s{_codruiEmail = a})

-- | The type of the user
codruiType :: Lens' ChromeOSDeviceRecentUsersItem (Maybe Text)
codruiType
  = lens _codruiType (\ s a -> s{_codruiType = a})

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

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

-- | JSON template for Domain Alias object in Directory API.
--
-- /See:/ 'domainAlias' smart constructor.
data DomainAlias = DomainAlias'
    { _dCreationTime     :: !(Maybe (Textual Int64))
    , _dEtag             :: !(Maybe Text)
    , _dKind             :: !Text
    , _dVerified         :: !(Maybe Bool)
    , _dDomainAliasName  :: !(Maybe Text)
    , _dParentDomainName :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'DomainAlias' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'dCreationTime'
--
-- * 'dEtag'
--
-- * 'dKind'
--
-- * 'dVerified'
--
-- * 'dDomainAliasName'
--
-- * 'dParentDomainName'
domainAlias
    :: DomainAlias
domainAlias =
    DomainAlias'
    { _dCreationTime = Nothing
    , _dEtag = Nothing
    , _dKind = "admin#directory#domainAlias"
    , _dVerified = Nothing
    , _dDomainAliasName = Nothing
    , _dParentDomainName = Nothing
    }

-- | The creation time of the domain alias. (Read-only).
dCreationTime :: Lens' DomainAlias (Maybe Int64)
dCreationTime
  = lens _dCreationTime
      (\ s a -> s{_dCreationTime = a})
      . mapping _Coerce

-- | ETag of the resource.
dEtag :: Lens' DomainAlias (Maybe Text)
dEtag = lens _dEtag (\ s a -> s{_dEtag = a})

-- | Kind of resource this is.
dKind :: Lens' DomainAlias Text
dKind = lens _dKind (\ s a -> s{_dKind = a})

-- | Indicates the verification state of a domain alias. (Read-only)
dVerified :: Lens' DomainAlias (Maybe Bool)
dVerified
  = lens _dVerified (\ s a -> s{_dVerified = a})

-- | The domain alias name.
dDomainAliasName :: Lens' DomainAlias (Maybe Text)
dDomainAliasName
  = lens _dDomainAliasName
      (\ s a -> s{_dDomainAliasName = a})

-- | The parent domain name that the domain alias is associated with. This
-- can either be a primary or secondary domain name within a customer.
dParentDomainName :: Lens' DomainAlias (Maybe Text)
dParentDomainName
  = lens _dParentDomainName
      (\ s a -> s{_dParentDomainName = a})

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

instance ToJSON DomainAlias where
        toJSON DomainAlias'{..}
          = object
              (catMaybes
                 [("creationTime" .=) <$> _dCreationTime,
                  ("etag" .=) <$> _dEtag, Just ("kind" .= _dKind),
                  ("verified" .=) <$> _dVerified,
                  ("domainAliasName" .=) <$> _dDomainAliasName,
                  ("parentDomainName" .=) <$> _dParentDomainName])

--
-- /See:/ 'userGender' smart constructor.
data UserGender = UserGender'
    { _ugAddressMeAs  :: !(Maybe Text)
    , _ugCustomGender :: !(Maybe Text)
    , _ugType         :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'UserGender' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ugAddressMeAs'
--
-- * 'ugCustomGender'
--
-- * 'ugType'
userGender
    :: UserGender
userGender =
    UserGender'
    { _ugAddressMeAs = Nothing
    , _ugCustomGender = Nothing
    , _ugType = Nothing
    }

-- | 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\".
ugAddressMeAs :: Lens' UserGender (Maybe Text)
ugAddressMeAs
  = lens _ugAddressMeAs
      (\ s a -> s{_ugAddressMeAs = a})

-- | Custom gender.
ugCustomGender :: Lens' UserGender (Maybe Text)
ugCustomGender
  = lens _ugCustomGender
      (\ s a -> s{_ugCustomGender = a})

-- | Gender.
ugType :: Lens' UserGender (Maybe Text)
ugType = lens _ugType (\ s a -> s{_ugType = a})

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

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

-- | JSON template for Alias object in Directory API.
--
-- /See:/ 'alias' smart constructor.
data Alias = Alias'
    { _aaEtag         :: !(Maybe Text)
    , _aaKind         :: !Text
    , _aaAlias        :: !(Maybe Text)
    , _aaId           :: !(Maybe Text)
    , _aaPrimaryEmail :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Alias' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'aaEtag'
--
-- * 'aaKind'
--
-- * 'aaAlias'
--
-- * 'aaId'
--
-- * 'aaPrimaryEmail'
alias
    :: Alias
alias =
    Alias'
    { _aaEtag = Nothing
    , _aaKind = "admin#directory#alias"
    , _aaAlias = Nothing
    , _aaId = Nothing
    , _aaPrimaryEmail = Nothing
    }

-- | ETag of the resource.
aaEtag :: Lens' Alias (Maybe Text)
aaEtag = lens _aaEtag (\ s a -> s{_aaEtag = a})

-- | Kind of resource this is.
aaKind :: Lens' Alias Text
aaKind = lens _aaKind (\ s a -> s{_aaKind = a})

-- | A alias email
aaAlias :: Lens' Alias (Maybe Text)
aaAlias = lens _aaAlias (\ s a -> s{_aaAlias = a})

-- | Unique id of the group (Read-only) Unique id of the user (Read-only)
aaId :: Lens' Alias (Maybe Text)
aaId = lens _aaId (\ s a -> s{_aaId = a})

-- | Group\'s primary email (Read-only) User\'s primary email (Read-only)
aaPrimaryEmail :: Lens' Alias (Maybe Text)
aaPrimaryEmail
  = lens _aaPrimaryEmail
      (\ s a -> s{_aaPrimaryEmail = a})

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

instance ToJSON Alias where
        toJSON Alias'{..}
          = object
              (catMaybes
                 [("etag" .=) <$> _aaEtag, Just ("kind" .= _aaKind),
                  ("alias" .=) <$> _aaAlias, ("id" .=) <$> _aaId,
                  ("primaryEmail" .=) <$> _aaPrimaryEmail])

-- | JSON template for Schema resource in Directory API.
--
-- /See:/ 'schema' smart constructor.
data Schema = Schema'
    { _schEtag        :: !(Maybe Text)
    , _schKind        :: !Text
    , _schSchemaName  :: !(Maybe Text)
    , _schSchemaId    :: !(Maybe Text)
    , _schDisplayName :: !(Maybe Text)
    , _schFields      :: !(Maybe [SchemaFieldSpec])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Schema' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'schEtag'
--
-- * 'schKind'
--
-- * 'schSchemaName'
--
-- * 'schSchemaId'
--
-- * 'schDisplayName'
--
-- * 'schFields'
schema
    :: Schema
schema =
    Schema'
    { _schEtag = Nothing
    , _schKind = "admin#directory#schema"
    , _schSchemaName = Nothing
    , _schSchemaId = Nothing
    , _schDisplayName = Nothing
    , _schFields = Nothing
    }

-- | ETag of the resource.
schEtag :: Lens' Schema (Maybe Text)
schEtag = lens _schEtag (\ s a -> s{_schEtag = a})

-- | Kind of resource this is.
schKind :: Lens' Schema Text
schKind = lens _schKind (\ s a -> s{_schKind = a})

-- | Schema name
schSchemaName :: Lens' Schema (Maybe Text)
schSchemaName
  = lens _schSchemaName
      (\ s a -> s{_schSchemaName = a})

-- | Unique identifier of Schema (Read-only)
schSchemaId :: Lens' Schema (Maybe Text)
schSchemaId
  = lens _schSchemaId (\ s a -> s{_schSchemaId = a})

-- | Display name for the schema.
schDisplayName :: Lens' Schema (Maybe Text)
schDisplayName
  = lens _schDisplayName
      (\ s a -> s{_schDisplayName = a})

-- | Fields of Schema
schFields :: Lens' Schema [SchemaFieldSpec]
schFields
  = lens _schFields (\ s a -> s{_schFields = a}) .
      _Default
      . _Coerce

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

instance ToJSON Schema where
        toJSON Schema'{..}
          = object
              (catMaybes
                 [("etag" .=) <$> _schEtag, Just ("kind" .= _schKind),
                  ("schemaName" .=) <$> _schSchemaName,
                  ("schemaId" .=) <$> _schSchemaId,
                  ("displayName" .=) <$> _schDisplayName,
                  ("fields" .=) <$> _schFields])

-- | JSON request template for moving ChromeOs Device to given OU in
-- Directory Devices API.
--
-- /See:/ 'chromeOSMoveDevicesToOu' smart constructor.
newtype ChromeOSMoveDevicesToOu = ChromeOSMoveDevicesToOu'
    { _comdtoDeviceIds :: Maybe [Text]
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ChromeOSMoveDevicesToOu' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'comdtoDeviceIds'
chromeOSMoveDevicesToOu
    :: ChromeOSMoveDevicesToOu
chromeOSMoveDevicesToOu =
    ChromeOSMoveDevicesToOu'
    { _comdtoDeviceIds = Nothing
    }

-- | ChromeOs Devices to be moved to OU
comdtoDeviceIds :: Lens' ChromeOSMoveDevicesToOu [Text]
comdtoDeviceIds
  = lens _comdtoDeviceIds
      (\ s a -> s{_comdtoDeviceIds = a})
      . _Default
      . _Coerce

instance FromJSON ChromeOSMoveDevicesToOu where
        parseJSON
          = withObject "ChromeOSMoveDevicesToOu"
              (\ o ->
                 ChromeOSMoveDevicesToOu' <$>
                   (o .:? "deviceIds" .!= mempty))

instance ToJSON ChromeOSMoveDevicesToOu where
        toJSON ChromeOSMoveDevicesToOu'{..}
          = object
              (catMaybes [("deviceIds" .=) <$> _comdtoDeviceIds])

-- | JSON template for User object in Directory API.
--
-- /See:/ 'user' smart constructor.
data User = User'
    { _useCreationTime               :: !(Maybe DateTime')
    , _useLastLoginTime              :: !(Maybe DateTime')
    , _useThumbnailPhotoEtag         :: !(Maybe Text)
    , _useEtag                       :: !(Maybe Text)
    , _usePosixAccounts              :: !(Maybe JSONValue)
    , _useIPWhiteListed              :: !(Maybe Bool)
    , _useRelations                  :: !(Maybe JSONValue)
    , _useSSHPublicKeys              :: !(Maybe JSONValue)
    , _useHashFunction               :: !(Maybe Text)
    , _useKind                       :: !Text
    , _useChangePasswordAtNextLogin  :: !(Maybe Bool)
    , _useWebsites                   :: !(Maybe JSONValue)
    , _useAddresses                  :: !(Maybe JSONValue)
    , _useAliases                    :: !(Maybe [Text])
    , _useThumbnailPhotoURL          :: !(Maybe Text)
    , _useExternalIds                :: !(Maybe JSONValue)
    , _useSuspended                  :: !(Maybe Bool)
    , _useAgreedToTerms              :: !(Maybe Bool)
    , _useDeletionTime               :: !(Maybe DateTime')
    , _useNonEditableAliases         :: !(Maybe [Text])
    , _useOrgUnitPath                :: !(Maybe Text)
    , _useCustomerId                 :: !(Maybe Text)
    , _useLanguages                  :: !(Maybe JSONValue)
    , _useIncludeInGlobalAddressList :: !(Maybe Bool)
    , _useGender                     :: !(Maybe JSONValue)
    , _usePhones                     :: !(Maybe JSONValue)
    , _useName                       :: !(Maybe UserName)
    , _usePassword                   :: !(Maybe Text)
    , _useEmails                     :: !(Maybe JSONValue)
    , _useIms                        :: !(Maybe JSONValue)
    , _useKeywords                   :: !(Maybe JSONValue)
    , _useIsAdmin                    :: !(Maybe Bool)
    , _useIsEnrolledIn2Sv            :: !(Maybe Bool)
    , _useId                         :: !(Maybe Text)
    , _useOrganizations              :: !(Maybe JSONValue)
    , _usePrimaryEmail               :: !(Maybe Text)
    , _useIsEnforcedIn2Sv            :: !(Maybe Bool)
    , _useNotes                      :: !(Maybe JSONValue)
    , _useIsDelegatedAdmin           :: !(Maybe Bool)
    , _useLocations                  :: !(Maybe JSONValue)
    , _useArchived                   :: !(Maybe Bool)
    , _useIsMailboxSetup             :: !(Maybe Bool)
    , _useCustomSchemas              :: !(Maybe UserCustomSchemas)
    , _useSuspensionReason           :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'User' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'useCreationTime'
--
-- * 'useLastLoginTime'
--
-- * 'useThumbnailPhotoEtag'
--
-- * 'useEtag'
--
-- * 'usePosixAccounts'
--
-- * 'useIPWhiteListed'
--
-- * 'useRelations'
--
-- * 'useSSHPublicKeys'
--
-- * 'useHashFunction'
--
-- * 'useKind'
--
-- * 'useChangePasswordAtNextLogin'
--
-- * 'useWebsites'
--
-- * 'useAddresses'
--
-- * 'useAliases'
--
-- * 'useThumbnailPhotoURL'
--
-- * 'useExternalIds'
--
-- * 'useSuspended'
--
-- * 'useAgreedToTerms'
--
-- * 'useDeletionTime'
--
-- * 'useNonEditableAliases'
--
-- * 'useOrgUnitPath'
--
-- * 'useCustomerId'
--
-- * 'useLanguages'
--
-- * 'useIncludeInGlobalAddressList'
--
-- * 'useGender'
--
-- * 'usePhones'
--
-- * 'useName'
--
-- * 'usePassword'
--
-- * 'useEmails'
--
-- * 'useIms'
--
-- * 'useKeywords'
--
-- * 'useIsAdmin'
--
-- * 'useIsEnrolledIn2Sv'
--
-- * 'useId'
--
-- * 'useOrganizations'
--
-- * 'usePrimaryEmail'
--
-- * 'useIsEnforcedIn2Sv'
--
-- * 'useNotes'
--
-- * 'useIsDelegatedAdmin'
--
-- * 'useLocations'
--
-- * 'useArchived'
--
-- * 'useIsMailboxSetup'
--
-- * 'useCustomSchemas'
--
-- * 'useSuspensionReason'
user
    :: User
user =
    User'
    { _useCreationTime = Nothing
    , _useLastLoginTime = Nothing
    , _useThumbnailPhotoEtag = Nothing
    , _useEtag = Nothing
    , _usePosixAccounts = Nothing
    , _useIPWhiteListed = Nothing
    , _useRelations = Nothing
    , _useSSHPublicKeys = Nothing
    , _useHashFunction = Nothing
    , _useKind = "admin#directory#user"
    , _useChangePasswordAtNextLogin = Nothing
    , _useWebsites = Nothing
    , _useAddresses = Nothing
    , _useAliases = Nothing
    , _useThumbnailPhotoURL = Nothing
    , _useExternalIds = Nothing
    , _useSuspended = Nothing
    , _useAgreedToTerms = Nothing
    , _useDeletionTime = Nothing
    , _useNonEditableAliases = Nothing
    , _useOrgUnitPath = Nothing
    , _useCustomerId = Nothing
    , _useLanguages = Nothing
    , _useIncludeInGlobalAddressList = Nothing
    , _useGender = Nothing
    , _usePhones = Nothing
    , _useName = Nothing
    , _usePassword = Nothing
    , _useEmails = Nothing
    , _useIms = Nothing
    , _useKeywords = Nothing
    , _useIsAdmin = Nothing
    , _useIsEnrolledIn2Sv = Nothing
    , _useId = Nothing
    , _useOrganizations = Nothing
    , _usePrimaryEmail = Nothing
    , _useIsEnforcedIn2Sv = Nothing
    , _useNotes = Nothing
    , _useIsDelegatedAdmin = Nothing
    , _useLocations = Nothing
    , _useArchived = Nothing
    , _useIsMailboxSetup = Nothing
    , _useCustomSchemas = Nothing
    , _useSuspensionReason = Nothing
    }

-- | User\'s G Suite account creation time. (Read-only)
useCreationTime :: Lens' User (Maybe UTCTime)
useCreationTime
  = lens _useCreationTime
      (\ s a -> s{_useCreationTime = a})
      . mapping _DateTime

-- | User\'s last login time. (Read-only)
useLastLoginTime :: Lens' User (Maybe UTCTime)
useLastLoginTime
  = lens _useLastLoginTime
      (\ s a -> s{_useLastLoginTime = a})
      . mapping _DateTime

-- | ETag of the user\'s photo (Read-only)
useThumbnailPhotoEtag :: Lens' User (Maybe Text)
useThumbnailPhotoEtag
  = lens _useThumbnailPhotoEtag
      (\ s a -> s{_useThumbnailPhotoEtag = a})

-- | ETag of the resource.
useEtag :: Lens' User (Maybe Text)
useEtag = lens _useEtag (\ s a -> s{_useEtag = a})

usePosixAccounts :: Lens' User (Maybe JSONValue)
usePosixAccounts
  = lens _usePosixAccounts
      (\ s a -> s{_usePosixAccounts = a})

-- | Boolean indicating if ip is whitelisted
useIPWhiteListed :: Lens' User (Maybe Bool)
useIPWhiteListed
  = lens _useIPWhiteListed
      (\ s a -> s{_useIPWhiteListed = a})

useRelations :: Lens' User (Maybe JSONValue)
useRelations
  = lens _useRelations (\ s a -> s{_useRelations = a})

useSSHPublicKeys :: Lens' User (Maybe JSONValue)
useSSHPublicKeys
  = lens _useSSHPublicKeys
      (\ s a -> s{_useSSHPublicKeys = a})

-- | Hash function name for password. Supported are MD5, SHA-1 and crypt
useHashFunction :: Lens' User (Maybe Text)
useHashFunction
  = lens _useHashFunction
      (\ s a -> s{_useHashFunction = a})

-- | Kind of resource this is.
useKind :: Lens' User Text
useKind = lens _useKind (\ s a -> s{_useKind = a})

-- | Boolean indicating if the user should change password in next login
useChangePasswordAtNextLogin :: Lens' User (Maybe Bool)
useChangePasswordAtNextLogin
  = lens _useChangePasswordAtNextLogin
      (\ s a -> s{_useChangePasswordAtNextLogin = a})

useWebsites :: Lens' User (Maybe JSONValue)
useWebsites
  = lens _useWebsites (\ s a -> s{_useWebsites = a})

useAddresses :: Lens' User (Maybe JSONValue)
useAddresses
  = lens _useAddresses (\ s a -> s{_useAddresses = a})

-- | List of aliases (Read-only)
useAliases :: Lens' User [Text]
useAliases
  = lens _useAliases (\ s a -> s{_useAliases = a}) .
      _Default
      . _Coerce

-- | Photo Url of the user (Read-only)
useThumbnailPhotoURL :: Lens' User (Maybe Text)
useThumbnailPhotoURL
  = lens _useThumbnailPhotoURL
      (\ s a -> s{_useThumbnailPhotoURL = a})

useExternalIds :: Lens' User (Maybe JSONValue)
useExternalIds
  = lens _useExternalIds
      (\ s a -> s{_useExternalIds = a})

-- | Indicates if user is suspended.
useSuspended :: Lens' User (Maybe Bool)
useSuspended
  = lens _useSuspended (\ s a -> s{_useSuspended = a})

-- | Indicates if user has agreed to terms (Read-only)
useAgreedToTerms :: Lens' User (Maybe Bool)
useAgreedToTerms
  = lens _useAgreedToTerms
      (\ s a -> s{_useAgreedToTerms = a})

useDeletionTime :: Lens' User (Maybe UTCTime)
useDeletionTime
  = lens _useDeletionTime
      (\ s a -> s{_useDeletionTime = a})
      . mapping _DateTime

-- | List of non editable aliases (Read-only)
useNonEditableAliases :: Lens' User [Text]
useNonEditableAliases
  = lens _useNonEditableAliases
      (\ s a -> s{_useNonEditableAliases = a})
      . _Default
      . _Coerce

-- | OrgUnit of User
useOrgUnitPath :: Lens' User (Maybe Text)
useOrgUnitPath
  = lens _useOrgUnitPath
      (\ s a -> s{_useOrgUnitPath = a})

-- | CustomerId of User (Read-only)
useCustomerId :: Lens' User (Maybe Text)
useCustomerId
  = lens _useCustomerId
      (\ s a -> s{_useCustomerId = a})

useLanguages :: Lens' User (Maybe JSONValue)
useLanguages
  = lens _useLanguages (\ s a -> s{_useLanguages = a})

-- | Boolean indicating if user is included in Global Address List
useIncludeInGlobalAddressList :: Lens' User (Maybe Bool)
useIncludeInGlobalAddressList
  = lens _useIncludeInGlobalAddressList
      (\ s a -> s{_useIncludeInGlobalAddressList = a})

useGender :: Lens' User (Maybe JSONValue)
useGender
  = lens _useGender (\ s a -> s{_useGender = a})

usePhones :: Lens' User (Maybe JSONValue)
usePhones
  = lens _usePhones (\ s a -> s{_usePhones = a})

-- | User\'s name
useName :: Lens' User (Maybe UserName)
useName = lens _useName (\ s a -> s{_useName = a})

-- | User\'s password
usePassword :: Lens' User (Maybe Text)
usePassword
  = lens _usePassword (\ s a -> s{_usePassword = a})

useEmails :: Lens' User (Maybe JSONValue)
useEmails
  = lens _useEmails (\ s a -> s{_useEmails = a})

useIms :: Lens' User (Maybe JSONValue)
useIms = lens _useIms (\ s a -> s{_useIms = a})

useKeywords :: Lens' User (Maybe JSONValue)
useKeywords
  = lens _useKeywords (\ s a -> s{_useKeywords = a})

-- | Boolean indicating if the user is admin (Read-only)
useIsAdmin :: Lens' User (Maybe Bool)
useIsAdmin
  = lens _useIsAdmin (\ s a -> s{_useIsAdmin = a})

-- | Is enrolled in 2-step verification (Read-only)
useIsEnrolledIn2Sv :: Lens' User (Maybe Bool)
useIsEnrolledIn2Sv
  = lens _useIsEnrolledIn2Sv
      (\ s a -> s{_useIsEnrolledIn2Sv = a})

-- | Unique identifier of User (Read-only)
useId :: Lens' User (Maybe Text)
useId = lens _useId (\ s a -> s{_useId = a})

useOrganizations :: Lens' User (Maybe JSONValue)
useOrganizations
  = lens _useOrganizations
      (\ s a -> s{_useOrganizations = a})

-- | username of User
usePrimaryEmail :: Lens' User (Maybe Text)
usePrimaryEmail
  = lens _usePrimaryEmail
      (\ s a -> s{_usePrimaryEmail = a})

-- | Is 2-step verification enforced (Read-only)
useIsEnforcedIn2Sv :: Lens' User (Maybe Bool)
useIsEnforcedIn2Sv
  = lens _useIsEnforcedIn2Sv
      (\ s a -> s{_useIsEnforcedIn2Sv = a})

useNotes :: Lens' User (Maybe JSONValue)
useNotes = lens _useNotes (\ s a -> s{_useNotes = a})

-- | Boolean indicating if the user is delegated admin (Read-only)
useIsDelegatedAdmin :: Lens' User (Maybe Bool)
useIsDelegatedAdmin
  = lens _useIsDelegatedAdmin
      (\ s a -> s{_useIsDelegatedAdmin = a})

useLocations :: Lens' User (Maybe JSONValue)
useLocations
  = lens _useLocations (\ s a -> s{_useLocations = a})

-- | Indicates if user is archived.
useArchived :: Lens' User (Maybe Bool)
useArchived
  = lens _useArchived (\ s a -> s{_useArchived = a})

-- | Is mailbox setup (Read-only)
useIsMailboxSetup :: Lens' User (Maybe Bool)
useIsMailboxSetup
  = lens _useIsMailboxSetup
      (\ s a -> s{_useIsMailboxSetup = a})

-- | Custom fields of the user.
useCustomSchemas :: Lens' User (Maybe UserCustomSchemas)
useCustomSchemas
  = lens _useCustomSchemas
      (\ s a -> s{_useCustomSchemas = a})

-- | Suspension reason if user is suspended (Read-only)
useSuspensionReason :: Lens' User (Maybe Text)
useSuspensionReason
  = lens _useSuspensionReason
      (\ s a -> s{_useSuspensionReason = a})

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

instance ToJSON User where
        toJSON User'{..}
          = object
              (catMaybes
                 [("creationTime" .=) <$> _useCreationTime,
                  ("lastLoginTime" .=) <$> _useLastLoginTime,
                  ("thumbnailPhotoEtag" .=) <$> _useThumbnailPhotoEtag,
                  ("etag" .=) <$> _useEtag,
                  ("posixAccounts" .=) <$> _usePosixAccounts,
                  ("ipWhitelisted" .=) <$> _useIPWhiteListed,
                  ("relations" .=) <$> _useRelations,
                  ("sshPublicKeys" .=) <$> _useSSHPublicKeys,
                  ("hashFunction" .=) <$> _useHashFunction,
                  Just ("kind" .= _useKind),
                  ("changePasswordAtNextLogin" .=) <$>
                    _useChangePasswordAtNextLogin,
                  ("websites" .=) <$> _useWebsites,
                  ("addresses" .=) <$> _useAddresses,
                  ("aliases" .=) <$> _useAliases,
                  ("thumbnailPhotoUrl" .=) <$> _useThumbnailPhotoURL,
                  ("externalIds" .=) <$> _useExternalIds,
                  ("suspended" .=) <$> _useSuspended,
                  ("agreedToTerms" .=) <$> _useAgreedToTerms,
                  ("deletionTime" .=) <$> _useDeletionTime,
                  ("nonEditableAliases" .=) <$> _useNonEditableAliases,
                  ("orgUnitPath" .=) <$> _useOrgUnitPath,
                  ("customerId" .=) <$> _useCustomerId,
                  ("languages" .=) <$> _useLanguages,
                  ("includeInGlobalAddressList" .=) <$>
                    _useIncludeInGlobalAddressList,
                  ("gender" .=) <$> _useGender,
                  ("phones" .=) <$> _usePhones,
                  ("name" .=) <$> _useName,
                  ("password" .=) <$> _usePassword,
                  ("emails" .=) <$> _useEmails, ("ims" .=) <$> _useIms,
                  ("keywords" .=) <$> _useKeywords,
                  ("isAdmin" .=) <$> _useIsAdmin,
                  ("isEnrolledIn2Sv" .=) <$> _useIsEnrolledIn2Sv,
                  ("id" .=) <$> _useId,
                  ("organizations" .=) <$> _useOrganizations,
                  ("primaryEmail" .=) <$> _usePrimaryEmail,
                  ("isEnforcedIn2Sv" .=) <$> _useIsEnforcedIn2Sv,
                  ("notes" .=) <$> _useNotes,
                  ("isDelegatedAdmin" .=) <$> _useIsDelegatedAdmin,
                  ("locations" .=) <$> _useLocations,
                  ("archived" .=) <$> _useArchived,
                  ("isMailboxSetup" .=) <$> _useIsMailboxSetup,
                  ("customSchemas" .=) <$> _useCustomSchemas,
                  ("suspensionReason" .=) <$> _useSuspensionReason])

-- | JSON request template for firing actions on ChromeOs Device in Directory
-- Devices API.
--
-- /See:/ 'chromeOSDeviceAction' smart constructor.
data ChromeOSDeviceAction = ChromeOSDeviceAction'
    { _codaAction            :: !(Maybe Text)
    , _codaDeprovisionReason :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ChromeOSDeviceAction' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'codaAction'
--
-- * 'codaDeprovisionReason'
chromeOSDeviceAction
    :: ChromeOSDeviceAction
chromeOSDeviceAction =
    ChromeOSDeviceAction'
    { _codaAction = Nothing
    , _codaDeprovisionReason = Nothing
    }

-- | Action to be taken on the ChromeOs Device
codaAction :: Lens' ChromeOSDeviceAction (Maybe Text)
codaAction
  = lens _codaAction (\ s a -> s{_codaAction = a})

codaDeprovisionReason :: Lens' ChromeOSDeviceAction (Maybe Text)
codaDeprovisionReason
  = lens _codaDeprovisionReason
      (\ s a -> s{_codaDeprovisionReason = a})

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

instance ToJSON ChromeOSDeviceAction where
        toJSON ChromeOSDeviceAction'{..}
          = object
              (catMaybes
                 [("action" .=) <$> _codaAction,
                  ("deprovisionReason" .=) <$> _codaDeprovisionReason])

-- | JSON request template for renaming a feature.
--
-- /See:/ 'featureRename' smart constructor.
newtype FeatureRename = FeatureRename'
    { _frNewName :: Maybe Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'FeatureRename' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'frNewName'
featureRename
    :: FeatureRename
featureRename =
    FeatureRename'
    { _frNewName = Nothing
    }

-- | New name of the feature.
frNewName :: Lens' FeatureRename (Maybe Text)
frNewName
  = lens _frNewName (\ s a -> s{_frNewName = a})

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

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

-- | JSON template for role resource in Directory API.
--
-- /See:/ 'role'' smart constructor.
data Role = Role'
    { _rrEtag             :: !(Maybe Text)
    , _rrKind             :: !Text
    , _rrRoleName         :: !(Maybe Text)
    , _rrIsSystemRole     :: !(Maybe Bool)
    , _rrRoleId           :: !(Maybe (Textual Int64))
    , _rrRoleDescription  :: !(Maybe Text)
    , _rrIsSuperAdminRole :: !(Maybe Bool)
    , _rrRolePrivileges   :: !(Maybe [RoleRolePrivilegesItem])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Role' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'rrEtag'
--
-- * 'rrKind'
--
-- * 'rrRoleName'
--
-- * 'rrIsSystemRole'
--
-- * 'rrRoleId'
--
-- * 'rrRoleDescription'
--
-- * 'rrIsSuperAdminRole'
--
-- * 'rrRolePrivileges'
role'
    :: Role
role' =
    Role'
    { _rrEtag = Nothing
    , _rrKind = "admin#directory#role"
    , _rrRoleName = Nothing
    , _rrIsSystemRole = Nothing
    , _rrRoleId = Nothing
    , _rrRoleDescription = Nothing
    , _rrIsSuperAdminRole = Nothing
    , _rrRolePrivileges = Nothing
    }

-- | ETag of the resource.
rrEtag :: Lens' Role (Maybe Text)
rrEtag = lens _rrEtag (\ s a -> s{_rrEtag = a})

-- | The type of the API resource. This is always admin#directory#role.
rrKind :: Lens' Role Text
rrKind = lens _rrKind (\ s a -> s{_rrKind = a})

-- | Name of the role.
rrRoleName :: Lens' Role (Maybe Text)
rrRoleName
  = lens _rrRoleName (\ s a -> s{_rrRoleName = a})

-- | Returns true if this is a pre-defined system role.
rrIsSystemRole :: Lens' Role (Maybe Bool)
rrIsSystemRole
  = lens _rrIsSystemRole
      (\ s a -> s{_rrIsSystemRole = a})

-- | ID of the role.
rrRoleId :: Lens' Role (Maybe Int64)
rrRoleId
  = lens _rrRoleId (\ s a -> s{_rrRoleId = a}) .
      mapping _Coerce

-- | A short description of the role.
rrRoleDescription :: Lens' Role (Maybe Text)
rrRoleDescription
  = lens _rrRoleDescription
      (\ s a -> s{_rrRoleDescription = a})

-- | Returns true if the role is a super admin role.
rrIsSuperAdminRole :: Lens' Role (Maybe Bool)
rrIsSuperAdminRole
  = lens _rrIsSuperAdminRole
      (\ s a -> s{_rrIsSuperAdminRole = a})

-- | The set of privileges that are granted to this role.
rrRolePrivileges :: Lens' Role [RoleRolePrivilegesItem]
rrRolePrivileges
  = lens _rrRolePrivileges
      (\ s a -> s{_rrRolePrivileges = a})
      . _Default
      . _Coerce

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

instance ToJSON Role where
        toJSON Role'{..}
          = object
              (catMaybes
                 [("etag" .=) <$> _rrEtag, Just ("kind" .= _rrKind),
                  ("roleName" .=) <$> _rrRoleName,
                  ("isSystemRole" .=) <$> _rrIsSystemRole,
                  ("roleId" .=) <$> _rrRoleId,
                  ("roleDescription" .=) <$> _rrRoleDescription,
                  ("isSuperAdminRole" .=) <$> _rrIsSuperAdminRole,
                  ("rolePrivileges" .=) <$> _rrRolePrivileges])

-- | JSON template for Customer Resource object in Directory API.
--
-- /See:/ 'customer' smart constructor.
data Customer = Customer'
    { _cusEtag                 :: !(Maybe Text)
    , _cusKind                 :: !Text
    , _cusAlternateEmail       :: !(Maybe Text)
    , _cusCustomerDomain       :: !(Maybe Text)
    , _cusPhoneNumber          :: !(Maybe Text)
    , _cusLanguage             :: !(Maybe Text)
    , _cusId                   :: !(Maybe Text)
    , _cusCustomerCreationTime :: !(Maybe DateTime')
    , _cusPostalAddress        :: !(Maybe CustomerPostalAddress)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Customer' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'cusEtag'
--
-- * 'cusKind'
--
-- * 'cusAlternateEmail'
--
-- * 'cusCustomerDomain'
--
-- * 'cusPhoneNumber'
--
-- * 'cusLanguage'
--
-- * 'cusId'
--
-- * 'cusCustomerCreationTime'
--
-- * 'cusPostalAddress'
customer
    :: Customer
customer =
    Customer'
    { _cusEtag = Nothing
    , _cusKind = "admin#directory#customer"
    , _cusAlternateEmail = Nothing
    , _cusCustomerDomain = Nothing
    , _cusPhoneNumber = Nothing
    , _cusLanguage = Nothing
    , _cusId = Nothing
    , _cusCustomerCreationTime = Nothing
    , _cusPostalAddress = Nothing
    }

-- | ETag of the resource.
cusEtag :: Lens' Customer (Maybe Text)
cusEtag = lens _cusEtag (\ s a -> s{_cusEtag = a})

-- | Identifies the resource as a customer. Value: admin#directory#customer
cusKind :: Lens' Customer Text
cusKind = lens _cusKind (\ s a -> s{_cusKind = a})

-- | The customer\'s secondary contact email address. This email address
-- cannot be on the same domain as the customerDomain
cusAlternateEmail :: Lens' Customer (Maybe Text)
cusAlternateEmail
  = lens _cusAlternateEmail
      (\ s a -> s{_cusAlternateEmail = a})

-- | The customer\'s primary domain name string. Do not include the www
-- prefix when creating a new customer.
cusCustomerDomain :: Lens' Customer (Maybe Text)
cusCustomerDomain
  = lens _cusCustomerDomain
      (\ s a -> s{_cusCustomerDomain = a})

-- | The customer\'s contact phone number in E.164 format.
cusPhoneNumber :: Lens' Customer (Maybe Text)
cusPhoneNumber
  = lens _cusPhoneNumber
      (\ s a -> s{_cusPhoneNumber = a})

-- | The customer\'s ISO 639-2 language code. The default value is en-US
cusLanguage :: Lens' Customer (Maybe Text)
cusLanguage
  = lens _cusLanguage (\ s a -> s{_cusLanguage = a})

-- | The unique ID for the customer\'s G Suite account. (Readonly)
cusId :: Lens' Customer (Maybe Text)
cusId = lens _cusId (\ s a -> s{_cusId = a})

-- | The customer\'s creation time (Readonly)
cusCustomerCreationTime :: Lens' Customer (Maybe UTCTime)
cusCustomerCreationTime
  = lens _cusCustomerCreationTime
      (\ s a -> s{_cusCustomerCreationTime = a})
      . mapping _DateTime

-- | The customer\'s postal address information.
cusPostalAddress :: Lens' Customer (Maybe CustomerPostalAddress)
cusPostalAddress
  = lens _cusPostalAddress
      (\ s a -> s{_cusPostalAddress = a})

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

instance ToJSON Customer where
        toJSON Customer'{..}
          = object
              (catMaybes
                 [("etag" .=) <$> _cusEtag, Just ("kind" .= _cusKind),
                  ("alternateEmail" .=) <$> _cusAlternateEmail,
                  ("customerDomain" .=) <$> _cusCustomerDomain,
                  ("phoneNumber" .=) <$> _cusPhoneNumber,
                  ("language" .=) <$> _cusLanguage,
                  ("id" .=) <$> _cusId,
                  ("customerCreationTime" .=) <$>
                    _cusCustomerCreationTime,
                  ("postalAddress" .=) <$> _cusPostalAddress])

--
-- /See:/ 'mobileDeviceApplicationsItem' smart constructor.
data MobileDeviceApplicationsItem = MobileDeviceApplicationsItem'
    { _mdaiVersionCode :: !(Maybe (Textual Int32))
    , _mdaiVersionName :: !(Maybe Text)
    , _mdaiPackageName :: !(Maybe Text)
    , _mdaiDisplayName :: !(Maybe Text)
    , _mdaiPermission  :: !(Maybe [Text])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'MobileDeviceApplicationsItem' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'mdaiVersionCode'
--
-- * 'mdaiVersionName'
--
-- * 'mdaiPackageName'
--
-- * 'mdaiDisplayName'
--
-- * 'mdaiPermission'
mobileDeviceApplicationsItem
    :: MobileDeviceApplicationsItem
mobileDeviceApplicationsItem =
    MobileDeviceApplicationsItem'
    { _mdaiVersionCode = Nothing
    , _mdaiVersionName = Nothing
    , _mdaiPackageName = Nothing
    , _mdaiDisplayName = Nothing
    , _mdaiPermission = Nothing
    }

-- | Version code of application
mdaiVersionCode :: Lens' MobileDeviceApplicationsItem (Maybe Int32)
mdaiVersionCode
  = lens _mdaiVersionCode
      (\ s a -> s{_mdaiVersionCode = a})
      . mapping _Coerce

-- | Version name of application
mdaiVersionName :: Lens' MobileDeviceApplicationsItem (Maybe Text)
mdaiVersionName
  = lens _mdaiVersionName
      (\ s a -> s{_mdaiVersionName = a})

-- | Package name of application
mdaiPackageName :: Lens' MobileDeviceApplicationsItem (Maybe Text)
mdaiPackageName
  = lens _mdaiPackageName
      (\ s a -> s{_mdaiPackageName = a})

-- | Display name of application
mdaiDisplayName :: Lens' MobileDeviceApplicationsItem (Maybe Text)
mdaiDisplayName
  = lens _mdaiDisplayName
      (\ s a -> s{_mdaiDisplayName = a})

-- | List of Permissions for application
mdaiPermission :: Lens' MobileDeviceApplicationsItem [Text]
mdaiPermission
  = lens _mdaiPermission
      (\ s a -> s{_mdaiPermission = a})
      . _Default
      . _Coerce

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

instance ToJSON MobileDeviceApplicationsItem where
        toJSON MobileDeviceApplicationsItem'{..}
          = object
              (catMaybes
                 [("versionCode" .=) <$> _mdaiVersionCode,
                  ("versionName" .=) <$> _mdaiVersionName,
                  ("packageName" .=) <$> _mdaiPackageName,
                  ("displayName" .=) <$> _mdaiDisplayName,
                  ("permission" .=) <$> _mdaiPermission])

--
-- /See:/ 'chromeOSDeviceDiskVolumeReportsItemVolumeInfoItem' smart constructor.
data ChromeOSDeviceDiskVolumeReportsItemVolumeInfoItem = ChromeOSDeviceDiskVolumeReportsItemVolumeInfoItem'
    { _coddvriviiStorageFree  :: !(Maybe (Textual Int64))
    , _coddvriviiStorageTotal :: !(Maybe (Textual Int64))
    , _coddvriviiVolumeId     :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ChromeOSDeviceDiskVolumeReportsItemVolumeInfoItem' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'coddvriviiStorageFree'
--
-- * 'coddvriviiStorageTotal'
--
-- * 'coddvriviiVolumeId'
chromeOSDeviceDiskVolumeReportsItemVolumeInfoItem
    :: ChromeOSDeviceDiskVolumeReportsItemVolumeInfoItem
chromeOSDeviceDiskVolumeReportsItemVolumeInfoItem =
    ChromeOSDeviceDiskVolumeReportsItemVolumeInfoItem'
    { _coddvriviiStorageFree = Nothing
    , _coddvriviiStorageTotal = Nothing
    , _coddvriviiVolumeId = Nothing
    }

-- | Free disk space [in bytes]
coddvriviiStorageFree :: Lens' ChromeOSDeviceDiskVolumeReportsItemVolumeInfoItem (Maybe Int64)
coddvriviiStorageFree
  = lens _coddvriviiStorageFree
      (\ s a -> s{_coddvriviiStorageFree = a})
      . mapping _Coerce

-- | Total disk space [in bytes]
coddvriviiStorageTotal :: Lens' ChromeOSDeviceDiskVolumeReportsItemVolumeInfoItem (Maybe Int64)
coddvriviiStorageTotal
  = lens _coddvriviiStorageTotal
      (\ s a -> s{_coddvriviiStorageTotal = a})
      . mapping _Coerce

-- | Volume id
coddvriviiVolumeId :: Lens' ChromeOSDeviceDiskVolumeReportsItemVolumeInfoItem (Maybe Text)
coddvriviiVolumeId
  = lens _coddvriviiVolumeId
      (\ s a -> s{_coddvriviiVolumeId = a})

instance FromJSON
         ChromeOSDeviceDiskVolumeReportsItemVolumeInfoItem
         where
        parseJSON
          = withObject
              "ChromeOSDeviceDiskVolumeReportsItemVolumeInfoItem"
              (\ o ->
                 ChromeOSDeviceDiskVolumeReportsItemVolumeInfoItem'
                   <$>
                   (o .:? "storageFree") <*> (o .:? "storageTotal") <*>
                     (o .:? "volumeId"))

instance ToJSON
         ChromeOSDeviceDiskVolumeReportsItemVolumeInfoItem
         where
        toJSON
          ChromeOSDeviceDiskVolumeReportsItemVolumeInfoItem'{..}
          = object
              (catMaybes
                 [("storageFree" .=) <$> _coddvriviiStorageFree,
                  ("storageTotal" .=) <$> _coddvriviiStorageTotal,
                  ("volumeId" .=) <$> _coddvriviiVolumeId])

-- | JSON response template for List Organization Units operation in
-- Directory API.
--
-- /See:/ 'orgUnits' smart constructor.
data OrgUnits = OrgUnits'
    { _oEtag              :: !(Maybe Text)
    , _oKind              :: !Text
    , _oOrganizationUnits :: !(Maybe [OrgUnit])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'OrgUnits' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'oEtag'
--
-- * 'oKind'
--
-- * 'oOrganizationUnits'
orgUnits
    :: OrgUnits
orgUnits =
    OrgUnits'
    { _oEtag = Nothing
    , _oKind = "admin#directory#orgUnits"
    , _oOrganizationUnits = Nothing
    }

-- | ETag of the resource.
oEtag :: Lens' OrgUnits (Maybe Text)
oEtag = lens _oEtag (\ s a -> s{_oEtag = a})

-- | Kind of resource this is.
oKind :: Lens' OrgUnits Text
oKind = lens _oKind (\ s a -> s{_oKind = a})

-- | List of user objects.
oOrganizationUnits :: Lens' OrgUnits [OrgUnit]
oOrganizationUnits
  = lens _oOrganizationUnits
      (\ s a -> s{_oOrganizationUnits = a})
      . _Default
      . _Coerce

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

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

-- | JSON template for a POSIX account entry.
--
-- /See:/ 'userSSHPublicKey' smart constructor.
data UserSSHPublicKey = UserSSHPublicKey'
    { _uspkFingerprint        :: !(Maybe Text)
    , _uspkKey                :: !(Maybe Text)
    , _uspkExpirationTimeUsec :: !(Maybe (Textual Int64))
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'UserSSHPublicKey' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'uspkFingerprint'
--
-- * 'uspkKey'
--
-- * 'uspkExpirationTimeUsec'
userSSHPublicKey
    :: UserSSHPublicKey
userSSHPublicKey =
    UserSSHPublicKey'
    { _uspkFingerprint = Nothing
    , _uspkKey = Nothing
    , _uspkExpirationTimeUsec = Nothing
    }

-- | A SHA-256 fingerprint of the SSH public key. (Read-only)
uspkFingerprint :: Lens' UserSSHPublicKey (Maybe Text)
uspkFingerprint
  = lens _uspkFingerprint
      (\ s a -> s{_uspkFingerprint = a})

-- | An SSH public key.
uspkKey :: Lens' UserSSHPublicKey (Maybe Text)
uspkKey = lens _uspkKey (\ s a -> s{_uspkKey = a})

-- | An expiration time in microseconds since epoch.
uspkExpirationTimeUsec :: Lens' UserSSHPublicKey (Maybe Int64)
uspkExpirationTimeUsec
  = lens _uspkExpirationTimeUsec
      (\ s a -> s{_uspkExpirationTimeUsec = a})
      . mapping _Coerce

instance FromJSON UserSSHPublicKey where
        parseJSON
          = withObject "UserSSHPublicKey"
              (\ o ->
                 UserSSHPublicKey' <$>
                   (o .:? "fingerprint") <*> (o .:? "key") <*>
                     (o .:? "expirationTimeUsec"))

instance ToJSON UserSSHPublicKey where
        toJSON UserSSHPublicKey'{..}
          = object
              (catMaybes
                 [("fingerprint" .=) <$> _uspkFingerprint,
                  ("key" .=) <$> _uspkKey,
                  ("expirationTimeUsec" .=) <$>
                    _uspkExpirationTimeUsec])

-- | JSON response template for List verification codes operation in
-- Directory API.
--
-- /See:/ 'verificationCodes' smart constructor.
data VerificationCodes = VerificationCodes'
    { _vEtag  :: !(Maybe Text)
    , _vKind  :: !Text
    , _vItems :: !(Maybe [VerificationCode])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'VerificationCodes' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'vEtag'
--
-- * 'vKind'
--
-- * 'vItems'
verificationCodes
    :: VerificationCodes
verificationCodes =
    VerificationCodes'
    { _vEtag = Nothing
    , _vKind = "admin#directory#verificationCodesList"
    , _vItems = Nothing
    }

-- | ETag of the resource.
vEtag :: Lens' VerificationCodes (Maybe Text)
vEtag = lens _vEtag (\ s a -> s{_vEtag = a})

-- | The type of the resource. This is always
-- admin#directory#verificationCodesList.
vKind :: Lens' VerificationCodes Text
vKind = lens _vKind (\ s a -> s{_vKind = a})

-- | A list of verification code resources.
vItems :: Lens' VerificationCodes [VerificationCode]
vItems
  = lens _vItems (\ s a -> s{_vItems = a}) . _Default .
      _Coerce

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

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

-- | JSON template for coordinates of a building in Directory API.
--
-- /See:/ 'buildingCoordinates' smart constructor.
data BuildingCoordinates = BuildingCoordinates'
    { _bcLatitude  :: !(Maybe (Textual Double))
    , _bcLongitude :: !(Maybe (Textual Double))
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'BuildingCoordinates' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'bcLatitude'
--
-- * 'bcLongitude'
buildingCoordinates
    :: BuildingCoordinates
buildingCoordinates =
    BuildingCoordinates'
    { _bcLatitude = Nothing
    , _bcLongitude = Nothing
    }

-- | Latitude in decimal degrees.
bcLatitude :: Lens' BuildingCoordinates (Maybe Double)
bcLatitude
  = lens _bcLatitude (\ s a -> s{_bcLatitude = a}) .
      mapping _Coerce

-- | Longitude in decimal degrees.
bcLongitude :: Lens' BuildingCoordinates (Maybe Double)
bcLongitude
  = lens _bcLongitude (\ s a -> s{_bcLongitude = a}) .
      mapping _Coerce

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

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

-- | JSON template for a relation entry.
--
-- /See:/ 'userRelation' smart constructor.
data UserRelation = UserRelation'
    { _urValue      :: !(Maybe Text)
    , _urType       :: !(Maybe Text)
    , _urCustomType :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'UserRelation' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'urValue'
--
-- * 'urType'
--
-- * 'urCustomType'
userRelation
    :: UserRelation
userRelation =
    UserRelation'
    { _urValue = Nothing
    , _urType = Nothing
    , _urCustomType = Nothing
    }

-- | The name of the relation.
urValue :: Lens' UserRelation (Maybe Text)
urValue = lens _urValue (\ s a -> s{_urValue = a})

-- | The relation of the user. Some of the possible values are mother,
-- father, sister, brother, manager, assistant, partner.
urType :: Lens' UserRelation (Maybe Text)
urType = lens _urType (\ s a -> s{_urType = a})

-- | Custom Type.
urCustomType :: Lens' UserRelation (Maybe Text)
urCustomType
  = lens _urCustomType (\ s a -> s{_urCustomType = a})

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

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

-- | JSON template for Trusted Apps response object of a user in Directory
-- API.
--
-- /See:/ 'trustedApps' smart constructor.
data TrustedApps = TrustedApps'
    { _taEtag          :: !(Maybe Text)
    , _taNextPageToken :: !(Maybe Text)
    , _taKind          :: !Text
    , _taTrustedApps   :: !(Maybe [TrustedAppId])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'TrustedApps' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'taEtag'
--
-- * 'taNextPageToken'
--
-- * 'taKind'
--
-- * 'taTrustedApps'
trustedApps
    :: TrustedApps
trustedApps =
    TrustedApps'
    { _taEtag = Nothing
    , _taNextPageToken = Nothing
    , _taKind = "admin#directory#trustedapplist"
    , _taTrustedApps = Nothing
    }

-- | ETag of the resource.
taEtag :: Lens' TrustedApps (Maybe Text)
taEtag = lens _taEtag (\ s a -> s{_taEtag = a})

taNextPageToken :: Lens' TrustedApps (Maybe Text)
taNextPageToken
  = lens _taNextPageToken
      (\ s a -> s{_taNextPageToken = a})

-- | Identifies the resource as trusted apps response.
taKind :: Lens' TrustedApps Text
taKind = lens _taKind (\ s a -> s{_taKind = a})

-- | Trusted Apps list.
taTrustedApps :: Lens' TrustedApps [TrustedAppId]
taTrustedApps
  = lens _taTrustedApps
      (\ s a -> s{_taTrustedApps = a})
      . _Default
      . _Coerce

instance FromJSON TrustedApps where
        parseJSON
          = withObject "TrustedApps"
              (\ o ->
                 TrustedApps' <$>
                   (o .:? "etag") <*> (o .:? "nextPageToken") <*>
                     (o .:? "kind" .!= "admin#directory#trustedapplist")
                     <*> (o .:? "trustedApps" .!= mempty))

instance ToJSON TrustedApps where
        toJSON TrustedApps'{..}
          = object
              (catMaybes
                 [("etag" .=) <$> _taEtag,
                  ("nextPageToken" .=) <$> _taNextPageToken,
                  Just ("kind" .= _taKind),
                  ("trustedApps" .=) <$> _taTrustedApps])

-- | JSON template for Feature List Response object in Directory API.
--
-- /See:/ 'features' smart constructor.
data Features = Features'
    { _feaEtag          :: !(Maybe Text)
    , _feaNextPageToken :: !(Maybe Text)
    , _feaKind          :: !Text
    , _feaFeatures      :: !(Maybe [Feature])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Features' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'feaEtag'
--
-- * 'feaNextPageToken'
--
-- * 'feaKind'
--
-- * 'feaFeatures'
features
    :: Features
features =
    Features'
    { _feaEtag = Nothing
    , _feaNextPageToken = Nothing
    , _feaKind = "admin#directory#resources#features#featuresList"
    , _feaFeatures = Nothing
    }

-- | ETag of the resource.
feaEtag :: Lens' Features (Maybe Text)
feaEtag = lens _feaEtag (\ s a -> s{_feaEtag = a})

-- | The continuation token, used to page through large result sets. Provide
-- this value in a subsequent request to return the next page of results.
feaNextPageToken :: Lens' Features (Maybe Text)
feaNextPageToken
  = lens _feaNextPageToken
      (\ s a -> s{_feaNextPageToken = a})

-- | Kind of resource this is.
feaKind :: Lens' Features Text
feaKind = lens _feaKind (\ s a -> s{_feaKind = a})

-- | The Features in this page of results.
feaFeatures :: Lens' Features [Feature]
feaFeatures
  = lens _feaFeatures (\ s a -> s{_feaFeatures = a}) .
      _Default
      . _Coerce

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

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

-- | Additional parameters controlling delivery channel behavior. Optional.
--
-- /See:/ 'channelParams' smart constructor.
newtype ChannelParams = ChannelParams'
    { _cpAddtional :: HashMap Text Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ChannelParams' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'cpAddtional'
channelParams
    :: HashMap Text Text -- ^ 'cpAddtional'
    -> ChannelParams
channelParams pCpAddtional_ =
    ChannelParams'
    { _cpAddtional = _Coerce # pCpAddtional_
    }

-- | Declares a new parameter by name.
cpAddtional :: Lens' ChannelParams (HashMap Text Text)
cpAddtional
  = lens _cpAddtional (\ s a -> s{_cpAddtional = a}) .
      _Coerce

instance FromJSON ChannelParams where
        parseJSON
          = withObject "ChannelParams"
              (\ o -> ChannelParams' <$> (parseJSONObject o))

instance ToJSON ChannelParams where
        toJSON = toJSON . _cpAddtional

-- | Trusted Platform Module (TPM) (Read-only)
--
-- /See:/ 'chromeOSDeviceTpmVersionInfo' smart constructor.
data ChromeOSDeviceTpmVersionInfo = ChromeOSDeviceTpmVersionInfo'
    { _codtviVendorSpecific  :: !(Maybe Text)
    , _codtviManufacturer    :: !(Maybe Text)
    , _codtviSpecLevel       :: !(Maybe Text)
    , _codtviTpmModel        :: !(Maybe Text)
    , _codtviFamily          :: !(Maybe Text)
    , _codtviFirmwareVersion :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ChromeOSDeviceTpmVersionInfo' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'codtviVendorSpecific'
--
-- * 'codtviManufacturer'
--
-- * 'codtviSpecLevel'
--
-- * 'codtviTpmModel'
--
-- * 'codtviFamily'
--
-- * 'codtviFirmwareVersion'
chromeOSDeviceTpmVersionInfo
    :: ChromeOSDeviceTpmVersionInfo
chromeOSDeviceTpmVersionInfo =
    ChromeOSDeviceTpmVersionInfo'
    { _codtviVendorSpecific = Nothing
    , _codtviManufacturer = Nothing
    , _codtviSpecLevel = Nothing
    , _codtviTpmModel = Nothing
    , _codtviFamily = Nothing
    , _codtviFirmwareVersion = Nothing
    }

-- | Vendor-specific information such as Vendor ID.
codtviVendorSpecific :: Lens' ChromeOSDeviceTpmVersionInfo (Maybe Text)
codtviVendorSpecific
  = lens _codtviVendorSpecific
      (\ s a -> s{_codtviVendorSpecific = a})

-- | TPM manufacturer code.
codtviManufacturer :: Lens' ChromeOSDeviceTpmVersionInfo (Maybe Text)
codtviManufacturer
  = lens _codtviManufacturer
      (\ s a -> s{_codtviManufacturer = a})

-- | TPM specification level.
codtviSpecLevel :: Lens' ChromeOSDeviceTpmVersionInfo (Maybe Text)
codtviSpecLevel
  = lens _codtviSpecLevel
      (\ s a -> s{_codtviSpecLevel = a})

-- | TPM model number.
codtviTpmModel :: Lens' ChromeOSDeviceTpmVersionInfo (Maybe Text)
codtviTpmModel
  = lens _codtviTpmModel
      (\ s a -> s{_codtviTpmModel = a})

-- | TPM family.
codtviFamily :: Lens' ChromeOSDeviceTpmVersionInfo (Maybe Text)
codtviFamily
  = lens _codtviFamily (\ s a -> s{_codtviFamily = a})

-- | TPM firmware version.
codtviFirmwareVersion :: Lens' ChromeOSDeviceTpmVersionInfo (Maybe Text)
codtviFirmwareVersion
  = lens _codtviFirmwareVersion
      (\ s a -> s{_codtviFirmwareVersion = a})

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

instance ToJSON ChromeOSDeviceTpmVersionInfo where
        toJSON ChromeOSDeviceTpmVersionInfo'{..}
          = object
              (catMaybes
                 [("vendorSpecific" .=) <$> _codtviVendorSpecific,
                  ("manufacturer" .=) <$> _codtviManufacturer,
                  ("specLevel" .=) <$> _codtviSpecLevel,
                  ("tpmModel" .=) <$> _codtviTpmModel,
                  ("family" .=) <$> _codtviFamily,
                  ("firmwareVersion" .=) <$> _codtviFirmwareVersion])

-- | JSON template for an organization entry.
--
-- /See:/ 'userOrganization' smart constructor.
data UserOrganization = UserOrganization'
    { _uoDePartment         :: !(Maybe Text)
    , _uoLocation           :: !(Maybe Text)
    , _uoCostCenter         :: !(Maybe Text)
    , _uoDomain             :: !(Maybe Text)
    , _uoSymbol             :: !(Maybe Text)
    , _uoPrimary            :: !(Maybe Bool)
    , _uoName               :: !(Maybe Text)
    , _uoFullTimeEquivalent :: !(Maybe (Textual Int32))
    , _uoTitle              :: !(Maybe Text)
    , _uoType               :: !(Maybe Text)
    , _uoCustomType         :: !(Maybe Text)
    , _uoDescription        :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'UserOrganization' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'uoDePartment'
--
-- * 'uoLocation'
--
-- * 'uoCostCenter'
--
-- * 'uoDomain'
--
-- * 'uoSymbol'
--
-- * 'uoPrimary'
--
-- * 'uoName'
--
-- * 'uoFullTimeEquivalent'
--
-- * 'uoTitle'
--
-- * 'uoType'
--
-- * 'uoCustomType'
--
-- * 'uoDescription'
userOrganization
    :: UserOrganization
userOrganization =
    UserOrganization'
    { _uoDePartment = Nothing
    , _uoLocation = Nothing
    , _uoCostCenter = Nothing
    , _uoDomain = Nothing
    , _uoSymbol = Nothing
    , _uoPrimary = Nothing
    , _uoName = Nothing
    , _uoFullTimeEquivalent = Nothing
    , _uoTitle = Nothing
    , _uoType = Nothing
    , _uoCustomType = Nothing
    , _uoDescription = Nothing
    }

-- | Department within the organization.
uoDePartment :: Lens' UserOrganization (Maybe Text)
uoDePartment
  = lens _uoDePartment (\ s a -> s{_uoDePartment = a})

-- | Location of the organization. This need not be fully qualified address.
uoLocation :: Lens' UserOrganization (Maybe Text)
uoLocation
  = lens _uoLocation (\ s a -> s{_uoLocation = a})

-- | The cost center of the users department.
uoCostCenter :: Lens' UserOrganization (Maybe Text)
uoCostCenter
  = lens _uoCostCenter (\ s a -> s{_uoCostCenter = a})

-- | The domain to which the organization belongs to.
uoDomain :: Lens' UserOrganization (Maybe Text)
uoDomain = lens _uoDomain (\ s a -> s{_uoDomain = a})

-- | Symbol of the organization.
uoSymbol :: Lens' UserOrganization (Maybe Text)
uoSymbol = lens _uoSymbol (\ s a -> s{_uoSymbol = a})

-- | If it user\'s primary organization.
uoPrimary :: Lens' UserOrganization (Maybe Bool)
uoPrimary
  = lens _uoPrimary (\ s a -> s{_uoPrimary = a})

-- | Name of the organization
uoName :: Lens' UserOrganization (Maybe Text)
uoName = lens _uoName (\ s a -> s{_uoName = a})

-- | The full-time equivalent percent within the organization (100000 =
-- 100%).
uoFullTimeEquivalent :: Lens' UserOrganization (Maybe Int32)
uoFullTimeEquivalent
  = lens _uoFullTimeEquivalent
      (\ s a -> s{_uoFullTimeEquivalent = a})
      . mapping _Coerce

-- | Title (designation) of the user in the organization.
uoTitle :: Lens' UserOrganization (Maybe Text)
uoTitle = lens _uoTitle (\ s a -> s{_uoTitle = a})

-- | 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.
uoType :: Lens' UserOrganization (Maybe Text)
uoType = lens _uoType (\ s a -> s{_uoType = a})

-- | Custom type.
uoCustomType :: Lens' UserOrganization (Maybe Text)
uoCustomType
  = lens _uoCustomType (\ s a -> s{_uoCustomType = a})

-- | Description of the organization.
uoDescription :: Lens' UserOrganization (Maybe Text)
uoDescription
  = lens _uoDescription
      (\ s a -> s{_uoDescription = a})

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

instance ToJSON UserOrganization where
        toJSON UserOrganization'{..}
          = object
              (catMaybes
                 [("department" .=) <$> _uoDePartment,
                  ("location" .=) <$> _uoLocation,
                  ("costCenter" .=) <$> _uoCostCenter,
                  ("domain" .=) <$> _uoDomain,
                  ("symbol" .=) <$> _uoSymbol,
                  ("primary" .=) <$> _uoPrimary,
                  ("name" .=) <$> _uoName,
                  ("fullTimeEquivalent" .=) <$> _uoFullTimeEquivalent,
                  ("title" .=) <$> _uoTitle, ("type" .=) <$> _uoType,
                  ("customType" .=) <$> _uoCustomType,
                  ("description" .=) <$> _uoDescription])

-- | JSON template for a website entry.
--
-- /See:/ 'userWebsite' smart constructor.
data UserWebsite = UserWebsite'
    { _uwValue      :: !(Maybe Text)
    , _uwPrimary    :: !(Maybe Bool)
    , _uwType       :: !(Maybe Text)
    , _uwCustomType :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'UserWebsite' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'uwValue'
--
-- * 'uwPrimary'
--
-- * 'uwType'
--
-- * 'uwCustomType'
userWebsite
    :: UserWebsite
userWebsite =
    UserWebsite'
    { _uwValue = Nothing
    , _uwPrimary = Nothing
    , _uwType = Nothing
    , _uwCustomType = Nothing
    }

-- | Website.
uwValue :: Lens' UserWebsite (Maybe Text)
uwValue = lens _uwValue (\ s a -> s{_uwValue = a})

-- | If this is user\'s primary website or not.
uwPrimary :: Lens' UserWebsite (Maybe Bool)
uwPrimary
  = lens _uwPrimary (\ s a -> s{_uwPrimary = a})

-- | 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.
uwType :: Lens' UserWebsite (Maybe Text)
uwType = lens _uwType (\ s a -> s{_uwType = a})

-- | Custom Type.
uwCustomType :: Lens' UserWebsite (Maybe Text)
uwCustomType
  = lens _uwCustomType (\ s a -> s{_uwCustomType = a})

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

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

--
-- /See:/ 'chromeOSDeviceActiveTimeRangesItem' smart constructor.
data ChromeOSDeviceActiveTimeRangesItem = ChromeOSDeviceActiveTimeRangesItem'
    { _codatriDate       :: !(Maybe Date')
    , _codatriActiveTime :: !(Maybe (Textual Int32))
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ChromeOSDeviceActiveTimeRangesItem' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'codatriDate'
--
-- * 'codatriActiveTime'
chromeOSDeviceActiveTimeRangesItem
    :: ChromeOSDeviceActiveTimeRangesItem
chromeOSDeviceActiveTimeRangesItem =
    ChromeOSDeviceActiveTimeRangesItem'
    { _codatriDate = Nothing
    , _codatriActiveTime = Nothing
    }

-- | Date of usage
codatriDate :: Lens' ChromeOSDeviceActiveTimeRangesItem (Maybe Day)
codatriDate
  = lens _codatriDate (\ s a -> s{_codatriDate = a}) .
      mapping _Date

-- | Duration in milliseconds
codatriActiveTime :: Lens' ChromeOSDeviceActiveTimeRangesItem (Maybe Int32)
codatriActiveTime
  = lens _codatriActiveTime
      (\ s a -> s{_codatriActiveTime = a})
      . mapping _Coerce

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

instance ToJSON ChromeOSDeviceActiveTimeRangesItem
         where
        toJSON ChromeOSDeviceActiveTimeRangesItem'{..}
          = object
              (catMaybes
                 [("date" .=) <$> _codatriDate,
                  ("activeTime" .=) <$> _codatriActiveTime])

-- | JSON template for an email.
--
-- /See:/ 'userEmail' smart constructor.
data UserEmail = UserEmail'
    { _ueAddress    :: !(Maybe Text)
    , _uePrimary    :: !(Maybe Bool)
    , _ueType       :: !(Maybe Text)
    , _ueCustomType :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'UserEmail' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ueAddress'
--
-- * 'uePrimary'
--
-- * 'ueType'
--
-- * 'ueCustomType'
userEmail
    :: UserEmail
userEmail =
    UserEmail'
    { _ueAddress = Nothing
    , _uePrimary = Nothing
    , _ueType = Nothing
    , _ueCustomType = Nothing
    }

-- | Email id of the user.
ueAddress :: Lens' UserEmail (Maybe Text)
ueAddress
  = lens _ueAddress (\ s a -> s{_ueAddress = a})

-- | If this is user\'s primary email. Only one entry could be marked as
-- primary.
uePrimary :: Lens' UserEmail (Maybe Bool)
uePrimary
  = lens _uePrimary (\ s a -> s{_uePrimary = a})

-- | 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.
ueType :: Lens' UserEmail (Maybe Text)
ueType = lens _ueType (\ s a -> s{_ueType = a})

-- | Custom Type.
ueCustomType :: Lens' UserEmail (Maybe Text)
ueCustomType
  = lens _ueCustomType (\ s a -> s{_ueCustomType = a})

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

instance ToJSON UserEmail where
        toJSON UserEmail'{..}
          = object
              (catMaybes
                 [("address" .=) <$> _ueAddress,
                  ("primary" .=) <$> _uePrimary,
                  ("type" .=) <$> _ueType,
                  ("customType" .=) <$> _ueCustomType])

-- | JSON template for a phone entry.
--
-- /See:/ 'userPhone' smart constructor.
data UserPhone = UserPhone'
    { _upValue      :: !(Maybe Text)
    , _upPrimary    :: !(Maybe Bool)
    , _upType       :: !(Maybe Text)
    , _upCustomType :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'UserPhone' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'upValue'
--
-- * 'upPrimary'
--
-- * 'upType'
--
-- * 'upCustomType'
userPhone
    :: UserPhone
userPhone =
    UserPhone'
    { _upValue = Nothing
    , _upPrimary = Nothing
    , _upType = Nothing
    , _upCustomType = Nothing
    }

-- | Phone number.
upValue :: Lens' UserPhone (Maybe Text)
upValue = lens _upValue (\ s a -> s{_upValue = a})

-- | If this is user\'s primary phone or not.
upPrimary :: Lens' UserPhone (Maybe Bool)
upPrimary
  = lens _upPrimary (\ s a -> s{_upPrimary = a})

-- | 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.
upType :: Lens' UserPhone (Maybe Text)
upType = lens _upType (\ s a -> s{_upType = a})

-- | Custom Type.
upCustomType :: Lens' UserPhone (Maybe Text)
upCustomType
  = lens _upCustomType (\ s a -> s{_upCustomType = a})

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

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

-- | JSON template for Photo object in Directory API.
--
-- /See:/ 'userPhoto' smart constructor.
data UserPhoto = UserPhoto'
    { _upPhotoData    :: !(Maybe Bytes)
    , _upEtag         :: !(Maybe Text)
    , _upHeight       :: !(Maybe (Textual Int32))
    , _upKind         :: !Text
    , _upWidth        :: !(Maybe (Textual Int32))
    , _upMimeType     :: !(Maybe Text)
    , _upId           :: !(Maybe Text)
    , _upPrimaryEmail :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'UserPhoto' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'upPhotoData'
--
-- * 'upEtag'
--
-- * 'upHeight'
--
-- * 'upKind'
--
-- * 'upWidth'
--
-- * 'upMimeType'
--
-- * 'upId'
--
-- * 'upPrimaryEmail'
userPhoto
    :: UserPhoto
userPhoto =
    UserPhoto'
    { _upPhotoData = Nothing
    , _upEtag = Nothing
    , _upHeight = Nothing
    , _upKind = "admin#directory#user#photo"
    , _upWidth = Nothing
    , _upMimeType = Nothing
    , _upId = Nothing
    , _upPrimaryEmail = Nothing
    }

-- | Base64 encoded photo data
upPhotoData :: Lens' UserPhoto (Maybe ByteString)
upPhotoData
  = lens _upPhotoData (\ s a -> s{_upPhotoData = a}) .
      mapping _Bytes

-- | ETag of the resource.
upEtag :: Lens' UserPhoto (Maybe Text)
upEtag = lens _upEtag (\ s a -> s{_upEtag = a})

-- | Height in pixels of the photo
upHeight :: Lens' UserPhoto (Maybe Int32)
upHeight
  = lens _upHeight (\ s a -> s{_upHeight = a}) .
      mapping _Coerce

-- | Kind of resource this is.
upKind :: Lens' UserPhoto Text
upKind = lens _upKind (\ s a -> s{_upKind = a})

-- | Width in pixels of the photo
upWidth :: Lens' UserPhoto (Maybe Int32)
upWidth
  = lens _upWidth (\ s a -> s{_upWidth = a}) .
      mapping _Coerce

-- | Mime Type of the photo
upMimeType :: Lens' UserPhoto (Maybe Text)
upMimeType
  = lens _upMimeType (\ s a -> s{_upMimeType = a})

-- | Unique identifier of User (Read-only)
upId :: Lens' UserPhoto (Maybe Text)
upId = lens _upId (\ s a -> s{_upId = a})

-- | Primary email of User (Read-only)
upPrimaryEmail :: Lens' UserPhoto (Maybe Text)
upPrimaryEmail
  = lens _upPrimaryEmail
      (\ s a -> s{_upPrimaryEmail = a})

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

instance ToJSON UserPhoto where
        toJSON UserPhoto'{..}
          = object
              (catMaybes
                 [("photoData" .=) <$> _upPhotoData,
                  ("etag" .=) <$> _upEtag, ("height" .=) <$> _upHeight,
                  Just ("kind" .= _upKind), ("width" .=) <$> _upWidth,
                  ("mimeType" .=) <$> _upMimeType, ("id" .=) <$> _upId,
                  ("primaryEmail" .=) <$> _upPrimaryEmail])

--
-- /See:/ 'chromeOSDeviceSystemRamFreeReportsItem' smart constructor.
data ChromeOSDeviceSystemRamFreeReportsItem = ChromeOSDeviceSystemRamFreeReportsItem'
    { _codsrfriReportTime        :: !(Maybe DateTime')
    , _codsrfriSystemRamFreeInfo :: !(Maybe [Textual Int64])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ChromeOSDeviceSystemRamFreeReportsItem' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'codsrfriReportTime'
--
-- * 'codsrfriSystemRamFreeInfo'
chromeOSDeviceSystemRamFreeReportsItem
    :: ChromeOSDeviceSystemRamFreeReportsItem
chromeOSDeviceSystemRamFreeReportsItem =
    ChromeOSDeviceSystemRamFreeReportsItem'
    { _codsrfriReportTime = Nothing
    , _codsrfriSystemRamFreeInfo = Nothing
    }

-- | Date and time the report was received.
codsrfriReportTime :: Lens' ChromeOSDeviceSystemRamFreeReportsItem (Maybe UTCTime)
codsrfriReportTime
  = lens _codsrfriReportTime
      (\ s a -> s{_codsrfriReportTime = a})
      . mapping _DateTime

codsrfriSystemRamFreeInfo :: Lens' ChromeOSDeviceSystemRamFreeReportsItem [Int64]
codsrfriSystemRamFreeInfo
  = lens _codsrfriSystemRamFreeInfo
      (\ s a -> s{_codsrfriSystemRamFreeInfo = a})
      . _Default
      . _Coerce

instance FromJSON
         ChromeOSDeviceSystemRamFreeReportsItem where
        parseJSON
          = withObject "ChromeOSDeviceSystemRamFreeReportsItem"
              (\ o ->
                 ChromeOSDeviceSystemRamFreeReportsItem' <$>
                   (o .:? "reportTime") <*>
                     (o .:? "systemRamFreeInfo" .!= mempty))

instance ToJSON
         ChromeOSDeviceSystemRamFreeReportsItem where
        toJSON ChromeOSDeviceSystemRamFreeReportsItem'{..}
          = object
              (catMaybes
                 [("reportTime" .=) <$> _codsrfriReportTime,
                  ("systemRamFreeInfo" .=) <$>
                    _codsrfriSystemRamFreeInfo])

-- | JSON template for a POSIX account entry. Description of the field
-- family: go\/fbs-posix.
--
-- /See:/ 'userPosixAccount' smart constructor.
data UserPosixAccount = UserPosixAccount'
    { _upaGecos               :: !(Maybe Text)
    , _upaUid                 :: !(Maybe (Textual Word64))
    , _upaUsername            :: !(Maybe Text)
    , _upaShell               :: !(Maybe Text)
    , _upaPrimary             :: !(Maybe Bool)
    , _upaAccountId           :: !(Maybe Text)
    , _upaGid                 :: !(Maybe (Textual Word64))
    , _upaOperatingSystemType :: !(Maybe Text)
    , _upaSystemId            :: !(Maybe Text)
    , _upaHomeDirectory       :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'UserPosixAccount' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'upaGecos'
--
-- * 'upaUid'
--
-- * 'upaUsername'
--
-- * 'upaShell'
--
-- * 'upaPrimary'
--
-- * 'upaAccountId'
--
-- * 'upaGid'
--
-- * 'upaOperatingSystemType'
--
-- * 'upaSystemId'
--
-- * 'upaHomeDirectory'
userPosixAccount
    :: UserPosixAccount
userPosixAccount =
    UserPosixAccount'
    { _upaGecos = Nothing
    , _upaUid = Nothing
    , _upaUsername = Nothing
    , _upaShell = Nothing
    , _upaPrimary = Nothing
    , _upaAccountId = Nothing
    , _upaGid = Nothing
    , _upaOperatingSystemType = Nothing
    , _upaSystemId = Nothing
    , _upaHomeDirectory = Nothing
    }

-- | The GECOS (user information) for this account.
upaGecos :: Lens' UserPosixAccount (Maybe Text)
upaGecos = lens _upaGecos (\ s a -> s{_upaGecos = a})

-- | The POSIX compliant user ID.
upaUid :: Lens' UserPosixAccount (Maybe Word64)
upaUid
  = lens _upaUid (\ s a -> s{_upaUid = a}) .
      mapping _Coerce

-- | The username of the account.
upaUsername :: Lens' UserPosixAccount (Maybe Text)
upaUsername
  = lens _upaUsername (\ s a -> s{_upaUsername = a})

-- | The path to the login shell for this account.
upaShell :: Lens' UserPosixAccount (Maybe Text)
upaShell = lens _upaShell (\ s a -> s{_upaShell = a})

-- | If this is user\'s primary account within the SystemId.
upaPrimary :: Lens' UserPosixAccount (Maybe Bool)
upaPrimary
  = lens _upaPrimary (\ s a -> s{_upaPrimary = a})

-- | A POSIX account field identifier. (Read-only)
upaAccountId :: Lens' UserPosixAccount (Maybe Text)
upaAccountId
  = lens _upaAccountId (\ s a -> s{_upaAccountId = a})

-- | The default group ID.
upaGid :: Lens' UserPosixAccount (Maybe Word64)
upaGid
  = lens _upaGid (\ s a -> s{_upaGid = a}) .
      mapping _Coerce

-- | The operating system type for this account.
upaOperatingSystemType :: Lens' UserPosixAccount (Maybe Text)
upaOperatingSystemType
  = lens _upaOperatingSystemType
      (\ s a -> s{_upaOperatingSystemType = a})

-- | System identifier for which account Username or Uid apply to.
upaSystemId :: Lens' UserPosixAccount (Maybe Text)
upaSystemId
  = lens _upaSystemId (\ s a -> s{_upaSystemId = a})

-- | The path to the home directory for this account.
upaHomeDirectory :: Lens' UserPosixAccount (Maybe Text)
upaHomeDirectory
  = lens _upaHomeDirectory
      (\ s a -> s{_upaHomeDirectory = a})

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

instance ToJSON UserPosixAccount where
        toJSON UserPosixAccount'{..}
          = object
              (catMaybes
                 [("gecos" .=) <$> _upaGecos, ("uid" .=) <$> _upaUid,
                  ("username" .=) <$> _upaUsername,
                  ("shell" .=) <$> _upaShell,
                  ("primary" .=) <$> _upaPrimary,
                  ("accountId" .=) <$> _upaAccountId,
                  ("gid" .=) <$> _upaGid,
                  ("operatingSystemType" .=) <$>
                    _upaOperatingSystemType,
                  ("systemId" .=) <$> _upaSystemId,
                  ("homeDirectory" .=) <$> _upaHomeDirectory])

-- | JSON template for a \"feature instance\".
--
-- /See:/ 'featureInstance' smart constructor.
newtype FeatureInstance = FeatureInstance'
    { _fiFeature :: Maybe Feature
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'FeatureInstance' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'fiFeature'
featureInstance
    :: FeatureInstance
featureInstance =
    FeatureInstance'
    { _fiFeature = Nothing
    }

-- | The feature that this is an instance of. A calendar resource may have
-- multiple instances of a feature.
fiFeature :: Lens' FeatureInstance (Maybe Feature)
fiFeature
  = lens _fiFeature (\ s a -> s{_fiFeature = a})

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

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

-- | JSON template for Mobile Device resource in Directory API.
--
-- /See:/ 'mobileDevice' smart constructor.
data MobileDevice = MobileDevice'
    { _mobEmail                          :: !(Maybe [Text])
    , _mobStatus                         :: !(Maybe Text)
    , _mobPrivilege                      :: !(Maybe Text)
    , _mobEtag                           :: !(Maybe Text)
    , _mobResourceId                     :: !(Maybe Text)
    , _mobManufacturer                   :: !(Maybe Text)
    , _mobBuildNumber                    :: !(Maybe Text)
    , _mobManagedAccountIsOnOwnerProFile :: !(Maybe Bool)
    , _mobLastSync                       :: !(Maybe DateTime')
    , _mobOtherAccountsInfo              :: !(Maybe [Text])
    , _mobKind                           :: !Text
    , _mobAdbStatus                      :: !(Maybe Bool)
    , _mobReleaseVersion                 :: !(Maybe Text)
    , _mobBrand                          :: !(Maybe Text)
    , _mobSecurityPatchLevel             :: !(Maybe (Textual Int64))
    , _mobNetworkOperator                :: !(Maybe Text)
    , _mobKernelVersion                  :: !(Maybe Text)
    , _mobOS                             :: !(Maybe Text)
    , _mobName                           :: !(Maybe [Text])
    , _mobModel                          :: !(Maybe Text)
    , _mobDeveloperOptionsStatus         :: !(Maybe Bool)
    , _mobUnknownSourcesStatus           :: !(Maybe Bool)
    , _mobMeid                           :: !(Maybe Text)
    , _mobBootLoaderVersion              :: !(Maybe Text)
    , _mobDeviceId                       :: !(Maybe Text)
    , _mobFirstSync                      :: !(Maybe DateTime')
    , _mobUserAgent                      :: !(Maybe Text)
    , _mobImei                           :: !(Maybe Text)
    , _mobType                           :: !(Maybe Text)
    , _mobWifiMACAddress                 :: !(Maybe Text)
    , _mobEncryptionStatus               :: !(Maybe Text)
    , _mobSerialNumber                   :: !(Maybe Text)
    , _mobDevicePasswordStatus           :: !(Maybe Text)
    , _mobHardwareId                     :: !(Maybe Text)
    , _mobBasebandVersion                :: !(Maybe Text)
    , _mobSupportsWorkProFile            :: !(Maybe Bool)
    , _mobHardware                       :: !(Maybe Text)
    , _mobDeviceCompromisedStatus        :: !(Maybe Text)
    , _mobApplications                   :: !(Maybe [MobileDeviceApplicationsItem])
    , _mobDefaultLanguage                :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'MobileDevice' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'mobEmail'
--
-- * 'mobStatus'
--
-- * 'mobPrivilege'
--
-- * 'mobEtag'
--
-- * 'mobResourceId'
--
-- * 'mobManufacturer'
--
-- * 'mobBuildNumber'
--
-- * 'mobManagedAccountIsOnOwnerProFile'
--
-- * 'mobLastSync'
--
-- * 'mobOtherAccountsInfo'
--
-- * 'mobKind'
--
-- * 'mobAdbStatus'
--
-- * 'mobReleaseVersion'
--
-- * 'mobBrand'
--
-- * 'mobSecurityPatchLevel'
--
-- * 'mobNetworkOperator'
--
-- * 'mobKernelVersion'
--
-- * 'mobOS'
--
-- * 'mobName'
--
-- * 'mobModel'
--
-- * 'mobDeveloperOptionsStatus'
--
-- * 'mobUnknownSourcesStatus'
--
-- * 'mobMeid'
--
-- * 'mobBootLoaderVersion'
--
-- * 'mobDeviceId'
--
-- * 'mobFirstSync'
--
-- * 'mobUserAgent'
--
-- * 'mobImei'
--
-- * 'mobType'
--
-- * 'mobWifiMACAddress'
--
-- * 'mobEncryptionStatus'
--
-- * 'mobSerialNumber'
--
-- * 'mobDevicePasswordStatus'
--
-- * 'mobHardwareId'
--
-- * 'mobBasebandVersion'
--
-- * 'mobSupportsWorkProFile'
--
-- * 'mobHardware'
--
-- * 'mobDeviceCompromisedStatus'
--
-- * 'mobApplications'
--
-- * 'mobDefaultLanguage'
mobileDevice
    :: MobileDevice
mobileDevice =
    MobileDevice'
    { _mobEmail = Nothing
    , _mobStatus = Nothing
    , _mobPrivilege = Nothing
    , _mobEtag = Nothing
    , _mobResourceId = Nothing
    , _mobManufacturer = Nothing
    , _mobBuildNumber = Nothing
    , _mobManagedAccountIsOnOwnerProFile = Nothing
    , _mobLastSync = Nothing
    , _mobOtherAccountsInfo = Nothing
    , _mobKind = "admin#directory#mobiledevice"
    , _mobAdbStatus = Nothing
    , _mobReleaseVersion = Nothing
    , _mobBrand = Nothing
    , _mobSecurityPatchLevel = Nothing
    , _mobNetworkOperator = Nothing
    , _mobKernelVersion = Nothing
    , _mobOS = Nothing
    , _mobName = Nothing
    , _mobModel = Nothing
    , _mobDeveloperOptionsStatus = Nothing
    , _mobUnknownSourcesStatus = Nothing
    , _mobMeid = Nothing
    , _mobBootLoaderVersion = Nothing
    , _mobDeviceId = Nothing
    , _mobFirstSync = Nothing
    , _mobUserAgent = Nothing
    , _mobImei = Nothing
    , _mobType = Nothing
    , _mobWifiMACAddress = Nothing
    , _mobEncryptionStatus = Nothing
    , _mobSerialNumber = Nothing
    , _mobDevicePasswordStatus = Nothing
    , _mobHardwareId = Nothing
    , _mobBasebandVersion = Nothing
    , _mobSupportsWorkProFile = Nothing
    , _mobHardware = Nothing
    , _mobDeviceCompromisedStatus = Nothing
    , _mobApplications = Nothing
    , _mobDefaultLanguage = Nothing
    }

-- | List of owner user\'s email addresses (Read-only)
mobEmail :: Lens' MobileDevice [Text]
mobEmail
  = lens _mobEmail (\ s a -> s{_mobEmail = a}) .
      _Default
      . _Coerce

-- | Status of the device (Read-only)
mobStatus :: Lens' MobileDevice (Maybe Text)
mobStatus
  = lens _mobStatus (\ s a -> s{_mobStatus = a})

-- | DMAgentPermission (Read-only)
mobPrivilege :: Lens' MobileDevice (Maybe Text)
mobPrivilege
  = lens _mobPrivilege (\ s a -> s{_mobPrivilege = a})

-- | ETag of the resource.
mobEtag :: Lens' MobileDevice (Maybe Text)
mobEtag = lens _mobEtag (\ s a -> s{_mobEtag = a})

-- | Unique identifier of Mobile Device (Read-only)
mobResourceId :: Lens' MobileDevice (Maybe Text)
mobResourceId
  = lens _mobResourceId
      (\ s a -> s{_mobResourceId = a})

-- | Mobile Device manufacturer (Read-only)
mobManufacturer :: Lens' MobileDevice (Maybe Text)
mobManufacturer
  = lens _mobManufacturer
      (\ s a -> s{_mobManufacturer = a})

-- | Mobile Device Build number (Read-only)
mobBuildNumber :: Lens' MobileDevice (Maybe Text)
mobBuildNumber
  = lens _mobBuildNumber
      (\ s a -> s{_mobBuildNumber = a})

-- | Boolean indicating if this account is on owner\/primary profile or not
-- (Read-only)
mobManagedAccountIsOnOwnerProFile :: Lens' MobileDevice (Maybe Bool)
mobManagedAccountIsOnOwnerProFile
  = lens _mobManagedAccountIsOnOwnerProFile
      (\ s a -> s{_mobManagedAccountIsOnOwnerProFile = a})

-- | Date and time the device was last synchronized with the policy settings
-- in the G Suite administrator control panel (Read-only)
mobLastSync :: Lens' MobileDevice (Maybe UTCTime)
mobLastSync
  = lens _mobLastSync (\ s a -> s{_mobLastSync = a}) .
      mapping _DateTime

-- | List of accounts added on device (Read-only)
mobOtherAccountsInfo :: Lens' MobileDevice [Text]
mobOtherAccountsInfo
  = lens _mobOtherAccountsInfo
      (\ s a -> s{_mobOtherAccountsInfo = a})
      . _Default
      . _Coerce

-- | Kind of resource this is.
mobKind :: Lens' MobileDevice Text
mobKind = lens _mobKind (\ s a -> s{_mobKind = a})

-- | Adb (USB debugging) enabled or disabled on device (Read-only)
mobAdbStatus :: Lens' MobileDevice (Maybe Bool)
mobAdbStatus
  = lens _mobAdbStatus (\ s a -> s{_mobAdbStatus = a})

-- | Mobile Device release version version (Read-only)
mobReleaseVersion :: Lens' MobileDevice (Maybe Text)
mobReleaseVersion
  = lens _mobReleaseVersion
      (\ s a -> s{_mobReleaseVersion = a})

-- | Mobile Device Brand (Read-only)
mobBrand :: Lens' MobileDevice (Maybe Text)
mobBrand = lens _mobBrand (\ s a -> s{_mobBrand = a})

-- | Mobile Device Security patch level (Read-only)
mobSecurityPatchLevel :: Lens' MobileDevice (Maybe Int64)
mobSecurityPatchLevel
  = lens _mobSecurityPatchLevel
      (\ s a -> s{_mobSecurityPatchLevel = a})
      . mapping _Coerce

-- | Mobile Device mobile or network operator (if available) (Read-only)
mobNetworkOperator :: Lens' MobileDevice (Maybe Text)
mobNetworkOperator
  = lens _mobNetworkOperator
      (\ s a -> s{_mobNetworkOperator = a})

-- | Mobile Device Kernel version (Read-only)
mobKernelVersion :: Lens' MobileDevice (Maybe Text)
mobKernelVersion
  = lens _mobKernelVersion
      (\ s a -> s{_mobKernelVersion = a})

-- | Name of the mobile operating system
mobOS :: Lens' MobileDevice (Maybe Text)
mobOS = lens _mobOS (\ s a -> s{_mobOS = a})

-- | List of owner user\'s names (Read-only)
mobName :: Lens' MobileDevice [Text]
mobName
  = lens _mobName (\ s a -> s{_mobName = a}) . _Default
      . _Coerce

-- | Name of the model of the device
mobModel :: Lens' MobileDevice (Maybe Text)
mobModel = lens _mobModel (\ s a -> s{_mobModel = a})

-- | Developer options enabled or disabled on device (Read-only)
mobDeveloperOptionsStatus :: Lens' MobileDevice (Maybe Bool)
mobDeveloperOptionsStatus
  = lens _mobDeveloperOptionsStatus
      (\ s a -> s{_mobDeveloperOptionsStatus = a})

-- | Unknown sources enabled or disabled on device (Read-only)
mobUnknownSourcesStatus :: Lens' MobileDevice (Maybe Bool)
mobUnknownSourcesStatus
  = lens _mobUnknownSourcesStatus
      (\ s a -> s{_mobUnknownSourcesStatus = a})

-- | Mobile Device MEID number (Read-only)
mobMeid :: Lens' MobileDevice (Maybe Text)
mobMeid = lens _mobMeid (\ s a -> s{_mobMeid = a})

-- | Mobile Device Bootloader version (Read-only)
mobBootLoaderVersion :: Lens' MobileDevice (Maybe Text)
mobBootLoaderVersion
  = lens _mobBootLoaderVersion
      (\ s a -> s{_mobBootLoaderVersion = a})

-- | Mobile Device serial number (Read-only)
mobDeviceId :: Lens' MobileDevice (Maybe Text)
mobDeviceId
  = lens _mobDeviceId (\ s a -> s{_mobDeviceId = a})

-- | Date and time the device was first synchronized with the policy settings
-- in the G Suite administrator control panel (Read-only)
mobFirstSync :: Lens' MobileDevice (Maybe UTCTime)
mobFirstSync
  = lens _mobFirstSync (\ s a -> s{_mobFirstSync = a})
      . mapping _DateTime

-- | Mobile Device user agent
mobUserAgent :: Lens' MobileDevice (Maybe Text)
mobUserAgent
  = lens _mobUserAgent (\ s a -> s{_mobUserAgent = a})

-- | Mobile Device IMEI number (Read-only)
mobImei :: Lens' MobileDevice (Maybe Text)
mobImei = lens _mobImei (\ s a -> s{_mobImei = a})

-- | The type of device (Read-only)
mobType :: Lens' MobileDevice (Maybe Text)
mobType = lens _mobType (\ s a -> s{_mobType = a})

-- | Mobile Device WiFi MAC address (Read-only)
mobWifiMACAddress :: Lens' MobileDevice (Maybe Text)
mobWifiMACAddress
  = lens _mobWifiMACAddress
      (\ s a -> s{_mobWifiMACAddress = a})

-- | Mobile Device Encryption Status (Read-only)
mobEncryptionStatus :: Lens' MobileDevice (Maybe Text)
mobEncryptionStatus
  = lens _mobEncryptionStatus
      (\ s a -> s{_mobEncryptionStatus = a})

-- | Mobile Device SSN or Serial Number (Read-only)
mobSerialNumber :: Lens' MobileDevice (Maybe Text)
mobSerialNumber
  = lens _mobSerialNumber
      (\ s a -> s{_mobSerialNumber = a})

-- | DevicePasswordStatus (Read-only)
mobDevicePasswordStatus :: Lens' MobileDevice (Maybe Text)
mobDevicePasswordStatus
  = lens _mobDevicePasswordStatus
      (\ s a -> s{_mobDevicePasswordStatus = a})

-- | Mobile Device Hardware Id (Read-only)
mobHardwareId :: Lens' MobileDevice (Maybe Text)
mobHardwareId
  = lens _mobHardwareId
      (\ s a -> s{_mobHardwareId = a})

-- | Mobile Device Baseband version (Read-only)
mobBasebandVersion :: Lens' MobileDevice (Maybe Text)
mobBasebandVersion
  = lens _mobBasebandVersion
      (\ s a -> s{_mobBasebandVersion = a})

-- | Work profile supported on device (Read-only)
mobSupportsWorkProFile :: Lens' MobileDevice (Maybe Bool)
mobSupportsWorkProFile
  = lens _mobSupportsWorkProFile
      (\ s a -> s{_mobSupportsWorkProFile = a})

-- | Mobile Device Hardware (Read-only)
mobHardware :: Lens' MobileDevice (Maybe Text)
mobHardware
  = lens _mobHardware (\ s a -> s{_mobHardware = a})

-- | Mobile Device compromised status (Read-only)
mobDeviceCompromisedStatus :: Lens' MobileDevice (Maybe Text)
mobDeviceCompromisedStatus
  = lens _mobDeviceCompromisedStatus
      (\ s a -> s{_mobDeviceCompromisedStatus = a})

-- | List of applications installed on Mobile Device
mobApplications :: Lens' MobileDevice [MobileDeviceApplicationsItem]
mobApplications
  = lens _mobApplications
      (\ s a -> s{_mobApplications = a})
      . _Default
      . _Coerce

-- | The default locale used on the Mobile Device (Read-only)
mobDefaultLanguage :: Lens' MobileDevice (Maybe Text)
mobDefaultLanguage
  = lens _mobDefaultLanguage
      (\ s a -> s{_mobDefaultLanguage = a})

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

instance ToJSON MobileDevice where
        toJSON MobileDevice'{..}
          = object
              (catMaybes
                 [("email" .=) <$> _mobEmail,
                  ("status" .=) <$> _mobStatus,
                  ("privilege" .=) <$> _mobPrivilege,
                  ("etag" .=) <$> _mobEtag,
                  ("resourceId" .=) <$> _mobResourceId,
                  ("manufacturer" .=) <$> _mobManufacturer,
                  ("buildNumber" .=) <$> _mobBuildNumber,
                  ("managedAccountIsOnOwnerProfile" .=) <$>
                    _mobManagedAccountIsOnOwnerProFile,
                  ("lastSync" .=) <$> _mobLastSync,
                  ("otherAccountsInfo" .=) <$> _mobOtherAccountsInfo,
                  Just ("kind" .= _mobKind),
                  ("adbStatus" .=) <$> _mobAdbStatus,
                  ("releaseVersion" .=) <$> _mobReleaseVersion,
                  ("brand" .=) <$> _mobBrand,
                  ("securityPatchLevel" .=) <$> _mobSecurityPatchLevel,
                  ("networkOperator" .=) <$> _mobNetworkOperator,
                  ("kernelVersion" .=) <$> _mobKernelVersion,
                  ("os" .=) <$> _mobOS, ("name" .=) <$> _mobName,
                  ("model" .=) <$> _mobModel,
                  ("developerOptionsStatus" .=) <$>
                    _mobDeveloperOptionsStatus,
                  ("unknownSourcesStatus" .=) <$>
                    _mobUnknownSourcesStatus,
                  ("meid" .=) <$> _mobMeid,
                  ("bootloaderVersion" .=) <$> _mobBootLoaderVersion,
                  ("deviceId" .=) <$> _mobDeviceId,
                  ("firstSync" .=) <$> _mobFirstSync,
                  ("userAgent" .=) <$> _mobUserAgent,
                  ("imei" .=) <$> _mobImei, ("type" .=) <$> _mobType,
                  ("wifiMacAddress" .=) <$> _mobWifiMACAddress,
                  ("encryptionStatus" .=) <$> _mobEncryptionStatus,
                  ("serialNumber" .=) <$> _mobSerialNumber,
                  ("devicePasswordStatus" .=) <$>
                    _mobDevicePasswordStatus,
                  ("hardwareId" .=) <$> _mobHardwareId,
                  ("basebandVersion" .=) <$> _mobBasebandVersion,
                  ("supportsWorkProfile" .=) <$>
                    _mobSupportsWorkProFile,
                  ("hardware" .=) <$> _mobHardware,
                  ("deviceCompromisedStatus" .=) <$>
                    _mobDeviceCompromisedStatus,
                  ("applications" .=) <$> _mobApplications,
                  ("defaultLanguage" .=) <$> _mobDefaultLanguage])

--
-- /See:/ 'chromeOSDeviceCPUStatusReportsItem' smart constructor.
data ChromeOSDeviceCPUStatusReportsItem = ChromeOSDeviceCPUStatusReportsItem'
    { _codcsriCPUUtilizationPercentageInfo :: !(Maybe [Textual Int32])
    , _codcsriCPUTemperatureInfo           :: !(Maybe [ChromeOSDeviceCPUStatusReportsItemCPUTemperatureInfoItem])
    , _codcsriReportTime                   :: !(Maybe DateTime')
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ChromeOSDeviceCPUStatusReportsItem' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'codcsriCPUUtilizationPercentageInfo'
--
-- * 'codcsriCPUTemperatureInfo'
--
-- * 'codcsriReportTime'
chromeOSDeviceCPUStatusReportsItem
    :: ChromeOSDeviceCPUStatusReportsItem
chromeOSDeviceCPUStatusReportsItem =
    ChromeOSDeviceCPUStatusReportsItem'
    { _codcsriCPUUtilizationPercentageInfo = Nothing
    , _codcsriCPUTemperatureInfo = Nothing
    , _codcsriReportTime = Nothing
    }

codcsriCPUUtilizationPercentageInfo :: Lens' ChromeOSDeviceCPUStatusReportsItem [Int32]
codcsriCPUUtilizationPercentageInfo
  = lens _codcsriCPUUtilizationPercentageInfo
      (\ s a ->
         s{_codcsriCPUUtilizationPercentageInfo = a})
      . _Default
      . _Coerce

-- | List of CPU temperature samples.
codcsriCPUTemperatureInfo :: Lens' ChromeOSDeviceCPUStatusReportsItem [ChromeOSDeviceCPUStatusReportsItemCPUTemperatureInfoItem]
codcsriCPUTemperatureInfo
  = lens _codcsriCPUTemperatureInfo
      (\ s a -> s{_codcsriCPUTemperatureInfo = a})
      . _Default
      . _Coerce

-- | Date and time the report was received.
codcsriReportTime :: Lens' ChromeOSDeviceCPUStatusReportsItem (Maybe UTCTime)
codcsriReportTime
  = lens _codcsriReportTime
      (\ s a -> s{_codcsriReportTime = a})
      . mapping _DateTime

instance FromJSON ChromeOSDeviceCPUStatusReportsItem
         where
        parseJSON
          = withObject "ChromeOSDeviceCPUStatusReportsItem"
              (\ o ->
                 ChromeOSDeviceCPUStatusReportsItem' <$>
                   (o .:? "cpuUtilizationPercentageInfo" .!= mempty) <*>
                     (o .:? "cpuTemperatureInfo" .!= mempty)
                     <*> (o .:? "reportTime"))

instance ToJSON ChromeOSDeviceCPUStatusReportsItem
         where
        toJSON ChromeOSDeviceCPUStatusReportsItem'{..}
          = object
              (catMaybes
                 [("cpuUtilizationPercentageInfo" .=) <$>
                    _codcsriCPUUtilizationPercentageInfo,
                  ("cpuTemperatureInfo" .=) <$>
                    _codcsriCPUTemperatureInfo,
                  ("reportTime" .=) <$> _codcsriReportTime])

-- | JSON template for Member resource in Directory API.
--
-- /See:/ 'member' smart constructor.
data Member = Member'
    { _memEmail            :: !(Maybe Text)
    , _memStatus           :: !(Maybe Text)
    , _memEtag             :: !(Maybe Text)
    , _memKind             :: !Text
    , _memDeliverySettings :: !(Maybe Text)
    , _memRole             :: !(Maybe Text)
    , _memId               :: !(Maybe Text)
    , _memType             :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Member' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'memEmail'
--
-- * 'memStatus'
--
-- * 'memEtag'
--
-- * 'memKind'
--
-- * 'memDeliverySettings'
--
-- * 'memRole'
--
-- * 'memId'
--
-- * 'memType'
member
    :: Member
member =
    Member'
    { _memEmail = Nothing
    , _memStatus = Nothing
    , _memEtag = Nothing
    , _memKind = "admin#directory#member"
    , _memDeliverySettings = Nothing
    , _memRole = Nothing
    , _memId = Nothing
    , _memType = Nothing
    }

-- | Email of member (Read-only)
memEmail :: Lens' Member (Maybe Text)
memEmail = lens _memEmail (\ s a -> s{_memEmail = a})

-- | Status of member (Immutable)
memStatus :: Lens' Member (Maybe Text)
memStatus
  = lens _memStatus (\ s a -> s{_memStatus = a})

-- | ETag of the resource.
memEtag :: Lens' Member (Maybe Text)
memEtag = lens _memEtag (\ s a -> s{_memEtag = a})

-- | Kind of resource this is.
memKind :: Lens' Member Text
memKind = lens _memKind (\ s a -> s{_memKind = a})

-- | Delivery settings of member
memDeliverySettings :: Lens' Member (Maybe Text)
memDeliverySettings
  = lens _memDeliverySettings
      (\ s a -> s{_memDeliverySettings = a})

-- | Role of member
memRole :: Lens' Member (Maybe Text)
memRole = lens _memRole (\ s a -> s{_memRole = a})

-- | Unique identifier of customer member (Read-only) Unique identifier of
-- group (Read-only) Unique identifier of member (Read-only)
memId :: Lens' Member (Maybe Text)
memId = lens _memId (\ s a -> s{_memId = a})

-- | Type of member (Immutable)
memType :: Lens' Member (Maybe Text)
memType = lens _memType (\ s a -> s{_memType = a})

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

instance ToJSON Member where
        toJSON Member'{..}
          = object
              (catMaybes
                 [("email" .=) <$> _memEmail,
                  ("status" .=) <$> _memStatus,
                  ("etag" .=) <$> _memEtag, Just ("kind" .= _memKind),
                  ("delivery_settings" .=) <$> _memDeliverySettings,
                  ("role" .=) <$> _memRole, ("id" .=) <$> _memId,
                  ("type" .=) <$> _memType])

-- | JSON template for App Access Collections Resource object in Directory
-- API.
--
-- /See:/ 'appAccessCollections' smart constructor.
data AppAccessCollections = AppAccessCollections'
    { _aacEtag                           :: !(Maybe Text)
    , _aacResourceId                     :: !(Maybe (Textual Int64))
    , _aacEnforceSettingsForAndroidDrive :: !(Maybe Bool)
    , _aacResourceName                   :: !(Maybe Text)
    , _aacKind                           :: !Text
    , _aacTrustDomainOwnedApps           :: !(Maybe Bool)
    , _aacBlockedAPIAccessBuckets        :: !(Maybe [Text])
    , _aacErrorMessage                   :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'AppAccessCollections' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'aacEtag'
--
-- * 'aacResourceId'
--
-- * 'aacEnforceSettingsForAndroidDrive'
--
-- * 'aacResourceName'
--
-- * 'aacKind'
--
-- * 'aacTrustDomainOwnedApps'
--
-- * 'aacBlockedAPIAccessBuckets'
--
-- * 'aacErrorMessage'
appAccessCollections
    :: AppAccessCollections
appAccessCollections =
    AppAccessCollections'
    { _aacEtag = Nothing
    , _aacResourceId = Nothing
    , _aacEnforceSettingsForAndroidDrive = Nothing
    , _aacResourceName = Nothing
    , _aacKind = "admin#directory#appaccesscollection"
    , _aacTrustDomainOwnedApps = Nothing
    , _aacBlockedAPIAccessBuckets = Nothing
    , _aacErrorMessage = Nothing
    }

-- | ETag of the resource.
aacEtag :: Lens' AppAccessCollections (Maybe Text)
aacEtag = lens _aacEtag (\ s a -> s{_aacEtag = a})

-- | Unique ID of app access collection. (Readonly)
aacResourceId :: Lens' AppAccessCollections (Maybe Int64)
aacResourceId
  = lens _aacResourceId
      (\ s a -> s{_aacResourceId = a})
      . mapping _Coerce

-- | Boolean to indicate whether to enforce app access settings on Android
-- Drive or not.
aacEnforceSettingsForAndroidDrive :: Lens' AppAccessCollections (Maybe Bool)
aacEnforceSettingsForAndroidDrive
  = lens _aacEnforceSettingsForAndroidDrive
      (\ s a -> s{_aacEnforceSettingsForAndroidDrive = a})

-- | Resource name given by the customer while creating\/updating. Should be
-- unique under given customer.
aacResourceName :: Lens' AppAccessCollections (Maybe Text)
aacResourceName
  = lens _aacResourceName
      (\ s a -> s{_aacResourceName = a})

-- | Identifies the resource as an app access collection. Value:
-- admin#directory#appaccesscollection
aacKind :: Lens' AppAccessCollections Text
aacKind = lens _aacKind (\ s a -> s{_aacKind = a})

-- | Boolean that indicates whether to trust domain owned apps.
aacTrustDomainOwnedApps :: Lens' AppAccessCollections (Maybe Bool)
aacTrustDomainOwnedApps
  = lens _aacTrustDomainOwnedApps
      (\ s a -> s{_aacTrustDomainOwnedApps = a})

-- | List of blocked api access buckets.
aacBlockedAPIAccessBuckets :: Lens' AppAccessCollections [Text]
aacBlockedAPIAccessBuckets
  = lens _aacBlockedAPIAccessBuckets
      (\ s a -> s{_aacBlockedAPIAccessBuckets = a})
      . _Default
      . _Coerce

-- | Error message provided by the Admin that will be shown to the user when
-- an app is blocked.
aacErrorMessage :: Lens' AppAccessCollections (Maybe Text)
aacErrorMessage
  = lens _aacErrorMessage
      (\ s a -> s{_aacErrorMessage = a})

instance FromJSON AppAccessCollections where
        parseJSON
          = withObject "AppAccessCollections"
              (\ o ->
                 AppAccessCollections' <$>
                   (o .:? "etag") <*> (o .:? "resourceId") <*>
                     (o .:? "enforceSettingsForAndroidDrive")
                     <*> (o .:? "resourceName")
                     <*>
                     (o .:? "kind" .!=
                        "admin#directory#appaccesscollection")
                     <*> (o .:? "trustDomainOwnedApps")
                     <*> (o .:? "blockedApiAccessBuckets" .!= mempty)
                     <*> (o .:? "errorMessage"))

instance ToJSON AppAccessCollections where
        toJSON AppAccessCollections'{..}
          = object
              (catMaybes
                 [("etag" .=) <$> _aacEtag,
                  ("resourceId" .=) <$> _aacResourceId,
                  ("enforceSettingsForAndroidDrive" .=) <$>
                    _aacEnforceSettingsForAndroidDrive,
                  ("resourceName" .=) <$> _aacResourceName,
                  Just ("kind" .= _aacKind),
                  ("trustDomainOwnedApps" .=) <$>
                    _aacTrustDomainOwnedApps,
                  ("blockedApiAccessBuckets" .=) <$>
                    _aacBlockedAPIAccessBuckets,
                  ("errorMessage" .=) <$> _aacErrorMessage])

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

-- | Creates a value of 'UserCustomProperties' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ucpAddtional'
userCustomProperties
    :: HashMap Text JSONValue -- ^ 'ucpAddtional'
    -> UserCustomProperties
userCustomProperties pUcpAddtional_ =
    UserCustomProperties'
    { _ucpAddtional = _Coerce # pUcpAddtional_
    }

ucpAddtional :: Lens' UserCustomProperties (HashMap Text JSONValue)
ucpAddtional
  = lens _ucpAddtional (\ s a -> s{_ucpAddtional = a})
      . _Coerce

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

instance ToJSON UserCustomProperties where
        toJSON = toJSON . _ucpAddtional

-- | JSON template for a language entry.
--
-- /See:/ 'userLanguage' smart constructor.
data UserLanguage = UserLanguage'
    { _ulLanguageCode   :: !(Maybe Text)
    , _ulCustomLanguage :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'UserLanguage' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ulLanguageCode'
--
-- * 'ulCustomLanguage'
userLanguage
    :: UserLanguage
userLanguage =
    UserLanguage'
    { _ulLanguageCode = Nothing
    , _ulCustomLanguage = Nothing
    }

-- | Language Code. Should be used for storing Google III LanguageCode string
-- representation for language. Illegal values cause SchemaException.
ulLanguageCode :: Lens' UserLanguage (Maybe Text)
ulLanguageCode
  = lens _ulLanguageCode
      (\ s a -> s{_ulLanguageCode = a})

-- | Other language. User can provide own language name if there is no
-- corresponding Google III language code. If this is set LanguageCode
-- can\'t be set
ulCustomLanguage :: Lens' UserLanguage (Maybe Text)
ulCustomLanguage
  = lens _ulCustomLanguage
      (\ s a -> s{_ulCustomLanguage = a})

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

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

-- | JSON template for Domain object in Directory API.
--
-- /See:/ 'domains' smart constructor.
data Domains = Domains'
    { _domCreationTime  :: !(Maybe (Textual Int64))
    , _domEtag          :: !(Maybe Text)
    , _domKind          :: !Text
    , _domDomainAliases :: !(Maybe [DomainAlias])
    , _domVerified      :: !(Maybe Bool)
    , _domDomainName    :: !(Maybe Text)
    , _domIsPrimary     :: !(Maybe Bool)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Domains' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'domCreationTime'
--
-- * 'domEtag'
--
-- * 'domKind'
--
-- * 'domDomainAliases'
--
-- * 'domVerified'
--
-- * 'domDomainName'
--
-- * 'domIsPrimary'
domains
    :: Domains
domains =
    Domains'
    { _domCreationTime = Nothing
    , _domEtag = Nothing
    , _domKind = "admin#directory#domain"
    , _domDomainAliases = Nothing
    , _domVerified = Nothing
    , _domDomainName = Nothing
    , _domIsPrimary = Nothing
    }

-- | Creation time of the domain. (Read-only).
domCreationTime :: Lens' Domains (Maybe Int64)
domCreationTime
  = lens _domCreationTime
      (\ s a -> s{_domCreationTime = a})
      . mapping _Coerce

-- | ETag of the resource.
domEtag :: Lens' Domains (Maybe Text)
domEtag = lens _domEtag (\ s a -> s{_domEtag = a})

-- | Kind of resource this is.
domKind :: Lens' Domains Text
domKind = lens _domKind (\ s a -> s{_domKind = a})

-- | List of domain alias objects. (Read-only)
domDomainAliases :: Lens' Domains [DomainAlias]
domDomainAliases
  = lens _domDomainAliases
      (\ s a -> s{_domDomainAliases = a})
      . _Default
      . _Coerce

-- | Indicates the verification state of a domain. (Read-only).
domVerified :: Lens' Domains (Maybe Bool)
domVerified
  = lens _domVerified (\ s a -> s{_domVerified = a})

-- | The domain name of the customer.
domDomainName :: Lens' Domains (Maybe Text)
domDomainName
  = lens _domDomainName
      (\ s a -> s{_domDomainName = a})

-- | Indicates if the domain is a primary domain (Read-only).
domIsPrimary :: Lens' Domains (Maybe Bool)
domIsPrimary
  = lens _domIsPrimary (\ s a -> s{_domIsPrimary = a})

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

instance ToJSON Domains where
        toJSON Domains'{..}
          = object
              (catMaybes
                 [("creationTime" .=) <$> _domCreationTime,
                  ("etag" .=) <$> _domEtag, Just ("kind" .= _domKind),
                  ("domainAliases" .=) <$> _domDomainAliases,
                  ("verified" .=) <$> _domVerified,
                  ("domainName" .=) <$> _domDomainName,
                  ("isPrimary" .=) <$> _domIsPrimary])

-- | JSON template for Calendar Resource List Response object in Directory
-- API.
--
-- /See:/ 'calendarResources' smart constructor.
data CalendarResources = CalendarResources'
    { _crsEtag          :: !(Maybe Text)
    , _crsNextPageToken :: !(Maybe Text)
    , _crsKind          :: !Text
    , _crsItems         :: !(Maybe [CalendarResource])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'CalendarResources' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'crsEtag'
--
-- * 'crsNextPageToken'
--
-- * 'crsKind'
--
-- * 'crsItems'
calendarResources
    :: CalendarResources
calendarResources =
    CalendarResources'
    { _crsEtag = Nothing
    , _crsNextPageToken = Nothing
    , _crsKind = "admin#directory#resources#calendars#calendarResourcesList"
    , _crsItems = Nothing
    }

-- | ETag of the resource.
crsEtag :: Lens' CalendarResources (Maybe Text)
crsEtag = lens _crsEtag (\ s a -> s{_crsEtag = a})

-- | The continuation token, used to page through large result sets. Provide
-- this value in a subsequent request to return the next page of results.
crsNextPageToken :: Lens' CalendarResources (Maybe Text)
crsNextPageToken
  = lens _crsNextPageToken
      (\ s a -> s{_crsNextPageToken = a})

-- | Identifies this as a collection of CalendarResources. This is always
-- admin#directory#resources#calendars#calendarResourcesList.
crsKind :: Lens' CalendarResources Text
crsKind = lens _crsKind (\ s a -> s{_crsKind = a})

-- | The CalendarResources in this page of results.
crsItems :: Lens' CalendarResources [CalendarResource]
crsItems
  = lens _crsItems (\ s a -> s{_crsItems = a}) .
      _Default
      . _Coerce

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

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

-- | Template for notifications list response.
--
-- /See:/ 'notifications' smart constructor.
data Notifications = Notifications'
    { _notEtag                     :: !(Maybe Text)
    , _notNextPageToken            :: !(Maybe Text)
    , _notKind                     :: !Text
    , _notItems                    :: !(Maybe [Notification])
    , _notUnreadNotificationsCount :: !(Maybe (Textual Int32))
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Notifications' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'notEtag'
--
-- * 'notNextPageToken'
--
-- * 'notKind'
--
-- * 'notItems'
--
-- * 'notUnreadNotificationsCount'
notifications
    :: Notifications
notifications =
    Notifications'
    { _notEtag = Nothing
    , _notNextPageToken = Nothing
    , _notKind = "admin#directory#notifications"
    , _notItems = Nothing
    , _notUnreadNotificationsCount = Nothing
    }

-- | ETag of the resource.
notEtag :: Lens' Notifications (Maybe Text)
notEtag = lens _notEtag (\ s a -> s{_notEtag = a})

-- | Token for fetching the next page of notifications.
notNextPageToken :: Lens' Notifications (Maybe Text)
notNextPageToken
  = lens _notNextPageToken
      (\ s a -> s{_notNextPageToken = a})

-- | The type of the resource.
notKind :: Lens' Notifications Text
notKind = lens _notKind (\ s a -> s{_notKind = a})

-- | List of notifications in this page.
notItems :: Lens' Notifications [Notification]
notItems
  = lens _notItems (\ s a -> s{_notItems = a}) .
      _Default
      . _Coerce

-- | Number of unread notification for the domain.
notUnreadNotificationsCount :: Lens' Notifications (Maybe Int32)
notUnreadNotificationsCount
  = lens _notUnreadNotificationsCount
      (\ s a -> s{_notUnreadNotificationsCount = a})
      . mapping _Coerce

instance FromJSON Notifications where
        parseJSON
          = withObject "Notifications"
              (\ o ->
                 Notifications' <$>
                   (o .:? "etag") <*> (o .:? "nextPageToken") <*>
                     (o .:? "kind" .!= "admin#directory#notifications")
                     <*> (o .:? "items" .!= mempty)
                     <*> (o .:? "unreadNotificationsCount"))

instance ToJSON Notifications where
        toJSON Notifications'{..}
          = object
              (catMaybes
                 [("etag" .=) <$> _notEtag,
                  ("nextPageToken" .=) <$> _notNextPageToken,
                  Just ("kind" .= _notKind),
                  ("items" .=) <$> _notItems,
                  ("unreadNotificationsCount" .=) <$>
                    _notUnreadNotificationsCount])

-- | 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:/ 'schemaFieldSpecNumericIndexingSpec' smart constructor.
data SchemaFieldSpecNumericIndexingSpec = SchemaFieldSpecNumericIndexingSpec'
    { _sfsnisMaxValue :: !(Maybe (Textual Double))
    , _sfsnisMinValue :: !(Maybe (Textual Double))
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SchemaFieldSpecNumericIndexingSpec' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'sfsnisMaxValue'
--
-- * 'sfsnisMinValue'
schemaFieldSpecNumericIndexingSpec
    :: SchemaFieldSpecNumericIndexingSpec
schemaFieldSpecNumericIndexingSpec =
    SchemaFieldSpecNumericIndexingSpec'
    { _sfsnisMaxValue = Nothing
    , _sfsnisMinValue = Nothing
    }

-- | 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.
sfsnisMaxValue :: Lens' SchemaFieldSpecNumericIndexingSpec (Maybe Double)
sfsnisMaxValue
  = lens _sfsnisMaxValue
      (\ s a -> s{_sfsnisMaxValue = a})
      . mapping _Coerce

-- | 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.
sfsnisMinValue :: Lens' SchemaFieldSpecNumericIndexingSpec (Maybe Double)
sfsnisMinValue
  = lens _sfsnisMinValue
      (\ s a -> s{_sfsnisMinValue = a})
      . mapping _Coerce

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

instance ToJSON SchemaFieldSpecNumericIndexingSpec
         where
        toJSON SchemaFieldSpecNumericIndexingSpec'{..}
          = object
              (catMaybes
                 [("maxValue" .=) <$> _sfsnisMaxValue,
                  ("minValue" .=) <$> _sfsnisMinValue])

-- | JSON request template for firing commands on Mobile Device in Directory
-- Devices API.
--
-- /See:/ 'mobileDeviceAction' smart constructor.
newtype MobileDeviceAction = MobileDeviceAction'
    { _mdaAction :: Maybe Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'MobileDeviceAction' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'mdaAction'
mobileDeviceAction
    :: MobileDeviceAction
mobileDeviceAction =
    MobileDeviceAction'
    { _mdaAction = Nothing
    }

-- | Action to be taken on the Mobile Device
mdaAction :: Lens' MobileDeviceAction (Maybe Text)
mdaAction
  = lens _mdaAction (\ s a -> s{_mdaAction = a})

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

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

-- | JSON template for FieldSpec resource for Schemas in Directory API.
--
-- /See:/ 'schemaFieldSpec' smart constructor.
data SchemaFieldSpec = SchemaFieldSpec'
    { _sfsEtag                :: !(Maybe Text)
    , _sfsKind                :: !Text
    , _sfsNumericIndexingSpec :: !(Maybe SchemaFieldSpecNumericIndexingSpec)
    , _sfsReadAccessType      :: !Text
    , _sfsFieldId             :: !(Maybe Text)
    , _sfsIndexed             :: !Bool
    , _sfsFieldType           :: !(Maybe Text)
    , _sfsFieldName           :: !(Maybe Text)
    , _sfsDisplayName         :: !(Maybe Text)
    , _sfsMultiValued         :: !(Maybe Bool)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SchemaFieldSpec' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'sfsEtag'
--
-- * 'sfsKind'
--
-- * 'sfsNumericIndexingSpec'
--
-- * 'sfsReadAccessType'
--
-- * 'sfsFieldId'
--
-- * 'sfsIndexed'
--
-- * 'sfsFieldType'
--
-- * 'sfsFieldName'
--
-- * 'sfsDisplayName'
--
-- * 'sfsMultiValued'
schemaFieldSpec
    :: SchemaFieldSpec
schemaFieldSpec =
    SchemaFieldSpec'
    { _sfsEtag = Nothing
    , _sfsKind = "admin#directory#schema#fieldspec"
    , _sfsNumericIndexingSpec = Nothing
    , _sfsReadAccessType = "ALL_DOMAIN_USERS"
    , _sfsFieldId = Nothing
    , _sfsIndexed = True
    , _sfsFieldType = Nothing
    , _sfsFieldName = Nothing
    , _sfsDisplayName = Nothing
    , _sfsMultiValued = Nothing
    }

-- | ETag of the resource.
sfsEtag :: Lens' SchemaFieldSpec (Maybe Text)
sfsEtag = lens _sfsEtag (\ s a -> s{_sfsEtag = a})

-- | Kind of resource this is.
sfsKind :: Lens' SchemaFieldSpec Text
sfsKind = lens _sfsKind (\ s a -> s{_sfsKind = a})

-- | 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.
sfsNumericIndexingSpec :: Lens' SchemaFieldSpec (Maybe SchemaFieldSpecNumericIndexingSpec)
sfsNumericIndexingSpec
  = lens _sfsNumericIndexingSpec
      (\ s a -> s{_sfsNumericIndexingSpec = a})

-- | Read ACLs on the field specifying who can view values of this field.
-- Valid values are \"ALL_DOMAIN_USERS\" and \"ADMINS_AND_SELF\".
sfsReadAccessType :: Lens' SchemaFieldSpec Text
sfsReadAccessType
  = lens _sfsReadAccessType
      (\ s a -> s{_sfsReadAccessType = a})

-- | Unique identifier of Field (Read-only)
sfsFieldId :: Lens' SchemaFieldSpec (Maybe Text)
sfsFieldId
  = lens _sfsFieldId (\ s a -> s{_sfsFieldId = a})

-- | Boolean specifying whether the field is indexed or not.
sfsIndexed :: Lens' SchemaFieldSpec Bool
sfsIndexed
  = lens _sfsIndexed (\ s a -> s{_sfsIndexed = a})

-- | Type of the field.
sfsFieldType :: Lens' SchemaFieldSpec (Maybe Text)
sfsFieldType
  = lens _sfsFieldType (\ s a -> s{_sfsFieldType = a})

-- | Name of the field.
sfsFieldName :: Lens' SchemaFieldSpec (Maybe Text)
sfsFieldName
  = lens _sfsFieldName (\ s a -> s{_sfsFieldName = a})

-- | Display Name of the field.
sfsDisplayName :: Lens' SchemaFieldSpec (Maybe Text)
sfsDisplayName
  = lens _sfsDisplayName
      (\ s a -> s{_sfsDisplayName = a})

-- | Boolean specifying whether this is a multi-valued field or not.
sfsMultiValued :: Lens' SchemaFieldSpec (Maybe Bool)
sfsMultiValued
  = lens _sfsMultiValued
      (\ s a -> s{_sfsMultiValued = a})

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

instance ToJSON SchemaFieldSpec where
        toJSON SchemaFieldSpec'{..}
          = object
              (catMaybes
                 [("etag" .=) <$> _sfsEtag, Just ("kind" .= _sfsKind),
                  ("numericIndexingSpec" .=) <$>
                    _sfsNumericIndexingSpec,
                  Just ("readAccessType" .= _sfsReadAccessType),
                  ("fieldId" .=) <$> _sfsFieldId,
                  Just ("indexed" .= _sfsIndexed),
                  ("fieldType" .=) <$> _sfsFieldType,
                  ("fieldName" .=) <$> _sfsFieldName,
                  ("displayName" .=) <$> _sfsDisplayName,
                  ("multiValued" .=) <$> _sfsMultiValued])

-- | JSON response template for List Chrome OS Devices operation in Directory
-- API.
--
-- /See:/ 'chromeOSDevices' smart constructor.
data ChromeOSDevices = ChromeOSDevices'
    { _cosdEtag            :: !(Maybe Text)
    , _cosdNextPageToken   :: !(Maybe Text)
    , _cosdKind            :: !Text
    , _cosdChromeosDevices :: !(Maybe [ChromeOSDevice])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ChromeOSDevices' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'cosdEtag'
--
-- * 'cosdNextPageToken'
--
-- * 'cosdKind'
--
-- * 'cosdChromeosDevices'
chromeOSDevices
    :: ChromeOSDevices
chromeOSDevices =
    ChromeOSDevices'
    { _cosdEtag = Nothing
    , _cosdNextPageToken = Nothing
    , _cosdKind = "admin#directory#chromeosdevices"
    , _cosdChromeosDevices = Nothing
    }

-- | ETag of the resource.
cosdEtag :: Lens' ChromeOSDevices (Maybe Text)
cosdEtag = lens _cosdEtag (\ s a -> s{_cosdEtag = a})

-- | Token used to access next page of this result.
cosdNextPageToken :: Lens' ChromeOSDevices (Maybe Text)
cosdNextPageToken
  = lens _cosdNextPageToken
      (\ s a -> s{_cosdNextPageToken = a})

-- | Kind of resource this is.
cosdKind :: Lens' ChromeOSDevices Text
cosdKind = lens _cosdKind (\ s a -> s{_cosdKind = a})

-- | List of Chrome OS Device objects.
cosdChromeosDevices :: Lens' ChromeOSDevices [ChromeOSDevice]
cosdChromeosDevices
  = lens _cosdChromeosDevices
      (\ s a -> s{_cosdChromeosDevices = a})
      . _Default
      . _Coerce

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

instance ToJSON ChromeOSDevices where
        toJSON ChromeOSDevices'{..}
          = object
              (catMaybes
                 [("etag" .=) <$> _cosdEtag,
                  ("nextPageToken" .=) <$> _cosdNextPageToken,
                  Just ("kind" .= _cosdKind),
                  ("chromeosdevices" .=) <$> _cosdChromeosDevices])

-- | JSON template for Has Member response in Directory API.
--
-- /See:/ 'membersHasMember' smart constructor.
newtype MembersHasMember = MembersHasMember'
    { _mhmIsMember :: Maybe Bool
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'MembersHasMember' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'mhmIsMember'
membersHasMember
    :: MembersHasMember
membersHasMember =
    MembersHasMember'
    { _mhmIsMember = Nothing
    }

-- | Identifies whether the given user is a member of the group. Membership
-- can be direct or nested.
mhmIsMember :: Lens' MembersHasMember (Maybe Bool)
mhmIsMember
  = lens _mhmIsMember (\ s a -> s{_mhmIsMember = a})

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

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

-- | JSON template for Trusted App Ids Resource object in Directory API.
--
-- /See:/ 'trustedAppId' smart constructor.
data TrustedAppId = TrustedAppId'
    { _taiCertificateHashSHA256 :: !(Maybe Text)
    , _taiEtag                  :: !(Maybe Text)
    , _taiKind                  :: !Text
    , _taiCertificateHashSHA1   :: !(Maybe Text)
    , _taiAndroidPackageName    :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'TrustedAppId' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'taiCertificateHashSHA256'
--
-- * 'taiEtag'
--
-- * 'taiKind'
--
-- * 'taiCertificateHashSHA1'
--
-- * 'taiAndroidPackageName'
trustedAppId
    :: TrustedAppId
trustedAppId =
    TrustedAppId'
    { _taiCertificateHashSHA256 = Nothing
    , _taiEtag = Nothing
    , _taiKind = "admin#directory#trustedappid"
    , _taiCertificateHashSHA1 = Nothing
    , _taiAndroidPackageName = Nothing
    }

-- | SHA256 signature of the app certificate.
taiCertificateHashSHA256 :: Lens' TrustedAppId (Maybe Text)
taiCertificateHashSHA256
  = lens _taiCertificateHashSHA256
      (\ s a -> s{_taiCertificateHashSHA256 = a})

taiEtag :: Lens' TrustedAppId (Maybe Text)
taiEtag = lens _taiEtag (\ s a -> s{_taiEtag = a})

-- | Identifies the resource as a trusted AppId.
taiKind :: Lens' TrustedAppId Text
taiKind = lens _taiKind (\ s a -> s{_taiKind = a})

-- | SHA1 signature of the app certificate.
taiCertificateHashSHA1 :: Lens' TrustedAppId (Maybe Text)
taiCertificateHashSHA1
  = lens _taiCertificateHashSHA1
      (\ s a -> s{_taiCertificateHashSHA1 = a})

-- | Android package name.
taiAndroidPackageName :: Lens' TrustedAppId (Maybe Text)
taiAndroidPackageName
  = lens _taiAndroidPackageName
      (\ s a -> s{_taiAndroidPackageName = a})

instance FromJSON TrustedAppId where
        parseJSON
          = withObject "TrustedAppId"
              (\ o ->
                 TrustedAppId' <$>
                   (o .:? "certificateHashSHA256") <*> (o .:? "etag")
                     <*> (o .:? "kind" .!= "admin#directory#trustedappid")
                     <*> (o .:? "certificateHashSHA1")
                     <*> (o .:? "androidPackageName"))

instance ToJSON TrustedAppId where
        toJSON TrustedAppId'{..}
          = object
              (catMaybes
                 [("certificateHashSHA256" .=) <$>
                    _taiCertificateHashSHA256,
                  ("etag" .=) <$> _taiEtag, Just ("kind" .= _taiKind),
                  ("certificateHashSHA1" .=) <$>
                    _taiCertificateHashSHA1,
                  ("androidPackageName" .=) <$>
                    _taiAndroidPackageName])

-- | JSON template for an externalId entry.
--
-- /See:/ 'userExternalId' smart constructor.
data UserExternalId = UserExternalId'
    { _ueiValue      :: !(Maybe Text)
    , _ueiType       :: !(Maybe Text)
    , _ueiCustomType :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'UserExternalId' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ueiValue'
--
-- * 'ueiType'
--
-- * 'ueiCustomType'
userExternalId
    :: UserExternalId
userExternalId =
    UserExternalId'
    { _ueiValue = Nothing
    , _ueiType = Nothing
    , _ueiCustomType = Nothing
    }

-- | The value of the id.
ueiValue :: Lens' UserExternalId (Maybe Text)
ueiValue = lens _ueiValue (\ s a -> s{_ueiValue = a})

-- | The type of the Id.
ueiType :: Lens' UserExternalId (Maybe Text)
ueiType = lens _ueiType (\ s a -> s{_ueiType = a})

-- | Custom type.
ueiCustomType :: Lens' UserExternalId (Maybe Text)
ueiCustomType
  = lens _ueiCustomType
      (\ s a -> s{_ueiCustomType = a})

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

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

--
-- /See:/ 'asps' smart constructor.
data Asps = Asps'
    { _aspEtag  :: !(Maybe Text)
    , _aspKind  :: !Text
    , _aspItems :: !(Maybe [Asp])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Asps' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'aspEtag'
--
-- * 'aspKind'
--
-- * 'aspItems'
asps
    :: Asps
asps =
    Asps'
    { _aspEtag = Nothing
    , _aspKind = "admin#directory#aspList"
    , _aspItems = Nothing
    }

-- | ETag of the resource.
aspEtag :: Lens' Asps (Maybe Text)
aspEtag = lens _aspEtag (\ s a -> s{_aspEtag = a})

-- | The type of the API resource. This is always admin#directory#aspList.
aspKind :: Lens' Asps Text
aspKind = lens _aspKind (\ s a -> s{_aspKind = a})

-- | A list of ASP resources.
aspItems :: Lens' Asps [Asp]
aspItems
  = lens _aspItems (\ s a -> s{_aspItems = a}) .
      _Default
      . _Coerce

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

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

--
-- /See:/ 'chromeOSDeviceCPUStatusReportsItemCPUTemperatureInfoItem' smart constructor.
data ChromeOSDeviceCPUStatusReportsItemCPUTemperatureInfoItem = ChromeOSDeviceCPUStatusReportsItemCPUTemperatureInfoItem'
    { _codcsrictiiTemperature :: !(Maybe (Textual Int32))
    , _codcsrictiiLabel       :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ChromeOSDeviceCPUStatusReportsItemCPUTemperatureInfoItem' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'codcsrictiiTemperature'
--
-- * 'codcsrictiiLabel'
chromeOSDeviceCPUStatusReportsItemCPUTemperatureInfoItem
    :: ChromeOSDeviceCPUStatusReportsItemCPUTemperatureInfoItem
chromeOSDeviceCPUStatusReportsItemCPUTemperatureInfoItem =
    ChromeOSDeviceCPUStatusReportsItemCPUTemperatureInfoItem'
    { _codcsrictiiTemperature = Nothing
    , _codcsrictiiLabel = Nothing
    }

-- | Temperature in Celsius degrees.
codcsrictiiTemperature :: Lens' ChromeOSDeviceCPUStatusReportsItemCPUTemperatureInfoItem (Maybe Int32)
codcsrictiiTemperature
  = lens _codcsrictiiTemperature
      (\ s a -> s{_codcsrictiiTemperature = a})
      . mapping _Coerce

-- | CPU label
codcsrictiiLabel :: Lens' ChromeOSDeviceCPUStatusReportsItemCPUTemperatureInfoItem (Maybe Text)
codcsrictiiLabel
  = lens _codcsrictiiLabel
      (\ s a -> s{_codcsrictiiLabel = a})

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

instance ToJSON
         ChromeOSDeviceCPUStatusReportsItemCPUTemperatureInfoItem
         where
        toJSON
          ChromeOSDeviceCPUStatusReportsItemCPUTemperatureInfoItem'{..}
          = object
              (catMaybes
                 [("temperature" .=) <$> _codcsrictiiTemperature,
                  ("label" .=) <$> _codcsrictiiLabel])

--
-- /See:/ 'roleRolePrivilegesItem' smart constructor.
data RoleRolePrivilegesItem = RoleRolePrivilegesItem'
    { _rrpiServiceId     :: !(Maybe Text)
    , _rrpiPrivilegeName :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'RoleRolePrivilegesItem' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'rrpiServiceId'
--
-- * 'rrpiPrivilegeName'
roleRolePrivilegesItem
    :: RoleRolePrivilegesItem
roleRolePrivilegesItem =
    RoleRolePrivilegesItem'
    { _rrpiServiceId = Nothing
    , _rrpiPrivilegeName = Nothing
    }

-- | The obfuscated ID of the service this privilege is for.
rrpiServiceId :: Lens' RoleRolePrivilegesItem (Maybe Text)
rrpiServiceId
  = lens _rrpiServiceId
      (\ s a -> s{_rrpiServiceId = a})

-- | The name of the privilege.
rrpiPrivilegeName :: Lens' RoleRolePrivilegesItem (Maybe Text)
rrpiPrivilegeName
  = lens _rrpiPrivilegeName
      (\ s a -> s{_rrpiPrivilegeName = a})

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

instance ToJSON RoleRolePrivilegesItem where
        toJSON RoleRolePrivilegesItem'{..}
          = object
              (catMaybes
                 [("serviceId" .=) <$> _rrpiServiceId,
                  ("privilegeName" .=) <$> _rrpiPrivilegeName])

-- | JSON response template to list Domains in Directory API.
--
-- /See:/ 'domains2' smart constructor.
data Domains2 = Domains2'
    { _ddEtag    :: !(Maybe Text)
    , _ddKind    :: !Text
    , _ddDomains :: !(Maybe [Domains])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Domains2' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ddEtag'
--
-- * 'ddKind'
--
-- * 'ddDomains'
domains2
    :: Domains2
domains2 =
    Domains2'
    { _ddEtag = Nothing
    , _ddKind = "admin#directory#domains"
    , _ddDomains = Nothing
    }

-- | ETag of the resource.
ddEtag :: Lens' Domains2 (Maybe Text)
ddEtag = lens _ddEtag (\ s a -> s{_ddEtag = a})

-- | Kind of resource this is.
ddKind :: Lens' Domains2 Text
ddKind = lens _ddKind (\ s a -> s{_ddKind = a})

-- | List of domain objects.
ddDomains :: Lens' Domains2 [Domains]
ddDomains
  = lens _ddDomains (\ s a -> s{_ddDomains = a}) .
      _Default
      . _Coerce

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

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