content: {-# LANGUAGE DataKinds #-}
  {-# LANGUAGE DerivingStrategies #-}
  {-# LANGUAGE DuplicateRecordFields #-}
  {-# LANGUAGE ImportQualifiedPost #-}
  {-# LANGUAGE LambdaCase #-}
  {-# LANGUAGE OverloadedStrings #-}
  {-# LANGUAGE PatternSynonyms #-}
  {-# LANGUAGE RecordWildCards #-}
  {-# LANGUAGE StrictData #-}
  {-# LANGUAGE TypeFamilies #-}
  {-# LANGUAGE NoImplicitPrelude #-}
  {-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
  {-# OPTIONS_GHC -fno-warn-name-shadowing #-}
  {-# OPTIONS_GHC -fno-warn-unused-binds #-}
  {-# OPTIONS_GHC -fno-warn-unused-imports #-}
  {-# OPTIONS_GHC -fno-warn-unused-matches #-}
  
  -- |
  -- Module      : Gogol.Analytics.Internal.Product
  -- Copyright   : (c) 2015-2025 Brendan Hay
  -- License     : Mozilla Public License, v. 2.0.
  -- Maintainer  : Brendan Hay <brendan.g.hay+gogol@gmail.com>
  --               Toni Cebrián <toni@tonicebrian.com>
  -- Stability   : auto-generated
  -- Portability : non-portable (GHC extensions)
  module Gogol.Analytics.Internal.Product
    ( -- * Account
      Account (..),
      newAccount,
  
      -- * Account_ChildLink
      Account_ChildLink (..),
      newAccount_ChildLink,
  
      -- * Account_Permissions
      Account_Permissions (..),
      newAccount_Permissions,
  
      -- * AccountRef
      AccountRef (..),
      newAccountRef,
  
      -- * AccountSummaries
      AccountSummaries (..),
      newAccountSummaries,
  
      -- * AccountSummary
      AccountSummary (..),
      newAccountSummary,
  
      -- * AccountTicket
      AccountTicket (..),
      newAccountTicket,
  
      -- * AccountTreeRequest
      AccountTreeRequest (..),
      newAccountTreeRequest,
  
      -- * AccountTreeResponse
      AccountTreeResponse (..),
      newAccountTreeResponse,
  
      -- * Accounts
      Accounts (..),
      newAccounts,
  
      -- * AdWordsAccount
      AdWordsAccount (..),
      newAdWordsAccount,
  
      -- * AnalyticsDataimportDeleteUploadDataRequest
      AnalyticsDataimportDeleteUploadDataRequest (..),
      newAnalyticsDataimportDeleteUploadDataRequest,
  
      -- * Column
      Column (..),
      newColumn,
  
      -- * Column_Attributes
      Column_Attributes (..),
      newColumn_Attributes,
  
      -- * Columns
      Columns (..),
      newColumns,
  
      -- * CustomDataSource
      CustomDataSource (..),
      newCustomDataSource,
  
      -- * CustomDataSource_ChildLink
      CustomDataSource_ChildLink (..),
      newCustomDataSource_ChildLink,
  
      -- * CustomDataSource_ParentLink
      CustomDataSource_ParentLink (..),
      newCustomDataSource_ParentLink,
  
      -- * CustomDataSources
      CustomDataSources (..),
      newCustomDataSources,
  
      -- * CustomDimension
      CustomDimension (..),
      newCustomDimension,
  
      -- * CustomDimension_ParentLink
      CustomDimension_ParentLink (..),
      newCustomDimension_ParentLink,
  
      -- * CustomDimensions
      CustomDimensions (..),
      newCustomDimensions,
  
      -- * CustomMetric
      CustomMetric (..),
      newCustomMetric,
  
      -- * CustomMetric_ParentLink
      CustomMetric_ParentLink (..),
      newCustomMetric_ParentLink,
  
      -- * CustomMetrics
      CustomMetrics (..),
      newCustomMetrics,
  
      -- * EntityAdWordsLink
      EntityAdWordsLink (..),
      newEntityAdWordsLink,
  
      -- * EntityAdWordsLink_Entity
      EntityAdWordsLink_Entity (..),
      newEntityAdWordsLink_Entity,
  
      -- * EntityAdWordsLinks
      EntityAdWordsLinks (..),
      newEntityAdWordsLinks,
  
      -- * EntityUserLink
      EntityUserLink (..),
      newEntityUserLink,
  
      -- * EntityUserLink_Entity
      EntityUserLink_Entity (..),
      newEntityUserLink_Entity,
  
      -- * EntityUserLink_Permissions
      EntityUserLink_Permissions (..),
      newEntityUserLink_Permissions,
  
      -- * EntityUserLinks
      EntityUserLinks (..),
      newEntityUserLinks,
  
      -- * Experiment
      Experiment (..),
      newExperiment,
  
      -- * Experiment_ParentLink
      Experiment_ParentLink (..),
      newExperiment_ParentLink,
  
      -- * Experiment_VariationsItem
      Experiment_VariationsItem (..),
      newExperiment_VariationsItem,
  
      -- * Experiments
      Experiments (..),
      newExperiments,
  
      -- * Filter
      Filter (..),
      newFilter,
  
      -- * Filter_AdvancedDetails
      Filter_AdvancedDetails (..),
      newFilter_AdvancedDetails,
  
      -- * Filter_LowercaseDetails
      Filter_LowercaseDetails (..),
      newFilter_LowercaseDetails,
  
      -- * Filter_ParentLink
      Filter_ParentLink (..),
      newFilter_ParentLink,
  
      -- * Filter_SearchAndReplaceDetails
      Filter_SearchAndReplaceDetails (..),
      newFilter_SearchAndReplaceDetails,
  
      -- * Filter_UppercaseDetails
      Filter_UppercaseDetails (..),
      newFilter_UppercaseDetails,
  
      -- * FilterExpression
      FilterExpression (..),
      newFilterExpression,
  
      -- * FilterRef
      FilterRef (..),
      newFilterRef,
  
      -- * Filters
      Filters (..),
      newFilters,
  
      -- * GaData
      GaData (..),
      newGaData,
  
      -- * GaData_ColumnHeadersItem
      GaData_ColumnHeadersItem (..),
      newGaData_ColumnHeadersItem,
  
      -- * GaData_DataTable
      GaData_DataTable (..),
      newGaData_DataTable,
  
      -- * GaData_DataTable_ColsItem
      GaData_DataTable_ColsItem (..),
      newGaData_DataTable_ColsItem,
  
      -- * GaData_DataTable_RowsItem
      GaData_DataTable_RowsItem (..),
      newGaData_DataTable_RowsItem,
  
      -- * GaData_DataTable_RowsItem_CItem
      GaData_DataTable_RowsItem_CItem (..),
      newGaData_DataTable_RowsItem_CItem,
  
      -- * GaData_ProfileInfo
      GaData_ProfileInfo (..),
      newGaData_ProfileInfo,
  
      -- * GaData_Query
      GaData_Query (..),
      newGaData_Query,
  
      -- * GaData_TotalsForAllResults
      GaData_TotalsForAllResults (..),
      newGaData_TotalsForAllResults,
  
      -- * Goal
      Goal (..),
      newGoal,
  
      -- * Goal_EventDetails
      Goal_EventDetails (..),
      newGoal_EventDetails,
  
      -- * Goal_EventDetails_EventConditionsItem
      Goal_EventDetails_EventConditionsItem (..),
      newGoal_EventDetails_EventConditionsItem,
  
      -- * Goal_ParentLink
      Goal_ParentLink (..),
      newGoal_ParentLink,
  
      -- * Goal_UrlDestinationDetails
      Goal_UrlDestinationDetails (..),
      newGoal_UrlDestinationDetails,
  
      -- * Goal_UrlDestinationDetails_StepsItem
      Goal_UrlDestinationDetails_StepsItem (..),
      newGoal_UrlDestinationDetails_StepsItem,
  
      -- * Goal_VisitNumPagesDetails
      Goal_VisitNumPagesDetails (..),
      newGoal_VisitNumPagesDetails,
  
      -- * Goal_VisitTimeOnSiteDetails
      Goal_VisitTimeOnSiteDetails (..),
      newGoal_VisitTimeOnSiteDetails,
  
      -- * Goals
      Goals (..),
      newGoals,
  
      -- * HashClientIdRequest
      HashClientIdRequest (..),
      newHashClientIdRequest,
  
      -- * HashClientIdResponse
      HashClientIdResponse (..),
      newHashClientIdResponse,
  
      -- * IncludeConditions
      IncludeConditions (..),
      newIncludeConditions,
  
      -- * LinkedForeignAccount
      LinkedForeignAccount (..),
      newLinkedForeignAccount,
  
      -- * McfData
      McfData (..),
      newMcfData,
  
      -- * McfData_ColumnHeadersItem
      McfData_ColumnHeadersItem (..),
      newMcfData_ColumnHeadersItem,
  
      -- * McfData_ProfileInfo
      McfData_ProfileInfo (..),
      newMcfData_ProfileInfo,
  
      -- * McfData_Query
      McfData_Query (..),
      newMcfData_Query,
  
      -- * McfData_RowsItemItem
      McfData_RowsItemItem (..),
      newMcfData_RowsItemItem,
  
      -- * McfData_RowsItemItem_ConversionPathValueItem
      McfData_RowsItemItem_ConversionPathValueItem (..),
      newMcfData_RowsItemItem_ConversionPathValueItem,
  
      -- * McfData_TotalsForAllResults
      McfData_TotalsForAllResults (..),
      newMcfData_TotalsForAllResults,
  
      -- * Profile
      Profile (..),
      newProfile,
  
      -- * Profile_ChildLink
      Profile_ChildLink (..),
      newProfile_ChildLink,
  
      -- * Profile_ParentLink
      Profile_ParentLink (..),
      newProfile_ParentLink,
  
      -- * Profile_Permissions
      Profile_Permissions (..),
      newProfile_Permissions,
  
      -- * ProfileFilterLink
      ProfileFilterLink (..),
      newProfileFilterLink,
  
      -- * ProfileFilterLinks
      ProfileFilterLinks (..),
      newProfileFilterLinks,
  
      -- * ProfileRef
      ProfileRef (..),
      newProfileRef,
  
      -- * ProfileSummary
      ProfileSummary (..),
      newProfileSummary,
  
      -- * Profiles
      Profiles (..),
      newProfiles,
  
      -- * RealtimeData
      RealtimeData (..),
      newRealtimeData,
  
      -- * RealtimeData_ColumnHeadersItem
      RealtimeData_ColumnHeadersItem (..),
      newRealtimeData_ColumnHeadersItem,
  
      -- * RealtimeData_ProfileInfo
      RealtimeData_ProfileInfo (..),
      newRealtimeData_ProfileInfo,
  
      -- * RealtimeData_Query
      RealtimeData_Query (..),
      newRealtimeData_Query,
  
      -- * RealtimeData_TotalsForAllResults
      RealtimeData_TotalsForAllResults (..),
      newRealtimeData_TotalsForAllResults,
  
      -- * RemarketingAudience
      RemarketingAudience (..),
      newRemarketingAudience,
  
      -- * RemarketingAudience_AudienceDefinition
      RemarketingAudience_AudienceDefinition (..),
      newRemarketingAudience_AudienceDefinition,
  
      -- * RemarketingAudience_StateBasedAudienceDefinition
      RemarketingAudience_StateBasedAudienceDefinition (..),
      newRemarketingAudience_StateBasedAudienceDefinition,
  
      -- * RemarketingAudience_StateBasedAudienceDefinition_ExcludeConditions
      RemarketingAudience_StateBasedAudienceDefinition_ExcludeConditions (..),
      newRemarketingAudience_StateBasedAudienceDefinition_ExcludeConditions,
  
      -- * RemarketingAudiences
      RemarketingAudiences (..),
      newRemarketingAudiences,
  
      -- * Segment
      Segment (..),
      newSegment,
  
      -- * Segments
      Segments (..),
      newSegments,
  
      -- * UnsampledReport
      UnsampledReport (..),
      newUnsampledReport,
  
      -- * UnsampledReport_CloudStorageDownloadDetails
      UnsampledReport_CloudStorageDownloadDetails (..),
      newUnsampledReport_CloudStorageDownloadDetails,
  
      -- * UnsampledReport_DriveDownloadDetails
      UnsampledReport_DriveDownloadDetails (..),
      newUnsampledReport_DriveDownloadDetails,
  
      -- * UnsampledReports
      UnsampledReports (..),
      newUnsampledReports,
  
      -- * Upload
      Upload (..),
      newUpload,
  
      -- * Uploads
      Uploads (..),
      newUploads,
  
      -- * UserDeletionRequest
      UserDeletionRequest (..),
      newUserDeletionRequest,
  
      -- * UserDeletionRequest_Id
      UserDeletionRequest_Id (..),
      newUserDeletionRequest_Id,
  
      -- * UserRef
      UserRef (..),
      newUserRef,
  
      -- * WebPropertyRef
      WebPropertyRef (..),
      newWebPropertyRef,
  
      -- * WebPropertySummary
      WebPropertySummary (..),
      newWebPropertySummary,
  
      -- * Webproperties
      Webproperties (..),
      newWebproperties,
  
      -- * Webproperty
      Webproperty (..),
      newWebproperty,
  
      -- * Webproperty_ChildLink
      Webproperty_ChildLink (..),
      newWebproperty_ChildLink,
  
      -- * Webproperty_ParentLink
      Webproperty_ParentLink (..),
      newWebproperty_ParentLink,
  
      -- * Webproperty_Permissions
      Webproperty_Permissions (..),
      newWebproperty_Permissions,
    )
  where
  
  import Gogol.Analytics.Internal.Sum
  import Gogol.Prelude qualified as Core
  
  -- | JSON template for Analytics account entry.
  --
  -- /See:/ 'newAccount' smart constructor.
  data Account = Account
    { -- | Child link for an account entry. Points to the list of web properties for this account.
      childLink :: (Core.Maybe Account_ChildLink),
      -- | Time the account was created.
      created :: (Core.Maybe Core.DateTime),
      -- | Account ID.
      id :: (Core.Maybe Core.Text),
      -- | Resource type for Analytics account.
      kind :: Core.Text,
      -- | Account name.
      name :: (Core.Maybe Core.Text),
      -- | Permissions the user has for this account.
      permissions :: (Core.Maybe Account_Permissions),
      -- | Link for this account.
      selfLink :: (Core.Maybe Core.Text),
      -- | Indicates whether this account is starred or not.
      starred :: (Core.Maybe Core.Bool),
      -- | Time the account was last modified.
      updated :: (Core.Maybe Core.DateTime)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Account' with the minimum fields required to make a request.
  newAccount ::
    Account
  newAccount =
    Account
      { childLink = Core.Nothing,
        created = Core.Nothing,
        id = Core.Nothing,
        kind = "analytics#account",
        name = Core.Nothing,
        permissions = Core.Nothing,
        selfLink = Core.Nothing,
        starred = Core.Nothing,
        updated = Core.Nothing
      }
  
  instance Core.FromJSON Account where
    parseJSON =
      Core.withObject
        "Account"
        ( \o ->
            Account
              Core.<$> (o Core..:? "childLink")
              Core.<*> (o Core..:? "created")
              Core.<*> (o Core..:? "id")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#account")
              Core.<*> (o Core..:? "name")
              Core.<*> (o Core..:? "permissions")
              Core.<*> (o Core..:? "selfLink")
              Core.<*> (o Core..:? "starred")
              Core.<*> (o Core..:? "updated")
        )
  
  instance Core.ToJSON Account where
    toJSON Account {..} =
      Core.object
        ( Core.catMaybes
            [ ("childLink" Core..=) Core.<$> childLink,
              ("created" Core..=) Core.<$> created,
              ("id" Core..=) Core.<$> id,
              Core.Just ("kind" Core..= kind),
              ("name" Core..=) Core.<$> name,
              ("permissions" Core..=) Core.<$> permissions,
              ("selfLink" Core..=) Core.<$> selfLink,
              ("starred" Core..=) Core.<$> starred,
              ("updated" Core..=) Core.<$> updated
            ]
        )
  
  -- | Child link for an account entry. Points to the list of web properties for this account.
  --
  -- /See:/ 'newAccount_ChildLink' smart constructor.
  data Account_ChildLink = Account_ChildLink
    { -- | Link to the list of web properties for this account.
      href :: (Core.Maybe Core.Text),
      -- | Type of the child link. Its value is \"analytics#webproperties\".
      type' :: Core.Text
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Account_ChildLink' with the minimum fields required to make a request.
  newAccount_ChildLink ::
    Account_ChildLink
  newAccount_ChildLink =
    Account_ChildLink
      { href = Core.Nothing,
        type' = "analytics#webproperties"
      }
  
  instance Core.FromJSON Account_ChildLink where
    parseJSON =
      Core.withObject
        "Account_ChildLink"
        ( \o ->
            Account_ChildLink
              Core.<$> (o Core..:? "href")
              Core.<*> (o Core..:? "type" Core..!= "analytics#webproperties")
        )
  
  instance Core.ToJSON Account_ChildLink where
    toJSON Account_ChildLink {..} =
      Core.object
        ( Core.catMaybes
            [("href" Core..=) Core.<$> href, Core.Just ("type" Core..= type')]
        )
  
  -- | Permissions the user has for this account.
  --
  -- /See:/ 'newAccount_Permissions' smart constructor.
  newtype Account_Permissions = Account_Permissions
    { -- | All the permissions that the user has for this account. These include any implied permissions (e.g., EDIT implies VIEW).
      effective :: (Core.Maybe [Core.Text])
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Account_Permissions' with the minimum fields required to make a request.
  newAccount_Permissions ::
    Account_Permissions
  newAccount_Permissions =
    Account_Permissions {effective = Core.Nothing}
  
  instance Core.FromJSON Account_Permissions where
    parseJSON =
      Core.withObject
        "Account_Permissions"
        (\o -> Account_Permissions Core.<$> (o Core..:? "effective"))
  
  instance Core.ToJSON Account_Permissions where
    toJSON Account_Permissions {..} =
      Core.object
        (Core.catMaybes [("effective" Core..=) Core.<$> effective])
  
  -- | JSON template for a linked account.
  --
  -- /See:/ 'newAccountRef' smart constructor.
  data AccountRef = AccountRef
    { -- | Link for this account.
      href :: (Core.Maybe Core.Text),
      -- | Account ID.
      id :: (Core.Maybe Core.Text),
      -- | Analytics account reference.
      kind :: Core.Text,
      -- | Account name.
      name :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'AccountRef' with the minimum fields required to make a request.
  newAccountRef ::
    AccountRef
  newAccountRef =
    AccountRef
      { href = Core.Nothing,
        id = Core.Nothing,
        kind = "analytics#accountRef",
        name = Core.Nothing
      }
  
  instance Core.FromJSON AccountRef where
    parseJSON =
      Core.withObject
        "AccountRef"
        ( \o ->
            AccountRef
              Core.<$> (o Core..:? "href")
              Core.<*> (o Core..:? "id")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#accountRef")
              Core.<*> (o Core..:? "name")
        )
  
  instance Core.ToJSON AccountRef where
    toJSON AccountRef {..} =
      Core.object
        ( Core.catMaybes
            [ ("href" Core..=) Core.<$> href,
              ("id" Core..=) Core.<$> id,
              Core.Just ("kind" Core..= kind),
              ("name" Core..=) Core.<$> name
            ]
        )
  
  -- | An AccountSummary collection lists a summary of accounts, properties and views (profiles) to which the user has access. Each resource in the collection corresponds to a single AccountSummary.
  --
  -- /See:/ 'newAccountSummaries' smart constructor.
  data AccountSummaries = AccountSummaries
    { -- | A list of AccountSummaries.
      items :: (Core.Maybe [AccountSummary]),
      -- | The maximum number of resources the response can contain, regardless of the actual number of resources returned. Its value ranges from 1 to 1000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.
      itemsPerPage :: (Core.Maybe Core.Int32),
      -- | Collection type.
      kind :: Core.Text,
      -- | Link to next page for this AccountSummary collection.
      nextLink :: (Core.Maybe Core.Text),
      -- | Link to previous page for this AccountSummary collection.
      previousLink :: (Core.Maybe Core.Text),
      -- | The starting index of the resources, which is 1 by default or otherwise specified by the start-index query parameter.
      startIndex :: (Core.Maybe Core.Int32),
      -- | The total number of results for the query, regardless of the number of results in the response.
      totalResults :: (Core.Maybe Core.Int32),
      -- | Email ID of the authenticated user
      username :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'AccountSummaries' with the minimum fields required to make a request.
  newAccountSummaries ::
    AccountSummaries
  newAccountSummaries =
    AccountSummaries
      { items = Core.Nothing,
        itemsPerPage = Core.Nothing,
        kind = "analytics#accountSummaries",
        nextLink = Core.Nothing,
        previousLink = Core.Nothing,
        startIndex = Core.Nothing,
        totalResults = Core.Nothing,
        username = Core.Nothing
      }
  
  instance Core.FromJSON AccountSummaries where
    parseJSON =
      Core.withObject
        "AccountSummaries"
        ( \o ->
            AccountSummaries
              Core.<$> (o Core..:? "items")
              Core.<*> (o Core..:? "itemsPerPage")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#accountSummaries")
              Core.<*> (o Core..:? "nextLink")
              Core.<*> (o Core..:? "previousLink")
              Core.<*> (o Core..:? "startIndex")
              Core.<*> (o Core..:? "totalResults")
              Core.<*> (o Core..:? "username")
        )
  
  instance Core.ToJSON AccountSummaries where
    toJSON AccountSummaries {..} =
      Core.object
        ( Core.catMaybes
            [ ("items" Core..=) Core.<$> items,
              ("itemsPerPage" Core..=) Core.<$> itemsPerPage,
              Core.Just ("kind" Core..= kind),
              ("nextLink" Core..=) Core.<$> nextLink,
              ("previousLink" Core..=) Core.<$> previousLink,
              ("startIndex" Core..=) Core.<$> startIndex,
              ("totalResults" Core..=) Core.<$> totalResults,
              ("username" Core..=) Core.<$> username
            ]
        )
  
  -- | JSON template for an Analytics AccountSummary. An AccountSummary is a lightweight tree comprised of properties\/profiles.
  --
  -- /See:/ 'newAccountSummary' smart constructor.
  data AccountSummary = AccountSummary
    { -- | Account ID.
      id :: (Core.Maybe Core.Text),
      -- | Resource type for Analytics AccountSummary.
      kind :: Core.Text,
      -- | Account name.
      name :: (Core.Maybe Core.Text),
      -- | Indicates whether this account is starred or not.
      starred :: (Core.Maybe Core.Bool),
      -- | List of web properties under this account.
      webProperties :: (Core.Maybe [WebPropertySummary])
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'AccountSummary' with the minimum fields required to make a request.
  newAccountSummary ::
    AccountSummary
  newAccountSummary =
    AccountSummary
      { id = Core.Nothing,
        kind = "analytics#accountSummary",
        name = Core.Nothing,
        starred = Core.Nothing,
        webProperties = Core.Nothing
      }
  
  instance Core.FromJSON AccountSummary where
    parseJSON =
      Core.withObject
        "AccountSummary"
        ( \o ->
            AccountSummary
              Core.<$> (o Core..:? "id")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#accountSummary")
              Core.<*> (o Core..:? "name")
              Core.<*> (o Core..:? "starred")
              Core.<*> (o Core..:? "webProperties")
        )
  
  instance Core.ToJSON AccountSummary where
    toJSON AccountSummary {..} =
      Core.object
        ( Core.catMaybes
            [ ("id" Core..=) Core.<$> id,
              Core.Just ("kind" Core..= kind),
              ("name" Core..=) Core.<$> name,
              ("starred" Core..=) Core.<$> starred,
              ("webProperties" Core..=) Core.<$> webProperties
            ]
        )
  
  -- | JSON template for an Analytics account ticket. The account ticket consists of the ticket ID and the basic information for the account, property and profile.
  --
  -- /See:/ 'newAccountTicket' smart constructor.
  data AccountTicket = AccountTicket
    { -- | Account for this ticket.
      account :: (Core.Maybe Account),
      -- | Account ticket ID used to access the account ticket.
      id :: (Core.Maybe Core.Text),
      -- | Resource type for account ticket.
      kind :: Core.Text,
      -- | View (Profile) for the account.
      profile :: (Core.Maybe Profile),
      -- | Redirect URI where the user will be sent after accepting Terms of Service. Must be configured in APIs console as a callback URL.
      redirectUri :: (Core.Maybe Core.Text),
      -- | Web property for the account.
      webproperty :: (Core.Maybe Webproperty)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'AccountTicket' with the minimum fields required to make a request.
  newAccountTicket ::
    AccountTicket
  newAccountTicket =
    AccountTicket
      { account = Core.Nothing,
        id = Core.Nothing,
        kind = "analytics#accountTicket",
        profile = Core.Nothing,
        redirectUri = Core.Nothing,
        webproperty = Core.Nothing
      }
  
  instance Core.FromJSON AccountTicket where
    parseJSON =
      Core.withObject
        "AccountTicket"
        ( \o ->
            AccountTicket
              Core.<$> (o Core..:? "account")
              Core.<*> (o Core..:? "id")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#accountTicket")
              Core.<*> (o Core..:? "profile")
              Core.<*> (o Core..:? "redirectUri")
              Core.<*> (o Core..:? "webproperty")
        )
  
  instance Core.ToJSON AccountTicket where
    toJSON AccountTicket {..} =
      Core.object
        ( Core.catMaybes
            [ ("account" Core..=) Core.<$> account,
              ("id" Core..=) Core.<$> id,
              Core.Just ("kind" Core..= kind),
              ("profile" Core..=) Core.<$> profile,
              ("redirectUri" Core..=) Core.<$> redirectUri,
              ("webproperty" Core..=) Core.<$> webproperty
            ]
        )
  
  -- | JSON template for an Analytics account tree requests. The account tree request is used in the provisioning api to create an account, property, and view (profile). It contains the basic information required to make these fields.
  --
  -- /See:/ 'newAccountTreeRequest' smart constructor.
  data AccountTreeRequest = AccountTreeRequest
    { accountName :: (Core.Maybe Core.Text),
      -- | Resource type for account ticket.
      kind :: Core.Text,
      profileName :: (Core.Maybe Core.Text),
      timezone :: (Core.Maybe Core.Text),
      webpropertyName :: (Core.Maybe Core.Text),
      websiteUrl :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'AccountTreeRequest' with the minimum fields required to make a request.
  newAccountTreeRequest ::
    AccountTreeRequest
  newAccountTreeRequest =
    AccountTreeRequest
      { accountName = Core.Nothing,
        kind = "analytics#accountTreeRequest",
        profileName = Core.Nothing,
        timezone = Core.Nothing,
        webpropertyName = Core.Nothing,
        websiteUrl = Core.Nothing
      }
  
  instance Core.FromJSON AccountTreeRequest where
    parseJSON =
      Core.withObject
        "AccountTreeRequest"
        ( \o ->
            AccountTreeRequest
              Core.<$> (o Core..:? "accountName")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#accountTreeRequest")
              Core.<*> (o Core..:? "profileName")
              Core.<*> (o Core..:? "timezone")
              Core.<*> (o Core..:? "webpropertyName")
              Core.<*> (o Core..:? "websiteUrl")
        )
  
  instance Core.ToJSON AccountTreeRequest where
    toJSON AccountTreeRequest {..} =
      Core.object
        ( Core.catMaybes
            [ ("accountName" Core..=) Core.<$> accountName,
              Core.Just ("kind" Core..= kind),
              ("profileName" Core..=) Core.<$> profileName,
              ("timezone" Core..=) Core.<$> timezone,
              ("webpropertyName" Core..=) Core.<$> webpropertyName,
              ("websiteUrl" Core..=) Core.<$> websiteUrl
            ]
        )
  
  -- | JSON template for an Analytics account tree response. The account tree response is used in the provisioning api to return the result of creating an account, property, and view (profile).
  --
  -- /See:/ 'newAccountTreeResponse' smart constructor.
  data AccountTreeResponse = AccountTreeResponse
    { -- | The account created.
      account :: (Core.Maybe Account),
      -- | Resource type for account ticket.
      kind :: Core.Text,
      -- | View (Profile) for the account.
      profile :: (Core.Maybe Profile),
      -- | Web property for the account.
      webproperty :: (Core.Maybe Webproperty)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'AccountTreeResponse' with the minimum fields required to make a request.
  newAccountTreeResponse ::
    AccountTreeResponse
  newAccountTreeResponse =
    AccountTreeResponse
      { account = Core.Nothing,
        kind = "analytics#accountTreeResponse",
        profile = Core.Nothing,
        webproperty = Core.Nothing
      }
  
  instance Core.FromJSON AccountTreeResponse where
    parseJSON =
      Core.withObject
        "AccountTreeResponse"
        ( \o ->
            AccountTreeResponse
              Core.<$> (o Core..:? "account")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#accountTreeResponse")
              Core.<*> (o Core..:? "profile")
              Core.<*> (o Core..:? "webproperty")
        )
  
  instance Core.ToJSON AccountTreeResponse where
    toJSON AccountTreeResponse {..} =
      Core.object
        ( Core.catMaybes
            [ ("account" Core..=) Core.<$> account,
              Core.Just ("kind" Core..= kind),
              ("profile" Core..=) Core.<$> profile,
              ("webproperty" Core..=) Core.<$> webproperty
            ]
        )
  
  -- | An account collection provides a list of Analytics accounts to which a user has access. The account collection is the entry point to all management information. Each resource in the collection corresponds to a single Analytics account.
  --
  -- /See:/ 'newAccounts' smart constructor.
  data Accounts = Accounts
    { -- | A list of accounts.
      items :: (Core.Maybe [Account]),
      -- | The maximum number of entries the response can contain, regardless of the actual number of entries returned. Its value ranges from 1 to 1000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.
      itemsPerPage :: (Core.Maybe Core.Int32),
      -- | Collection type.
      kind :: Core.Text,
      -- | Next link for this account collection.
      nextLink :: (Core.Maybe Core.Text),
      -- | Previous link for this account collection.
      previousLink :: (Core.Maybe Core.Text),
      -- | The starting index of the entries, which is 1 by default or otherwise specified by the start-index query parameter.
      startIndex :: (Core.Maybe Core.Int32),
      -- | The total number of results for the query, regardless of the number of results in the response.
      totalResults :: (Core.Maybe Core.Int32),
      -- | Email ID of the authenticated user
      username :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Accounts' with the minimum fields required to make a request.
  newAccounts ::
    Accounts
  newAccounts =
    Accounts
      { items = Core.Nothing,
        itemsPerPage = Core.Nothing,
        kind = "analytics#accounts",
        nextLink = Core.Nothing,
        previousLink = Core.Nothing,
        startIndex = Core.Nothing,
        totalResults = Core.Nothing,
        username = Core.Nothing
      }
  
  instance Core.FromJSON Accounts where
    parseJSON =
      Core.withObject
        "Accounts"
        ( \o ->
            Accounts
              Core.<$> (o Core..:? "items")
              Core.<*> (o Core..:? "itemsPerPage")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#accounts")
              Core.<*> (o Core..:? "nextLink")
              Core.<*> (o Core..:? "previousLink")
              Core.<*> (o Core..:? "startIndex")
              Core.<*> (o Core..:? "totalResults")
              Core.<*> (o Core..:? "username")
        )
  
  instance Core.ToJSON Accounts where
    toJSON Accounts {..} =
      Core.object
        ( Core.catMaybes
            [ ("items" Core..=) Core.<$> items,
              ("itemsPerPage" Core..=) Core.<$> itemsPerPage,
              Core.Just ("kind" Core..= kind),
              ("nextLink" Core..=) Core.<$> nextLink,
              ("previousLink" Core..=) Core.<$> previousLink,
              ("startIndex" Core..=) Core.<$> startIndex,
              ("totalResults" Core..=) Core.<$> totalResults,
              ("username" Core..=) Core.<$> username
            ]
        )
  
  -- | JSON template for an Google Ads account.
  --
  -- /See:/ 'newAdWordsAccount' smart constructor.
  data AdWordsAccount = AdWordsAccount
    { -- | True if auto-tagging is enabled on the Google Ads account. Read-only after the insert operation.
      autoTaggingEnabled :: (Core.Maybe Core.Bool),
      -- | Customer ID. This field is required when creating a Google Ads link.
      customerId :: (Core.Maybe Core.Text),
      -- | Resource type for Google Ads account.
      kind :: Core.Text
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'AdWordsAccount' with the minimum fields required to make a request.
  newAdWordsAccount ::
    AdWordsAccount
  newAdWordsAccount =
    AdWordsAccount
      { autoTaggingEnabled = Core.Nothing,
        customerId = Core.Nothing,
        kind = "analytics#adWordsAccount"
      }
  
  instance Core.FromJSON AdWordsAccount where
    parseJSON =
      Core.withObject
        "AdWordsAccount"
        ( \o ->
            AdWordsAccount
              Core.<$> (o Core..:? "autoTaggingEnabled")
              Core.<*> (o Core..:? "customerId")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#adWordsAccount")
        )
  
  instance Core.ToJSON AdWordsAccount where
    toJSON AdWordsAccount {..} =
      Core.object
        ( Core.catMaybes
            [ ("autoTaggingEnabled" Core..=) Core.<$> autoTaggingEnabled,
              ("customerId" Core..=) Core.<$> customerId,
              Core.Just ("kind" Core..= kind)
            ]
        )
  
  -- | Request template for the delete upload data request.
  --
  -- /See:/ 'newAnalyticsDataimportDeleteUploadDataRequest' smart constructor.
  newtype AnalyticsDataimportDeleteUploadDataRequest = AnalyticsDataimportDeleteUploadDataRequest
    { -- | A list of upload UIDs.
      customDataImportUids :: (Core.Maybe [Core.Text])
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'AnalyticsDataimportDeleteUploadDataRequest' with the minimum fields required to make a request.
  newAnalyticsDataimportDeleteUploadDataRequest ::
    AnalyticsDataimportDeleteUploadDataRequest
  newAnalyticsDataimportDeleteUploadDataRequest =
    AnalyticsDataimportDeleteUploadDataRequest
      { customDataImportUids =
          Core.Nothing
      }
  
  instance Core.FromJSON AnalyticsDataimportDeleteUploadDataRequest where
    parseJSON =
      Core.withObject
        "AnalyticsDataimportDeleteUploadDataRequest"
        ( \o ->
            AnalyticsDataimportDeleteUploadDataRequest
              Core.<$> (o Core..:? "customDataImportUids")
        )
  
  instance Core.ToJSON AnalyticsDataimportDeleteUploadDataRequest where
    toJSON AnalyticsDataimportDeleteUploadDataRequest {..} =
      Core.object
        ( Core.catMaybes
            [("customDataImportUids" Core..=) Core.<$> customDataImportUids]
        )
  
  -- | JSON template for a metadata column.
  --
  -- /See:/ 'newColumn' smart constructor.
  data Column = Column
    { -- | Map of attribute name and value for this column.
      attributes :: (Core.Maybe Column_Attributes),
      -- | Column id.
      id :: (Core.Maybe Core.Text),
      -- | Resource type for Analytics column.
      kind :: Core.Text
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Column' with the minimum fields required to make a request.
  newColumn ::
    Column
  newColumn =
    Column
      { attributes = Core.Nothing,
        id = Core.Nothing,
        kind = "analytics#column"
      }
  
  instance Core.FromJSON Column where
    parseJSON =
      Core.withObject
        "Column"
        ( \o ->
            Column
              Core.<$> (o Core..:? "attributes")
              Core.<*> (o Core..:? "id")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#column")
        )
  
  instance Core.ToJSON Column where
    toJSON Column {..} =
      Core.object
        ( Core.catMaybes
            [ ("attributes" Core..=) Core.<$> attributes,
              ("id" Core..=) Core.<$> id,
              Core.Just ("kind" Core..= kind)
            ]
        )
  
  -- | Map of attribute name and value for this column.
  --
  -- /See:/ 'newColumn_Attributes' smart constructor.
  newtype Column_Attributes = Column_Attributes
    { -- | The name of the attribute.
      additional :: (Core.HashMap Core.Text Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Column_Attributes' with the minimum fields required to make a request.
  newColumn_Attributes ::
    -- |  The name of the attribute. See 'additional'.
    Core.HashMap Core.Text Core.Text ->
    Column_Attributes
  newColumn_Attributes additional =
    Column_Attributes {additional = additional}
  
  instance Core.FromJSON Column_Attributes where
    parseJSON =
      Core.withObject
        "Column_Attributes"
        (\o -> Column_Attributes Core.<$> (Core.parseJSONObject o))
  
  instance Core.ToJSON Column_Attributes where
    toJSON Column_Attributes {..} = Core.toJSON additional
  
  -- | Lists columns (dimensions and metrics) for a particular report type.
  --
  -- /See:/ 'newColumns' smart constructor.
  data Columns = Columns
    { -- | List of attributes names returned by columns.
      attributeNames :: (Core.Maybe [Core.Text]),
      -- | Etag of collection. This etag can be compared with the last response etag to check if response has changed.
      etag :: (Core.Maybe Core.Text),
      -- | List of columns for a report type.
      items :: (Core.Maybe [Column]),
      -- | Collection type.
      kind :: Core.Text,
      -- | Total number of columns returned in the response.
      totalResults :: (Core.Maybe Core.Int32)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Columns' with the minimum fields required to make a request.
  newColumns ::
    Columns
  newColumns =
    Columns
      { attributeNames = Core.Nothing,
        etag = Core.Nothing,
        items = Core.Nothing,
        kind = "analytics#columns",
        totalResults = Core.Nothing
      }
  
  instance Core.FromJSON Columns where
    parseJSON =
      Core.withObject
        "Columns"
        ( \o ->
            Columns
              Core.<$> (o Core..:? "attributeNames")
              Core.<*> (o Core..:? "etag")
              Core.<*> (o Core..:? "items")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#columns")
              Core.<*> (o Core..:? "totalResults")
        )
  
  instance Core.ToJSON Columns where
    toJSON Columns {..} =
      Core.object
        ( Core.catMaybes
            [ ("attributeNames" Core..=) Core.<$> attributeNames,
              ("etag" Core..=) Core.<$> etag,
              ("items" Core..=) Core.<$> items,
              Core.Just ("kind" Core..= kind),
              ("totalResults" Core..=) Core.<$> totalResults
            ]
        )
  
  -- | JSON template for an Analytics custom data source.
  --
  -- /See:/ 'newCustomDataSource' smart constructor.
  data CustomDataSource = CustomDataSource
    { -- | Account ID to which this custom data source belongs.
      accountId :: (Core.Maybe Core.Text),
      childLink :: (Core.Maybe CustomDataSource_ChildLink),
      -- | Time this custom data source was created.
      created :: (Core.Maybe Core.DateTime),
      -- | Description of custom data source.
      description :: (Core.Maybe Core.Text),
      -- | Custom data source ID.
      id :: (Core.Maybe Core.Text),
      importBehavior :: (Core.Maybe Core.Text),
      -- | Resource type for Analytics custom data source.
      kind :: Core.Text,
      -- | Name of this custom data source.
      name :: (Core.Maybe Core.Text),
      -- | Parent link for this custom data source. Points to the web property to which this custom data source belongs.
      parentLink :: (Core.Maybe CustomDataSource_ParentLink),
      -- | IDs of views (profiles) linked to the custom data source.
      profilesLinked :: (Core.Maybe [Core.Text]),
      -- | Collection of schema headers of the custom data source.
      schema :: (Core.Maybe [Core.Text]),
      -- | Link for this Analytics custom data source.
      selfLink :: (Core.Maybe Core.Text),
      -- | Type of the custom data source.
      type' :: (Core.Maybe Core.Text),
      -- | Time this custom data source was last modified.
      updated :: (Core.Maybe Core.DateTime),
      -- | Upload type of the custom data source.
      uploadType :: (Core.Maybe Core.Text),
      -- | Web property ID of the form UA-XXXXX-YY to which this custom data source belongs.
      webPropertyId :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'CustomDataSource' with the minimum fields required to make a request.
  newCustomDataSource ::
    CustomDataSource
  newCustomDataSource =
    CustomDataSource
      { accountId = Core.Nothing,
        childLink = Core.Nothing,
        created = Core.Nothing,
        description = Core.Nothing,
        id = Core.Nothing,
        importBehavior = Core.Nothing,
        kind = "analytics#customDataSource",
        name = Core.Nothing,
        parentLink = Core.Nothing,
        profilesLinked = Core.Nothing,
        schema = Core.Nothing,
        selfLink = Core.Nothing,
        type' = Core.Nothing,
        updated = Core.Nothing,
        uploadType = Core.Nothing,
        webPropertyId = Core.Nothing
      }
  
  instance Core.FromJSON CustomDataSource where
    parseJSON =
      Core.withObject
        "CustomDataSource"
        ( \o ->
            CustomDataSource
              Core.<$> (o Core..:? "accountId")
              Core.<*> (o Core..:? "childLink")
              Core.<*> (o Core..:? "created")
              Core.<*> (o Core..:? "description")
              Core.<*> (o Core..:? "id")
              Core.<*> (o Core..:? "importBehavior")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#customDataSource")
              Core.<*> (o Core..:? "name")
              Core.<*> (o Core..:? "parentLink")
              Core.<*> (o Core..:? "profilesLinked")
              Core.<*> (o Core..:? "schema")
              Core.<*> (o Core..:? "selfLink")
              Core.<*> (o Core..:? "type")
              Core.<*> (o Core..:? "updated")
              Core.<*> (o Core..:? "uploadType")
              Core.<*> (o Core..:? "webPropertyId")
        )
  
  instance Core.ToJSON CustomDataSource where
    toJSON CustomDataSource {..} =
      Core.object
        ( Core.catMaybes
            [ ("accountId" Core..=) Core.<$> accountId,
              ("childLink" Core..=) Core.<$> childLink,
              ("created" Core..=) Core.<$> created,
              ("description" Core..=) Core.<$> description,
              ("id" Core..=) Core.<$> id,
              ("importBehavior" Core..=) Core.<$> importBehavior,
              Core.Just ("kind" Core..= kind),
              ("name" Core..=) Core.<$> name,
              ("parentLink" Core..=) Core.<$> parentLink,
              ("profilesLinked" Core..=) Core.<$> profilesLinked,
              ("schema" Core..=) Core.<$> schema,
              ("selfLink" Core..=) Core.<$> selfLink,
              ("type" Core..=) Core.<$> type',
              ("updated" Core..=) Core.<$> updated,
              ("uploadType" Core..=) Core.<$> uploadType,
              ("webPropertyId" Core..=) Core.<$> webPropertyId
            ]
        )
  
  --
  -- /See:/ 'newCustomDataSource_ChildLink' smart constructor.
  data CustomDataSource_ChildLink = CustomDataSource_ChildLink
    { -- | Link to the list of daily uploads for this custom data source. Link to the list of uploads for this custom data source.
      href :: (Core.Maybe Core.Text),
      -- | Value is \"analytics#dailyUploads\". Value is \"analytics#uploads\".
      type' :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'CustomDataSource_ChildLink' with the minimum fields required to make a request.
  newCustomDataSource_ChildLink ::
    CustomDataSource_ChildLink
  newCustomDataSource_ChildLink =
    CustomDataSource_ChildLink
      { href = Core.Nothing,
        type' = Core.Nothing
      }
  
  instance Core.FromJSON CustomDataSource_ChildLink where
    parseJSON =
      Core.withObject
        "CustomDataSource_ChildLink"
        ( \o ->
            CustomDataSource_ChildLink
              Core.<$> (o Core..:? "href")
              Core.<*> (o Core..:? "type")
        )
  
  instance Core.ToJSON CustomDataSource_ChildLink where
    toJSON CustomDataSource_ChildLink {..} =
      Core.object
        ( Core.catMaybes
            [("href" Core..=) Core.<$> href, ("type" Core..=) Core.<$> type']
        )
  
  -- | Parent link for this custom data source. Points to the web property to which this custom data source belongs.
  --
  -- /See:/ 'newCustomDataSource_ParentLink' smart constructor.
  data CustomDataSource_ParentLink = CustomDataSource_ParentLink
    { -- | Link to the web property to which this custom data source belongs.
      href :: (Core.Maybe Core.Text),
      -- | Value is \"analytics#webproperty\".
      type' :: Core.Text
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'CustomDataSource_ParentLink' with the minimum fields required to make a request.
  newCustomDataSource_ParentLink ::
    CustomDataSource_ParentLink
  newCustomDataSource_ParentLink =
    CustomDataSource_ParentLink
      { href = Core.Nothing,
        type' = "analytics#webproperty"
      }
  
  instance Core.FromJSON CustomDataSource_ParentLink where
    parseJSON =
      Core.withObject
        "CustomDataSource_ParentLink"
        ( \o ->
            CustomDataSource_ParentLink
              Core.<$> (o Core..:? "href")
              Core.<*> (o Core..:? "type" Core..!= "analytics#webproperty")
        )
  
  instance Core.ToJSON CustomDataSource_ParentLink where
    toJSON CustomDataSource_ParentLink {..} =
      Core.object
        ( Core.catMaybes
            [("href" Core..=) Core.<$> href, Core.Just ("type" Core..= type')]
        )
  
  -- | Lists Analytics custom data sources to which the user has access. Each resource in the collection corresponds to a single Analytics custom data source.
  --
  -- /See:/ 'newCustomDataSources' smart constructor.
  data CustomDataSources = CustomDataSources
    { -- | Collection of custom data sources.
      items :: (Core.Maybe [CustomDataSource]),
      -- | The maximum number of resources the response can contain, regardless of the actual number of resources returned. Its value ranges from 1 to 1000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.
      itemsPerPage :: (Core.Maybe Core.Int32),
      -- | Collection type.
      kind :: Core.Text,
      -- | Link to next page for this custom data source collection.
      nextLink :: (Core.Maybe Core.Text),
      -- | Link to previous page for this custom data source collection.
      previousLink :: (Core.Maybe Core.Text),
      -- | The starting index of the resources, which is 1 by default or otherwise specified by the start-index query parameter.
      startIndex :: (Core.Maybe Core.Int32),
      -- | The total number of results for the query, regardless of the number of results in the response.
      totalResults :: (Core.Maybe Core.Int32),
      -- | Email ID of the authenticated user
      username :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'CustomDataSources' with the minimum fields required to make a request.
  newCustomDataSources ::
    CustomDataSources
  newCustomDataSources =
    CustomDataSources
      { items = Core.Nothing,
        itemsPerPage = Core.Nothing,
        kind = "analytics#customDataSources",
        nextLink = Core.Nothing,
        previousLink = Core.Nothing,
        startIndex = Core.Nothing,
        totalResults = Core.Nothing,
        username = Core.Nothing
      }
  
  instance Core.FromJSON CustomDataSources where
    parseJSON =
      Core.withObject
        "CustomDataSources"
        ( \o ->
            CustomDataSources
              Core.<$> (o Core..:? "items")
              Core.<*> (o Core..:? "itemsPerPage")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#customDataSources")
              Core.<*> (o Core..:? "nextLink")
              Core.<*> (o Core..:? "previousLink")
              Core.<*> (o Core..:? "startIndex")
              Core.<*> (o Core..:? "totalResults")
              Core.<*> (o Core..:? "username")
        )
  
  instance Core.ToJSON CustomDataSources where
    toJSON CustomDataSources {..} =
      Core.object
        ( Core.catMaybes
            [ ("items" Core..=) Core.<$> items,
              ("itemsPerPage" Core..=) Core.<$> itemsPerPage,
              Core.Just ("kind" Core..= kind),
              ("nextLink" Core..=) Core.<$> nextLink,
              ("previousLink" Core..=) Core.<$> previousLink,
              ("startIndex" Core..=) Core.<$> startIndex,
              ("totalResults" Core..=) Core.<$> totalResults,
              ("username" Core..=) Core.<$> username
            ]
        )
  
  -- | JSON template for Analytics Custom Dimension.
  --
  -- /See:/ 'newCustomDimension' smart constructor.
  data CustomDimension = CustomDimension
    { -- | Account ID.
      accountId :: (Core.Maybe Core.Text),
      -- | Boolean indicating whether the custom dimension is active.
      active :: (Core.Maybe Core.Bool),
      -- | Time the custom dimension was created.
      created :: (Core.Maybe Core.DateTime),
      -- | Custom dimension ID.
      id :: (Core.Maybe Core.Text),
      -- | Index of the custom dimension.
      index :: (Core.Maybe Core.Int32),
      -- | Kind value for a custom dimension. Set to \"analytics#customDimension\". It is a read-only field.
      kind :: Core.Text,
      -- | Name of the custom dimension.
      name :: (Core.Maybe Core.Text),
      -- | Parent link for the custom dimension. Points to the property to which the custom dimension belongs.
      parentLink :: (Core.Maybe CustomDimension_ParentLink),
      -- | Scope of the custom dimension: HIT, SESSION, USER or PRODUCT.
      scope :: (Core.Maybe Core.Text),
      -- | Link for the custom dimension
      selfLink :: (Core.Maybe Core.Text),
      -- | Time the custom dimension was last modified.
      updated :: (Core.Maybe Core.DateTime),
      -- | Property ID.
      webPropertyId :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'CustomDimension' with the minimum fields required to make a request.
  newCustomDimension ::
    CustomDimension
  newCustomDimension =
    CustomDimension
      { accountId = Core.Nothing,
        active = Core.Nothing,
        created = Core.Nothing,
        id = Core.Nothing,
        index = Core.Nothing,
        kind = "analytics#customDimension",
        name = Core.Nothing,
        parentLink = Core.Nothing,
        scope = Core.Nothing,
        selfLink = Core.Nothing,
        updated = Core.Nothing,
        webPropertyId = Core.Nothing
      }
  
  instance Core.FromJSON CustomDimension where
    parseJSON =
      Core.withObject
        "CustomDimension"
        ( \o ->
            CustomDimension
              Core.<$> (o Core..:? "accountId")
              Core.<*> (o Core..:? "active")
              Core.<*> (o Core..:? "created")
              Core.<*> (o Core..:? "id")
              Core.<*> (o Core..:? "index")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#customDimension")
              Core.<*> (o Core..:? "name")
              Core.<*> (o Core..:? "parentLink")
              Core.<*> (o Core..:? "scope")
              Core.<*> (o Core..:? "selfLink")
              Core.<*> (o Core..:? "updated")
              Core.<*> (o Core..:? "webPropertyId")
        )
  
  instance Core.ToJSON CustomDimension where
    toJSON CustomDimension {..} =
      Core.object
        ( Core.catMaybes
            [ ("accountId" Core..=) Core.<$> accountId,
              ("active" Core..=) Core.<$> active,
              ("created" Core..=) Core.<$> created,
              ("id" Core..=) Core.<$> id,
              ("index" Core..=) Core.<$> index,
              Core.Just ("kind" Core..= kind),
              ("name" Core..=) Core.<$> name,
              ("parentLink" Core..=) Core.<$> parentLink,
              ("scope" Core..=) Core.<$> scope,
              ("selfLink" Core..=) Core.<$> selfLink,
              ("updated" Core..=) Core.<$> updated,
              ("webPropertyId" Core..=) Core.<$> webPropertyId
            ]
        )
  
  -- | Parent link for the custom dimension. Points to the property to which the custom dimension belongs.
  --
  -- /See:/ 'newCustomDimension_ParentLink' smart constructor.
  data CustomDimension_ParentLink = CustomDimension_ParentLink
    { -- | Link to the property to which the custom dimension belongs.
      href :: (Core.Maybe Core.Text),
      -- | Type of the parent link. Set to \"analytics#webproperty\".
      type' :: Core.Text
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'CustomDimension_ParentLink' with the minimum fields required to make a request.
  newCustomDimension_ParentLink ::
    CustomDimension_ParentLink
  newCustomDimension_ParentLink =
    CustomDimension_ParentLink
      { href = Core.Nothing,
        type' = "analytics#webproperty"
      }
  
  instance Core.FromJSON CustomDimension_ParentLink where
    parseJSON =
      Core.withObject
        "CustomDimension_ParentLink"
        ( \o ->
            CustomDimension_ParentLink
              Core.<$> (o Core..:? "href")
              Core.<*> (o Core..:? "type" Core..!= "analytics#webproperty")
        )
  
  instance Core.ToJSON CustomDimension_ParentLink where
    toJSON CustomDimension_ParentLink {..} =
      Core.object
        ( Core.catMaybes
            [("href" Core..=) Core.<$> href, Core.Just ("type" Core..= type')]
        )
  
  -- | A custom dimension collection lists Analytics custom dimensions to which the user has access. Each resource in the collection corresponds to a single Analytics custom dimension.
  --
  -- /See:/ 'newCustomDimensions' smart constructor.
  data CustomDimensions = CustomDimensions
    { -- | Collection of custom dimensions.
      items :: (Core.Maybe [CustomDimension]),
      -- | The maximum number of resources the response can contain, regardless of the actual number of resources returned. Its value ranges from 1 to 1000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.
      itemsPerPage :: (Core.Maybe Core.Int32),
      -- | Collection type.
      kind :: Core.Text,
      -- | Link to next page for this custom dimension collection.
      nextLink :: (Core.Maybe Core.Text),
      -- | Link to previous page for this custom dimension collection.
      previousLink :: (Core.Maybe Core.Text),
      -- | The starting index of the resources, which is 1 by default or otherwise specified by the start-index query parameter.
      startIndex :: (Core.Maybe Core.Int32),
      -- | The total number of results for the query, regardless of the number of results in the response.
      totalResults :: (Core.Maybe Core.Int32),
      -- | Email ID of the authenticated user
      username :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'CustomDimensions' with the minimum fields required to make a request.
  newCustomDimensions ::
    CustomDimensions
  newCustomDimensions =
    CustomDimensions
      { items = Core.Nothing,
        itemsPerPage = Core.Nothing,
        kind = "analytics#customDimensions",
        nextLink = Core.Nothing,
        previousLink = Core.Nothing,
        startIndex = Core.Nothing,
        totalResults = Core.Nothing,
        username = Core.Nothing
      }
  
  instance Core.FromJSON CustomDimensions where
    parseJSON =
      Core.withObject
        "CustomDimensions"
        ( \o ->
            CustomDimensions
              Core.<$> (o Core..:? "items")
              Core.<*> (o Core..:? "itemsPerPage")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#customDimensions")
              Core.<*> (o Core..:? "nextLink")
              Core.<*> (o Core..:? "previousLink")
              Core.<*> (o Core..:? "startIndex")
              Core.<*> (o Core..:? "totalResults")
              Core.<*> (o Core..:? "username")
        )
  
  instance Core.ToJSON CustomDimensions where
    toJSON CustomDimensions {..} =
      Core.object
        ( Core.catMaybes
            [ ("items" Core..=) Core.<$> items,
              ("itemsPerPage" Core..=) Core.<$> itemsPerPage,
              Core.Just ("kind" Core..= kind),
              ("nextLink" Core..=) Core.<$> nextLink,
              ("previousLink" Core..=) Core.<$> previousLink,
              ("startIndex" Core..=) Core.<$> startIndex,
              ("totalResults" Core..=) Core.<$> totalResults,
              ("username" Core..=) Core.<$> username
            ]
        )
  
  -- | JSON template for Analytics Custom Metric.
  --
  -- /See:/ 'newCustomMetric' smart constructor.
  data CustomMetric = CustomMetric
    { -- | Account ID.
      accountId :: (Core.Maybe Core.Text),
      -- | Boolean indicating whether the custom metric is active.
      active :: (Core.Maybe Core.Bool),
      -- | Time the custom metric was created.
      created :: (Core.Maybe Core.DateTime),
      -- | Custom metric ID.
      id :: (Core.Maybe Core.Text),
      -- | Index of the custom metric.
      index :: (Core.Maybe Core.Int32),
      -- | Kind value for a custom metric. Set to \"analytics#customMetric\". It is a read-only field.
      kind :: Core.Text,
      -- | Max value of custom metric.
      maxValue :: (Core.Maybe Core.Text),
      -- | Min value of custom metric.
      minValue :: (Core.Maybe Core.Text),
      -- | Name of the custom metric.
      name :: (Core.Maybe Core.Text),
      -- | Parent link for the custom metric. Points to the property to which the custom metric belongs.
      parentLink :: (Core.Maybe CustomMetric_ParentLink),
      -- | Scope of the custom metric: HIT or PRODUCT.
      scope :: (Core.Maybe Core.Text),
      -- | Link for the custom metric
      selfLink :: (Core.Maybe Core.Text),
      -- | Data type of custom metric.
      type' :: (Core.Maybe Core.Text),
      -- | Time the custom metric was last modified.
      updated :: (Core.Maybe Core.DateTime),
      -- | Property ID.
      webPropertyId :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'CustomMetric' with the minimum fields required to make a request.
  newCustomMetric ::
    CustomMetric
  newCustomMetric =
    CustomMetric
      { accountId = Core.Nothing,
        active = Core.Nothing,
        created = Core.Nothing,
        id = Core.Nothing,
        index = Core.Nothing,
        kind = "analytics#customMetric",
        maxValue = Core.Nothing,
        minValue = Core.Nothing,
        name = Core.Nothing,
        parentLink = Core.Nothing,
        scope = Core.Nothing,
        selfLink = Core.Nothing,
        type' = Core.Nothing,
        updated = Core.Nothing,
        webPropertyId = Core.Nothing
      }
  
  instance Core.FromJSON CustomMetric where
    parseJSON =
      Core.withObject
        "CustomMetric"
        ( \o ->
            CustomMetric
              Core.<$> (o Core..:? "accountId")
              Core.<*> (o Core..:? "active")
              Core.<*> (o Core..:? "created")
              Core.<*> (o Core..:? "id")
              Core.<*> (o Core..:? "index")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#customMetric")
              Core.<*> (o Core..:? "max_value")
              Core.<*> (o Core..:? "min_value")
              Core.<*> (o Core..:? "name")
              Core.<*> (o Core..:? "parentLink")
              Core.<*> (o Core..:? "scope")
              Core.<*> (o Core..:? "selfLink")
              Core.<*> (o Core..:? "type")
              Core.<*> (o Core..:? "updated")
              Core.<*> (o Core..:? "webPropertyId")
        )
  
  instance Core.ToJSON CustomMetric where
    toJSON CustomMetric {..} =
      Core.object
        ( Core.catMaybes
            [ ("accountId" Core..=) Core.<$> accountId,
              ("active" Core..=) Core.<$> active,
              ("created" Core..=) Core.<$> created,
              ("id" Core..=) Core.<$> id,
              ("index" Core..=) Core.<$> index,
              Core.Just ("kind" Core..= kind),
              ("max_value" Core..=) Core.<$> maxValue,
              ("min_value" Core..=) Core.<$> minValue,
              ("name" Core..=) Core.<$> name,
              ("parentLink" Core..=) Core.<$> parentLink,
              ("scope" Core..=) Core.<$> scope,
              ("selfLink" Core..=) Core.<$> selfLink,
              ("type" Core..=) Core.<$> type',
              ("updated" Core..=) Core.<$> updated,
              ("webPropertyId" Core..=) Core.<$> webPropertyId
            ]
        )
  
  -- | Parent link for the custom metric. Points to the property to which the custom metric belongs.
  --
  -- /See:/ 'newCustomMetric_ParentLink' smart constructor.
  data CustomMetric_ParentLink = CustomMetric_ParentLink
    { -- | Link to the property to which the custom metric belongs.
      href :: (Core.Maybe Core.Text),
      -- | Type of the parent link. Set to \"analytics#webproperty\".
      type' :: Core.Text
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'CustomMetric_ParentLink' with the minimum fields required to make a request.
  newCustomMetric_ParentLink ::
    CustomMetric_ParentLink
  newCustomMetric_ParentLink =
    CustomMetric_ParentLink
      { href = Core.Nothing,
        type' = "analytics#webproperty"
      }
  
  instance Core.FromJSON CustomMetric_ParentLink where
    parseJSON =
      Core.withObject
        "CustomMetric_ParentLink"
        ( \o ->
            CustomMetric_ParentLink
              Core.<$> (o Core..:? "href")
              Core.<*> (o Core..:? "type" Core..!= "analytics#webproperty")
        )
  
  instance Core.ToJSON CustomMetric_ParentLink where
    toJSON CustomMetric_ParentLink {..} =
      Core.object
        ( Core.catMaybes
            [("href" Core..=) Core.<$> href, Core.Just ("type" Core..= type')]
        )
  
  -- | A custom metric collection lists Analytics custom metrics to which the user has access. Each resource in the collection corresponds to a single Analytics custom metric.
  --
  -- /See:/ 'newCustomMetrics' smart constructor.
  data CustomMetrics = CustomMetrics
    { -- | Collection of custom metrics.
      items :: (Core.Maybe [CustomMetric]),
      -- | The maximum number of resources the response can contain, regardless of the actual number of resources returned. Its value ranges from 1 to 1000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.
      itemsPerPage :: (Core.Maybe Core.Int32),
      -- | Collection type.
      kind :: Core.Text,
      -- | Link to next page for this custom metric collection.
      nextLink :: (Core.Maybe Core.Text),
      -- | Link to previous page for this custom metric collection.
      previousLink :: (Core.Maybe Core.Text),
      -- | The starting index of the resources, which is 1 by default or otherwise specified by the start-index query parameter.
      startIndex :: (Core.Maybe Core.Int32),
      -- | The total number of results for the query, regardless of the number of results in the response.
      totalResults :: (Core.Maybe Core.Int32),
      -- | Email ID of the authenticated user
      username :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'CustomMetrics' with the minimum fields required to make a request.
  newCustomMetrics ::
    CustomMetrics
  newCustomMetrics =
    CustomMetrics
      { items = Core.Nothing,
        itemsPerPage = Core.Nothing,
        kind = "analytics#customMetrics",
        nextLink = Core.Nothing,
        previousLink = Core.Nothing,
        startIndex = Core.Nothing,
        totalResults = Core.Nothing,
        username = Core.Nothing
      }
  
  instance Core.FromJSON CustomMetrics where
    parseJSON =
      Core.withObject
        "CustomMetrics"
        ( \o ->
            CustomMetrics
              Core.<$> (o Core..:? "items")
              Core.<*> (o Core..:? "itemsPerPage")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#customMetrics")
              Core.<*> (o Core..:? "nextLink")
              Core.<*> (o Core..:? "previousLink")
              Core.<*> (o Core..:? "startIndex")
              Core.<*> (o Core..:? "totalResults")
              Core.<*> (o Core..:? "username")
        )
  
  instance Core.ToJSON CustomMetrics where
    toJSON CustomMetrics {..} =
      Core.object
        ( Core.catMaybes
            [ ("items" Core..=) Core.<$> items,
              ("itemsPerPage" Core..=) Core.<$> itemsPerPage,
              Core.Just ("kind" Core..= kind),
              ("nextLink" Core..=) Core.<$> nextLink,
              ("previousLink" Core..=) Core.<$> previousLink,
              ("startIndex" Core..=) Core.<$> startIndex,
              ("totalResults" Core..=) Core.<$> totalResults,
              ("username" Core..=) Core.<$> username
            ]
        )
  
  -- | JSON template for Analytics Entity Google Ads Link.
  --
  -- /See:/ 'newEntityAdWordsLink' smart constructor.
  data EntityAdWordsLink = EntityAdWordsLink
    { -- | A list of Google Ads client accounts. These cannot be MCC accounts. This field is required when creating a Google Ads link. It cannot be empty.
      adWordsAccounts :: (Core.Maybe [AdWordsAccount]),
      -- | Web property being linked.
      entity :: (Core.Maybe EntityAdWordsLink_Entity),
      -- | Entity Google Ads link ID
      id :: (Core.Maybe Core.Text),
      -- | Resource type for entity Google Ads link.
      kind :: Core.Text,
      -- | Name of the link. This field is required when creating a Google Ads link.
      name :: (Core.Maybe Core.Text),
      -- | IDs of linked Views (Profiles) represented as strings.
      profileIds :: (Core.Maybe [Core.Text]),
      -- | URL link for this Google Analytics - Google Ads link.
      selfLink :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'EntityAdWordsLink' with the minimum fields required to make a request.
  newEntityAdWordsLink ::
    EntityAdWordsLink
  newEntityAdWordsLink =
    EntityAdWordsLink
      { adWordsAccounts = Core.Nothing,
        entity = Core.Nothing,
        id = Core.Nothing,
        kind = "analytics#entityAdWordsLink",
        name = Core.Nothing,
        profileIds = Core.Nothing,
        selfLink = Core.Nothing
      }
  
  instance Core.FromJSON EntityAdWordsLink where
    parseJSON =
      Core.withObject
        "EntityAdWordsLink"
        ( \o ->
            EntityAdWordsLink
              Core.<$> (o Core..:? "adWordsAccounts")
              Core.<*> (o Core..:? "entity")
              Core.<*> (o Core..:? "id")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#entityAdWordsLink")
              Core.<*> (o Core..:? "name")
              Core.<*> (o Core..:? "profileIds")
              Core.<*> (o Core..:? "selfLink")
        )
  
  instance Core.ToJSON EntityAdWordsLink where
    toJSON EntityAdWordsLink {..} =
      Core.object
        ( Core.catMaybes
            [ ("adWordsAccounts" Core..=) Core.<$> adWordsAccounts,
              ("entity" Core..=) Core.<$> entity,
              ("id" Core..=) Core.<$> id,
              Core.Just ("kind" Core..= kind),
              ("name" Core..=) Core.<$> name,
              ("profileIds" Core..=) Core.<$> profileIds,
              ("selfLink" Core..=) Core.<$> selfLink
            ]
        )
  
  -- | Web property being linked.
  --
  -- /See:/ 'newEntityAdWordsLink_Entity' smart constructor.
  newtype EntityAdWordsLink_Entity = EntityAdWordsLink_Entity
    { webPropertyRef :: (Core.Maybe WebPropertyRef)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'EntityAdWordsLink_Entity' with the minimum fields required to make a request.
  newEntityAdWordsLink_Entity ::
    EntityAdWordsLink_Entity
  newEntityAdWordsLink_Entity =
    EntityAdWordsLink_Entity {webPropertyRef = Core.Nothing}
  
  instance Core.FromJSON EntityAdWordsLink_Entity where
    parseJSON =
      Core.withObject
        "EntityAdWordsLink_Entity"
        ( \o ->
            EntityAdWordsLink_Entity Core.<$> (o Core..:? "webPropertyRef")
        )
  
  instance Core.ToJSON EntityAdWordsLink_Entity where
    toJSON EntityAdWordsLink_Entity {..} =
      Core.object
        ( Core.catMaybes
            [("webPropertyRef" Core..=) Core.<$> webPropertyRef]
        )
  
  -- | An entity Google Ads link collection provides a list of GA-Google Ads links Each resource in this collection corresponds to a single link.
  --
  -- /See:/ 'newEntityAdWordsLinks' smart constructor.
  data EntityAdWordsLinks = EntityAdWordsLinks
    { -- | A list of entity Google Ads links.
      items :: (Core.Maybe [EntityAdWordsLink]),
      -- | The maximum number of entries the response can contain, regardless of the actual number of entries returned. Its value ranges from 1 to 1000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.
      itemsPerPage :: (Core.Maybe Core.Int32),
      -- | Collection type.
      kind :: Core.Text,
      -- | Next link for this Google Ads link collection.
      nextLink :: (Core.Maybe Core.Text),
      -- | Previous link for this Google Ads link collection.
      previousLink :: (Core.Maybe Core.Text),
      -- | The starting index of the entries, which is 1 by default or otherwise specified by the start-index query parameter.
      startIndex :: (Core.Maybe Core.Int32),
      -- | The total number of results for the query, regardless of the number of results in the response.
      totalResults :: (Core.Maybe Core.Int32)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'EntityAdWordsLinks' with the minimum fields required to make a request.
  newEntityAdWordsLinks ::
    EntityAdWordsLinks
  newEntityAdWordsLinks =
    EntityAdWordsLinks
      { items = Core.Nothing,
        itemsPerPage = Core.Nothing,
        kind = "analytics#entityAdWordsLinks",
        nextLink = Core.Nothing,
        previousLink = Core.Nothing,
        startIndex = Core.Nothing,
        totalResults = Core.Nothing
      }
  
  instance Core.FromJSON EntityAdWordsLinks where
    parseJSON =
      Core.withObject
        "EntityAdWordsLinks"
        ( \o ->
            EntityAdWordsLinks
              Core.<$> (o Core..:? "items")
              Core.<*> (o Core..:? "itemsPerPage")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#entityAdWordsLinks")
              Core.<*> (o Core..:? "nextLink")
              Core.<*> (o Core..:? "previousLink")
              Core.<*> (o Core..:? "startIndex")
              Core.<*> (o Core..:? "totalResults")
        )
  
  instance Core.ToJSON EntityAdWordsLinks where
    toJSON EntityAdWordsLinks {..} =
      Core.object
        ( Core.catMaybes
            [ ("items" Core..=) Core.<$> items,
              ("itemsPerPage" Core..=) Core.<$> itemsPerPage,
              Core.Just ("kind" Core..= kind),
              ("nextLink" Core..=) Core.<$> nextLink,
              ("previousLink" Core..=) Core.<$> previousLink,
              ("startIndex" Core..=) Core.<$> startIndex,
              ("totalResults" Core..=) Core.<$> totalResults
            ]
        )
  
  -- | JSON template for an Analytics Entity-User Link. Returns permissions that a user has for an entity.
  --
  -- /See:/ 'newEntityUserLink' smart constructor.
  data EntityUserLink = EntityUserLink
    { -- | Entity for this link. It can be an account, a web property, or a view (profile).
      entity :: (Core.Maybe EntityUserLink_Entity),
      -- | Entity user link ID
      id :: (Core.Maybe Core.Text),
      -- | Resource type for entity user link.
      kind :: Core.Text,
      -- | Permissions the user has for this entity.
      permissions :: (Core.Maybe EntityUserLink_Permissions),
      -- | Self link for this resource.
      selfLink :: (Core.Maybe Core.Text),
      -- | User reference.
      userRef :: (Core.Maybe UserRef)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'EntityUserLink' with the minimum fields required to make a request.
  newEntityUserLink ::
    EntityUserLink
  newEntityUserLink =
    EntityUserLink
      { entity = Core.Nothing,
        id = Core.Nothing,
        kind = "analytics#entityUserLink",
        permissions = Core.Nothing,
        selfLink = Core.Nothing,
        userRef = Core.Nothing
      }
  
  instance Core.FromJSON EntityUserLink where
    parseJSON =
      Core.withObject
        "EntityUserLink"
        ( \o ->
            EntityUserLink
              Core.<$> (o Core..:? "entity")
              Core.<*> (o Core..:? "id")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#entityUserLink")
              Core.<*> (o Core..:? "permissions")
              Core.<*> (o Core..:? "selfLink")
              Core.<*> (o Core..:? "userRef")
        )
  
  instance Core.ToJSON EntityUserLink where
    toJSON EntityUserLink {..} =
      Core.object
        ( Core.catMaybes
            [ ("entity" Core..=) Core.<$> entity,
              ("id" Core..=) Core.<$> id,
              Core.Just ("kind" Core..= kind),
              ("permissions" Core..=) Core.<$> permissions,
              ("selfLink" Core..=) Core.<$> selfLink,
              ("userRef" Core..=) Core.<$> userRef
            ]
        )
  
  -- | Entity for this link. It can be an account, a web property, or a view (profile).
  --
  -- /See:/ 'newEntityUserLink_Entity' smart constructor.
  data EntityUserLink_Entity = EntityUserLink_Entity
    { -- | Account for this link.
      accountRef :: (Core.Maybe AccountRef),
      -- | View (Profile) for this link.
      profileRef :: (Core.Maybe ProfileRef),
      -- | Web property for this link.
      webPropertyRef :: (Core.Maybe WebPropertyRef)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'EntityUserLink_Entity' with the minimum fields required to make a request.
  newEntityUserLink_Entity ::
    EntityUserLink_Entity
  newEntityUserLink_Entity =
    EntityUserLink_Entity
      { accountRef = Core.Nothing,
        profileRef = Core.Nothing,
        webPropertyRef = Core.Nothing
      }
  
  instance Core.FromJSON EntityUserLink_Entity where
    parseJSON =
      Core.withObject
        "EntityUserLink_Entity"
        ( \o ->
            EntityUserLink_Entity
              Core.<$> (o Core..:? "accountRef")
              Core.<*> (o Core..:? "profileRef")
              Core.<*> (o Core..:? "webPropertyRef")
        )
  
  instance Core.ToJSON EntityUserLink_Entity where
    toJSON EntityUserLink_Entity {..} =
      Core.object
        ( Core.catMaybes
            [ ("accountRef" Core..=) Core.<$> accountRef,
              ("profileRef" Core..=) Core.<$> profileRef,
              ("webPropertyRef" Core..=) Core.<$> webPropertyRef
            ]
        )
  
  -- | Permissions the user has for this entity.
  --
  -- /See:/ 'newEntityUserLink_Permissions' smart constructor.
  data EntityUserLink_Permissions = EntityUserLink_Permissions
    { -- | Effective permissions represent all the permissions that a user has for this entity. These include any implied permissions (e.g., EDIT implies VIEW) or inherited permissions from the parent entity. Effective permissions are read-only.
      effective :: (Core.Maybe [Core.Text]),
      -- | Permissions that a user has been assigned at this very level. Does not include any implied or inherited permissions. Local permissions are modifiable.
      local :: (Core.Maybe [Core.Text])
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'EntityUserLink_Permissions' with the minimum fields required to make a request.
  newEntityUserLink_Permissions ::
    EntityUserLink_Permissions
  newEntityUserLink_Permissions =
    EntityUserLink_Permissions
      { effective = Core.Nothing,
        local = Core.Nothing
      }
  
  instance Core.FromJSON EntityUserLink_Permissions where
    parseJSON =
      Core.withObject
        "EntityUserLink_Permissions"
        ( \o ->
            EntityUserLink_Permissions
              Core.<$> (o Core..:? "effective")
              Core.<*> (o Core..:? "local")
        )
  
  instance Core.ToJSON EntityUserLink_Permissions where
    toJSON EntityUserLink_Permissions {..} =
      Core.object
        ( Core.catMaybes
            [ ("effective" Core..=) Core.<$> effective,
              ("local" Core..=) Core.<$> local
            ]
        )
  
  -- | An entity user link collection provides a list of Analytics ACL links Each resource in this collection corresponds to a single link.
  --
  -- /See:/ 'newEntityUserLinks' smart constructor.
  data EntityUserLinks = EntityUserLinks
    { -- | A list of entity user links.
      items :: (Core.Maybe [EntityUserLink]),
      -- | The maximum number of entries the response can contain, regardless of the actual number of entries returned. Its value ranges from 1 to 1000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.
      itemsPerPage :: (Core.Maybe Core.Int32),
      -- | Collection type.
      kind :: Core.Text,
      -- | Next link for this account collection.
      nextLink :: (Core.Maybe Core.Text),
      -- | Previous link for this account collection.
      previousLink :: (Core.Maybe Core.Text),
      -- | The starting index of the entries, which is 1 by default or otherwise specified by the start-index query parameter.
      startIndex :: (Core.Maybe Core.Int32),
      -- | The total number of results for the query, regardless of the number of results in the response.
      totalResults :: (Core.Maybe Core.Int32)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'EntityUserLinks' with the minimum fields required to make a request.
  newEntityUserLinks ::
    EntityUserLinks
  newEntityUserLinks =
    EntityUserLinks
      { items = Core.Nothing,
        itemsPerPage = Core.Nothing,
        kind = "analytics#entityUserLinks",
        nextLink = Core.Nothing,
        previousLink = Core.Nothing,
        startIndex = Core.Nothing,
        totalResults = Core.Nothing
      }
  
  instance Core.FromJSON EntityUserLinks where
    parseJSON =
      Core.withObject
        "EntityUserLinks"
        ( \o ->
            EntityUserLinks
              Core.<$> (o Core..:? "items")
              Core.<*> (o Core..:? "itemsPerPage")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#entityUserLinks")
              Core.<*> (o Core..:? "nextLink")
              Core.<*> (o Core..:? "previousLink")
              Core.<*> (o Core..:? "startIndex")
              Core.<*> (o Core..:? "totalResults")
        )
  
  instance Core.ToJSON EntityUserLinks where
    toJSON EntityUserLinks {..} =
      Core.object
        ( Core.catMaybes
            [ ("items" Core..=) Core.<$> items,
              ("itemsPerPage" Core..=) Core.<$> itemsPerPage,
              Core.Just ("kind" Core..= kind),
              ("nextLink" Core..=) Core.<$> nextLink,
              ("previousLink" Core..=) Core.<$> previousLink,
              ("startIndex" Core..=) Core.<$> startIndex,
              ("totalResults" Core..=) Core.<$> totalResults
            ]
        )
  
  -- | JSON template for Analytics experiment resource.
  --
  -- /See:/ 'newExperiment' smart constructor.
  data Experiment = Experiment
    { -- | Account ID to which this experiment belongs. This field is read-only.
      accountId :: (Core.Maybe Core.Text),
      -- | Time the experiment was created. This field is read-only.
      created :: (Core.Maybe Core.DateTime),
      -- | Notes about this experiment.
      description :: (Core.Maybe Core.Text),
      -- | If true, the end user will be able to edit the experiment via the Google Analytics user interface.
      editableInGaUi :: (Core.Maybe Core.Bool),
      -- | The ending time of the experiment (the time the status changed from RUNNING to ENDED). This field is present only if the experiment has ended. This field is read-only.
      endTime :: (Core.Maybe Core.DateTime),
      -- | Boolean specifying whether to distribute traffic evenly across all variations. If the value is False, content experiments follows the default behavior of adjusting traffic dynamically based on variation performance. Optional -- defaults to False. This field may not be changed for an experiment whose status is ENDED.
      equalWeighting :: (Core.Maybe Core.Bool),
      -- | Experiment ID. Required for patch and update. Disallowed for create.
      id :: (Core.Maybe Core.Text),
      -- | Internal ID for the web property to which this experiment belongs. This field is read-only.
      internalWebPropertyId :: (Core.Maybe Core.Text),
      -- | Resource type for an Analytics experiment. This field is read-only.
      kind :: Core.Text,
      -- | An integer number in [3, 90]. Specifies the minimum length of the experiment. Can be changed for a running experiment. This field may not be changed for an experiments whose status is ENDED.
      minimumExperimentLengthInDays :: (Core.Maybe Core.Int32),
      -- | Experiment name. This field may not be changed for an experiment whose status is ENDED. This field is required when creating an experiment.
      name :: (Core.Maybe Core.Text),
      -- | The metric that the experiment is optimizing. Valid values: \"ga:goal(n)Completions\", \"ga:adsenseAdsClicks\", \"ga:adsenseAdsViewed\", \"ga:adsenseRevenue\", \"ga:bounces\", \"ga:pageviews\", \"ga:sessionDuration\", \"ga:transactions\", \"ga:transactionRevenue\". This field is required if status is \"RUNNING\" and servingFramework is one of \"REDIRECT\" or \"API\".
      objectiveMetric :: (Core.Maybe Core.Text),
      -- | Whether the objectiveMetric should be minimized or maximized. Possible values: \"MAXIMUM\", \"MINIMUM\". Optional--defaults to \"MAXIMUM\". Cannot be specified without objectiveMetric. Cannot be modified when status is \"RUNNING\" or \"ENDED\".
      optimizationType :: (Core.Maybe Core.Text),
      -- | Parent link for an experiment. Points to the view (profile) to which this experiment belongs.
      parentLink :: (Core.Maybe Experiment_ParentLink),
      -- | View (Profile) ID to which this experiment belongs. This field is read-only.
      profileId :: (Core.Maybe Core.Text),
      -- | Why the experiment ended. Possible values: \"STOPPED/BY/USER\", \"WINNER/FOUND\", \"EXPERIMENT/EXPIRED\", \"ENDED/WITH/NO/WINNER\", \"GOAL/OBJECTIVE/CHANGED\". \"ENDED/WITH/NO/WINNER\" means that the experiment didn\'t expire but no winner was projected to be found. If the experiment status is changed via the API to ENDED this field is set to STOPPED/BY/USER. This field is read-only.
      reasonExperimentEnded :: (Core.Maybe Core.Text),
      -- | Boolean specifying whether variations URLS are rewritten to match those of the original. This field may not be changed for an experiments whose status is ENDED.
      rewriteVariationUrlsAsOriginal :: (Core.Maybe Core.Bool),
      -- | Link for this experiment. This field is read-only.
      selfLink :: (Core.Maybe Core.Text),
      -- | The framework used to serve the experiment variations and evaluate the results. One of:
      -- - REDIRECT: Google Analytics redirects traffic to different variation pages, reports the chosen variation and evaluates the results. - API: Google Analytics chooses and reports the variation to serve and evaluates the results; the caller is responsible for serving the selected variation. - EXTERNAL: The variations will be served externally and the chosen variation reported to Google Analytics. The caller is responsible for serving the selected variation and evaluating the results.
      servingFramework :: (Core.Maybe Core.Text),
      -- | The snippet of code to include on the control page(s). This field is read-only.
      snippet :: (Core.Maybe Core.Text),
      -- | The starting time of the experiment (the time the status changed from READY/TO/RUN to RUNNING). This field is present only if the experiment has started. This field is read-only.
      startTime :: (Core.Maybe Core.DateTime),
      -- | Experiment status. Possible values: \"DRAFT\", \"READY/TO/RUN\", \"RUNNING\", \"ENDED\". Experiments can be created in the \"DRAFT\", \"READY/TO/RUN\" or \"RUNNING\" state. This field is required when creating an experiment.
      status :: (Core.Maybe Core.Text),
      -- | A floating-point number in (0, 1]. Specifies the fraction of the traffic that participates in the experiment. Can be changed for a running experiment. This field may not be changed for an experiments whose status is ENDED.
      trafficCoverage :: (Core.Maybe Core.Double),
      -- | Time the experiment was last modified. This field is read-only.
      updated :: (Core.Maybe Core.DateTime),
      -- | Array of variations. The first variation in the array is the original. The number of variations may not change once an experiment is in the RUNNING state. At least two variations are required before status can be set to RUNNING.
      variations :: (Core.Maybe [Experiment_VariationsItem]),
      -- | Web property ID to which this experiment belongs. The web property ID is of the form UA-XXXXX-YY. This field is read-only.
      webPropertyId :: (Core.Maybe Core.Text),
      -- | A floating-point number in (0, 1). Specifies the necessary confidence level to choose a winner. This field may not be changed for an experiments whose status is ENDED.
      winnerConfidenceLevel :: (Core.Maybe Core.Double),
      -- | Boolean specifying whether a winner has been found for this experiment. This field is read-only.
      winnerFound :: (Core.Maybe Core.Bool)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Experiment' with the minimum fields required to make a request.
  newExperiment ::
    Experiment
  newExperiment =
    Experiment
      { accountId = Core.Nothing,
        created = Core.Nothing,
        description = Core.Nothing,
        editableInGaUi = Core.Nothing,
        endTime = Core.Nothing,
        equalWeighting = Core.Nothing,
        id = Core.Nothing,
        internalWebPropertyId = Core.Nothing,
        kind = "analytics#experiment",
        minimumExperimentLengthInDays = Core.Nothing,
        name = Core.Nothing,
        objectiveMetric = Core.Nothing,
        optimizationType = Core.Nothing,
        parentLink = Core.Nothing,
        profileId = Core.Nothing,
        reasonExperimentEnded = Core.Nothing,
        rewriteVariationUrlsAsOriginal = Core.Nothing,
        selfLink = Core.Nothing,
        servingFramework = Core.Nothing,
        snippet = Core.Nothing,
        startTime = Core.Nothing,
        status = Core.Nothing,
        trafficCoverage = Core.Nothing,
        updated = Core.Nothing,
        variations = Core.Nothing,
        webPropertyId = Core.Nothing,
        winnerConfidenceLevel = Core.Nothing,
        winnerFound = Core.Nothing
      }
  
  instance Core.FromJSON Experiment where
    parseJSON =
      Core.withObject
        "Experiment"
        ( \o ->
            Experiment
              Core.<$> (o Core..:? "accountId")
              Core.<*> (o Core..:? "created")
              Core.<*> (o Core..:? "description")
              Core.<*> (o Core..:? "editableInGaUi")
              Core.<*> (o Core..:? "endTime")
              Core.<*> (o Core..:? "equalWeighting")
              Core.<*> (o Core..:? "id")
              Core.<*> (o Core..:? "internalWebPropertyId")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#experiment")
              Core.<*> (o Core..:? "minimumExperimentLengthInDays")
              Core.<*> (o Core..:? "name")
              Core.<*> (o Core..:? "objectiveMetric")
              Core.<*> (o Core..:? "optimizationType")
              Core.<*> (o Core..:? "parentLink")
              Core.<*> (o Core..:? "profileId")
              Core.<*> (o Core..:? "reasonExperimentEnded")
              Core.<*> (o Core..:? "rewriteVariationUrlsAsOriginal")
              Core.<*> (o Core..:? "selfLink")
              Core.<*> (o Core..:? "servingFramework")
              Core.<*> (o Core..:? "snippet")
              Core.<*> (o Core..:? "startTime")
              Core.<*> (o Core..:? "status")
              Core.<*> (o Core..:? "trafficCoverage")
              Core.<*> (o Core..:? "updated")
              Core.<*> (o Core..:? "variations")
              Core.<*> (o Core..:? "webPropertyId")
              Core.<*> (o Core..:? "winnerConfidenceLevel")
              Core.<*> (o Core..:? "winnerFound")
        )
  
  instance Core.ToJSON Experiment where
    toJSON Experiment {..} =
      Core.object
        ( Core.catMaybes
            [ ("accountId" Core..=) Core.<$> accountId,
              ("created" Core..=) Core.<$> created,
              ("description" Core..=) Core.<$> description,
              ("editableInGaUi" Core..=) Core.<$> editableInGaUi,
              ("endTime" Core..=) Core.<$> endTime,
              ("equalWeighting" Core..=) Core.<$> equalWeighting,
              ("id" Core..=) Core.<$> id,
              ("internalWebPropertyId" Core..=) Core.<$> internalWebPropertyId,
              Core.Just ("kind" Core..= kind),
              ("minimumExperimentLengthInDays" Core..=)
                Core.<$> minimumExperimentLengthInDays,
              ("name" Core..=) Core.<$> name,
              ("objectiveMetric" Core..=) Core.<$> objectiveMetric,
              ("optimizationType" Core..=) Core.<$> optimizationType,
              ("parentLink" Core..=) Core.<$> parentLink,
              ("profileId" Core..=) Core.<$> profileId,
              ("reasonExperimentEnded" Core..=) Core.<$> reasonExperimentEnded,
              ("rewriteVariationUrlsAsOriginal" Core..=)
                Core.<$> rewriteVariationUrlsAsOriginal,
              ("selfLink" Core..=) Core.<$> selfLink,
              ("servingFramework" Core..=) Core.<$> servingFramework,
              ("snippet" Core..=) Core.<$> snippet,
              ("startTime" Core..=) Core.<$> startTime,
              ("status" Core..=) Core.<$> status,
              ("trafficCoverage" Core..=) Core.<$> trafficCoverage,
              ("updated" Core..=) Core.<$> updated,
              ("variations" Core..=) Core.<$> variations,
              ("webPropertyId" Core..=) Core.<$> webPropertyId,
              ("winnerConfidenceLevel" Core..=) Core.<$> winnerConfidenceLevel,
              ("winnerFound" Core..=) Core.<$> winnerFound
            ]
        )
  
  -- | Parent link for an experiment. Points to the view (profile) to which this experiment belongs.
  --
  -- /See:/ 'newExperiment_ParentLink' smart constructor.
  data Experiment_ParentLink = Experiment_ParentLink
    { -- | Link to the view (profile) to which this experiment belongs. This field is read-only.
      href :: (Core.Maybe Core.Text),
      -- | Value is \"analytics#profile\". This field is read-only.
      type' :: Core.Text
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Experiment_ParentLink' with the minimum fields required to make a request.
  newExperiment_ParentLink ::
    Experiment_ParentLink
  newExperiment_ParentLink =
    Experiment_ParentLink
      { href = Core.Nothing,
        type' = "analytics#profile"
      }
  
  instance Core.FromJSON Experiment_ParentLink where
    parseJSON =
      Core.withObject
        "Experiment_ParentLink"
        ( \o ->
            Experiment_ParentLink
              Core.<$> (o Core..:? "href")
              Core.<*> (o Core..:? "type" Core..!= "analytics#profile")
        )
  
  instance Core.ToJSON Experiment_ParentLink where
    toJSON Experiment_ParentLink {..} =
      Core.object
        ( Core.catMaybes
            [("href" Core..=) Core.<$> href, Core.Just ("type" Core..= type')]
        )
  
  --
  -- /See:/ 'newExperiment_VariationsItem' smart constructor.
  data Experiment_VariationsItem = Experiment_VariationsItem
    { -- | The name of the variation. This field is required when creating an experiment. This field may not be changed for an experiment whose status is ENDED.
      name :: (Core.Maybe Core.Text),
      -- | Status of the variation. Possible values: \"ACTIVE\", \"INACTIVE\". INACTIVE variations are not served. This field may not be changed for an experiment whose status is ENDED.
      status :: (Core.Maybe Core.Text),
      -- | The URL of the variation. This field may not be changed for an experiment whose status is RUNNING or ENDED.
      url :: (Core.Maybe Core.Text),
      -- | Weight that this variation should receive. Only present if the experiment is running. This field is read-only.
      weight :: (Core.Maybe Core.Double),
      -- | True if the experiment has ended and this variation performed (statistically) significantly better than the original. This field is read-only.
      won :: (Core.Maybe Core.Bool)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Experiment_VariationsItem' with the minimum fields required to make a request.
  newExperiment_VariationsItem ::
    Experiment_VariationsItem
  newExperiment_VariationsItem =
    Experiment_VariationsItem
      { name = Core.Nothing,
        status = Core.Nothing,
        url = Core.Nothing,
        weight = Core.Nothing,
        won = Core.Nothing
      }
  
  instance Core.FromJSON Experiment_VariationsItem where
    parseJSON =
      Core.withObject
        "Experiment_VariationsItem"
        ( \o ->
            Experiment_VariationsItem
              Core.<$> (o Core..:? "name")
              Core.<*> (o Core..:? "status")
              Core.<*> (o Core..:? "url")
              Core.<*> (o Core..:? "weight")
              Core.<*> (o Core..:? "won")
        )
  
  instance Core.ToJSON Experiment_VariationsItem where
    toJSON Experiment_VariationsItem {..} =
      Core.object
        ( Core.catMaybes
            [ ("name" Core..=) Core.<$> name,
              ("status" Core..=) Core.<$> status,
              ("url" Core..=) Core.<$> url,
              ("weight" Core..=) Core.<$> weight,
              ("won" Core..=) Core.<$> won
            ]
        )
  
  -- | An experiment collection lists Analytics experiments to which the user has access. Each view (profile) can have a set of experiments. Each resource in the Experiment collection corresponds to a single Analytics experiment.
  --
  -- /See:/ 'newExperiments' smart constructor.
  data Experiments = Experiments
    { -- | A list of experiments.
      items :: (Core.Maybe [Experiment]),
      -- | The maximum number of resources the response can contain, regardless of the actual number of resources returned. Its value ranges from 1 to 1000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.
      itemsPerPage :: (Core.Maybe Core.Int32),
      -- | Collection type.
      kind :: Core.Text,
      -- | Link to next page for this experiment collection.
      nextLink :: (Core.Maybe Core.Text),
      -- | Link to previous page for this experiment collection.
      previousLink :: (Core.Maybe Core.Text),
      -- | The starting index of the resources, which is 1 by default or otherwise specified by the start-index query parameter.
      startIndex :: (Core.Maybe Core.Int32),
      -- | The total number of results for the query, regardless of the number of resources in the result.
      totalResults :: (Core.Maybe Core.Int32),
      -- | Email ID of the authenticated user
      username :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Experiments' with the minimum fields required to make a request.
  newExperiments ::
    Experiments
  newExperiments =
    Experiments
      { items = Core.Nothing,
        itemsPerPage = Core.Nothing,
        kind = "analytics#experiments",
        nextLink = Core.Nothing,
        previousLink = Core.Nothing,
        startIndex = Core.Nothing,
        totalResults = Core.Nothing,
        username = Core.Nothing
      }
  
  instance Core.FromJSON Experiments where
    parseJSON =
      Core.withObject
        "Experiments"
        ( \o ->
            Experiments
              Core.<$> (o Core..:? "items")
              Core.<*> (o Core..:? "itemsPerPage")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#experiments")
              Core.<*> (o Core..:? "nextLink")
              Core.<*> (o Core..:? "previousLink")
              Core.<*> (o Core..:? "startIndex")
              Core.<*> (o Core..:? "totalResults")
              Core.<*> (o Core..:? "username")
        )
  
  instance Core.ToJSON Experiments where
    toJSON Experiments {..} =
      Core.object
        ( Core.catMaybes
            [ ("items" Core..=) Core.<$> items,
              ("itemsPerPage" Core..=) Core.<$> itemsPerPage,
              Core.Just ("kind" Core..= kind),
              ("nextLink" Core..=) Core.<$> nextLink,
              ("previousLink" Core..=) Core.<$> previousLink,
              ("startIndex" Core..=) Core.<$> startIndex,
              ("totalResults" Core..=) Core.<$> totalResults,
              ("username" Core..=) Core.<$> username
            ]
        )
  
  -- | JSON template for an Analytics account filter.
  --
  -- /See:/ 'newFilter' smart constructor.
  data Filter = Filter
    { -- | Account ID to which this filter belongs.
      accountId :: (Core.Maybe Core.Text),
      -- | Details for the filter of the type ADVANCED.
      advancedDetails :: (Core.Maybe Filter_AdvancedDetails),
      -- | Time this filter was created.
      created :: (Core.Maybe Core.DateTime),
      -- | Details for the filter of the type EXCLUDE.
      excludeDetails :: (Core.Maybe FilterExpression),
      -- | Filter ID.
      id :: (Core.Maybe Core.Text),
      -- | Details for the filter of the type INCLUDE.
      includeDetails :: (Core.Maybe FilterExpression),
      -- | Resource type for Analytics filter.
      kind :: Core.Text,
      -- | Details for the filter of the type LOWER.
      lowercaseDetails :: (Core.Maybe Filter_LowercaseDetails),
      -- | Name of this filter.
      name :: (Core.Maybe Core.Text),
      -- | Parent link for this filter. Points to the account to which this filter belongs.
      parentLink :: (Core.Maybe Filter_ParentLink),
      -- | Details for the filter of the type SEARCH/AND/REPLACE.
      searchAndReplaceDetails :: (Core.Maybe Filter_SearchAndReplaceDetails),
      -- | Link for this filter.
      selfLink :: (Core.Maybe Core.Text),
      -- | Type of this filter. Possible values are INCLUDE, EXCLUDE, LOWERCASE, UPPERCASE, SEARCH/AND/REPLACE and ADVANCED.
      type' :: (Core.Maybe Core.Text),
      -- | Time this filter was last modified.
      updated :: (Core.Maybe Core.DateTime),
      -- | Details for the filter of the type UPPER.
      uppercaseDetails :: (Core.Maybe Filter_UppercaseDetails)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Filter' with the minimum fields required to make a request.
  newFilter ::
    Filter
  newFilter =
    Filter
      { accountId = Core.Nothing,
        advancedDetails = Core.Nothing,
        created = Core.Nothing,
        excludeDetails = Core.Nothing,
        id = Core.Nothing,
        includeDetails = Core.Nothing,
        kind = "analytics#filter",
        lowercaseDetails = Core.Nothing,
        name = Core.Nothing,
        parentLink = Core.Nothing,
        searchAndReplaceDetails = Core.Nothing,
        selfLink = Core.Nothing,
        type' = Core.Nothing,
        updated = Core.Nothing,
        uppercaseDetails = Core.Nothing
      }
  
  instance Core.FromJSON Filter where
    parseJSON =
      Core.withObject
        "Filter"
        ( \o ->
            Filter
              Core.<$> (o Core..:? "accountId")
              Core.<*> (o Core..:? "advancedDetails")
              Core.<*> (o Core..:? "created")
              Core.<*> (o Core..:? "excludeDetails")
              Core.<*> (o Core..:? "id")
              Core.<*> (o Core..:? "includeDetails")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#filter")
              Core.<*> (o Core..:? "lowercaseDetails")
              Core.<*> (o Core..:? "name")
              Core.<*> (o Core..:? "parentLink")
              Core.<*> (o Core..:? "searchAndReplaceDetails")
              Core.<*> (o Core..:? "selfLink")
              Core.<*> (o Core..:? "type")
              Core.<*> (o Core..:? "updated")
              Core.<*> (o Core..:? "uppercaseDetails")
        )
  
  instance Core.ToJSON Filter where
    toJSON Filter {..} =
      Core.object
        ( Core.catMaybes
            [ ("accountId" Core..=) Core.<$> accountId,
              ("advancedDetails" Core..=) Core.<$> advancedDetails,
              ("created" Core..=) Core.<$> created,
              ("excludeDetails" Core..=) Core.<$> excludeDetails,
              ("id" Core..=) Core.<$> id,
              ("includeDetails" Core..=) Core.<$> includeDetails,
              Core.Just ("kind" Core..= kind),
              ("lowercaseDetails" Core..=) Core.<$> lowercaseDetails,
              ("name" Core..=) Core.<$> name,
              ("parentLink" Core..=) Core.<$> parentLink,
              ("searchAndReplaceDetails" Core..=)
                Core.<$> searchAndReplaceDetails,
              ("selfLink" Core..=) Core.<$> selfLink,
              ("type" Core..=) Core.<$> type',
              ("updated" Core..=) Core.<$> updated,
              ("uppercaseDetails" Core..=) Core.<$> uppercaseDetails
            ]
        )
  
  -- | Details for the filter of the type ADVANCED.
  --
  -- /See:/ 'newFilter_AdvancedDetails' smart constructor.
  data Filter_AdvancedDetails = Filter_AdvancedDetails
    { -- | Indicates if the filter expressions are case sensitive.
      caseSensitive :: (Core.Maybe Core.Bool),
      -- | Expression to extract from field A.
      extractA :: (Core.Maybe Core.Text),
      -- | Expression to extract from field B.
      extractB :: (Core.Maybe Core.Text),
      -- | Field A.
      fieldA :: (Core.Maybe Core.Text),
      -- | The Index of the custom dimension. Required if field is a CUSTOM_DIMENSION.
      fieldAIndex :: (Core.Maybe Core.Int32),
      -- | Indicates if field A is required to match.
      fieldARequired :: (Core.Maybe Core.Bool),
      -- | Field B.
      fieldB :: (Core.Maybe Core.Text),
      -- | The Index of the custom dimension. Required if field is a CUSTOM_DIMENSION.
      fieldBIndex :: (Core.Maybe Core.Int32),
      -- | Indicates if field B is required to match.
      fieldBRequired :: (Core.Maybe Core.Bool),
      -- | Expression used to construct the output value.
      outputConstructor :: (Core.Maybe Core.Text),
      -- | Output field.
      outputToField :: (Core.Maybe Core.Text),
      -- | The Index of the custom dimension. Required if field is a CUSTOM_DIMENSION.
      outputToFieldIndex :: (Core.Maybe Core.Int32),
      -- | Indicates if the existing value of the output field, if any, should be overridden by the output expression.
      overrideOutputField :: (Core.Maybe Core.Bool)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Filter_AdvancedDetails' with the minimum fields required to make a request.
  newFilter_AdvancedDetails ::
    Filter_AdvancedDetails
  newFilter_AdvancedDetails =
    Filter_AdvancedDetails
      { caseSensitive = Core.Nothing,
        extractA = Core.Nothing,
        extractB = Core.Nothing,
        fieldA = Core.Nothing,
        fieldAIndex = Core.Nothing,
        fieldARequired = Core.Nothing,
        fieldB = Core.Nothing,
        fieldBIndex = Core.Nothing,
        fieldBRequired = Core.Nothing,
        outputConstructor = Core.Nothing,
        outputToField = Core.Nothing,
        outputToFieldIndex = Core.Nothing,
        overrideOutputField = Core.Nothing
      }
  
  instance Core.FromJSON Filter_AdvancedDetails where
    parseJSON =
      Core.withObject
        "Filter_AdvancedDetails"
        ( \o ->
            Filter_AdvancedDetails
              Core.<$> (o Core..:? "caseSensitive")
              Core.<*> (o Core..:? "extractA")
              Core.<*> (o Core..:? "extractB")
              Core.<*> (o Core..:? "fieldA")
              Core.<*> (o Core..:? "fieldAIndex")
              Core.<*> (o Core..:? "fieldARequired")
              Core.<*> (o Core..:? "fieldB")
              Core.<*> (o Core..:? "fieldBIndex")
              Core.<*> (o Core..:? "fieldBRequired")
              Core.<*> (o Core..:? "outputConstructor")
              Core.<*> (o Core..:? "outputToField")
              Core.<*> (o Core..:? "outputToFieldIndex")
              Core.<*> (o Core..:? "overrideOutputField")
        )
  
  instance Core.ToJSON Filter_AdvancedDetails where
    toJSON Filter_AdvancedDetails {..} =
      Core.object
        ( Core.catMaybes
            [ ("caseSensitive" Core..=) Core.<$> caseSensitive,
              ("extractA" Core..=) Core.<$> extractA,
              ("extractB" Core..=) Core.<$> extractB,
              ("fieldA" Core..=) Core.<$> fieldA,
              ("fieldAIndex" Core..=) Core.<$> fieldAIndex,
              ("fieldARequired" Core..=) Core.<$> fieldARequired,
              ("fieldB" Core..=) Core.<$> fieldB,
              ("fieldBIndex" Core..=) Core.<$> fieldBIndex,
              ("fieldBRequired" Core..=) Core.<$> fieldBRequired,
              ("outputConstructor" Core..=) Core.<$> outputConstructor,
              ("outputToField" Core..=) Core.<$> outputToField,
              ("outputToFieldIndex" Core..=) Core.<$> outputToFieldIndex,
              ("overrideOutputField" Core..=) Core.<$> overrideOutputField
            ]
        )
  
  -- | Details for the filter of the type LOWER.
  --
  -- /See:/ 'newFilter_LowercaseDetails' smart constructor.
  data Filter_LowercaseDetails = Filter_LowercaseDetails
    { -- | Field to use in the filter.
      field :: (Core.Maybe Core.Text),
      -- | The Index of the custom dimension. Required if field is a CUSTOM_DIMENSION.
      fieldIndex :: (Core.Maybe Core.Int32)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Filter_LowercaseDetails' with the minimum fields required to make a request.
  newFilter_LowercaseDetails ::
    Filter_LowercaseDetails
  newFilter_LowercaseDetails =
    Filter_LowercaseDetails
      { field = Core.Nothing,
        fieldIndex = Core.Nothing
      }
  
  instance Core.FromJSON Filter_LowercaseDetails where
    parseJSON =
      Core.withObject
        "Filter_LowercaseDetails"
        ( \o ->
            Filter_LowercaseDetails
              Core.<$> (o Core..:? "field")
              Core.<*> (o Core..:? "fieldIndex")
        )
  
  instance Core.ToJSON Filter_LowercaseDetails where
    toJSON Filter_LowercaseDetails {..} =
      Core.object
        ( Core.catMaybes
            [ ("field" Core..=) Core.<$> field,
              ("fieldIndex" Core..=) Core.<$> fieldIndex
            ]
        )
  
  -- | Parent link for this filter. Points to the account to which this filter belongs.
  --
  -- /See:/ 'newFilter_ParentLink' smart constructor.
  data Filter_ParentLink = Filter_ParentLink
    { -- | Link to the account to which this filter belongs.
      href :: (Core.Maybe Core.Text),
      -- | Value is \"analytics#account\".
      type' :: Core.Text
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Filter_ParentLink' with the minimum fields required to make a request.
  newFilter_ParentLink ::
    Filter_ParentLink
  newFilter_ParentLink =
    Filter_ParentLink
      { href = Core.Nothing,
        type' = "analytics#account"
      }
  
  instance Core.FromJSON Filter_ParentLink where
    parseJSON =
      Core.withObject
        "Filter_ParentLink"
        ( \o ->
            Filter_ParentLink
              Core.<$> (o Core..:? "href")
              Core.<*> (o Core..:? "type" Core..!= "analytics#account")
        )
  
  instance Core.ToJSON Filter_ParentLink where
    toJSON Filter_ParentLink {..} =
      Core.object
        ( Core.catMaybes
            [("href" Core..=) Core.<$> href, Core.Just ("type" Core..= type')]
        )
  
  -- | Details for the filter of the type SEARCH/AND/REPLACE.
  --
  -- /See:/ 'newFilter_SearchAndReplaceDetails' smart constructor.
  data Filter_SearchAndReplaceDetails = Filter_SearchAndReplaceDetails
    { -- | Determines if the filter is case sensitive.
      caseSensitive :: (Core.Maybe Core.Bool),
      -- | Field to use in the filter.
      field :: (Core.Maybe Core.Text),
      -- | The Index of the custom dimension. Required if field is a CUSTOM_DIMENSION.
      fieldIndex :: (Core.Maybe Core.Int32),
      -- | Term to replace the search term with.
      replaceString :: (Core.Maybe Core.Text),
      -- | Term to search.
      searchString :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Filter_SearchAndReplaceDetails' with the minimum fields required to make a request.
  newFilter_SearchAndReplaceDetails ::
    Filter_SearchAndReplaceDetails
  newFilter_SearchAndReplaceDetails =
    Filter_SearchAndReplaceDetails
      { caseSensitive = Core.Nothing,
        field = Core.Nothing,
        fieldIndex = Core.Nothing,
        replaceString = Core.Nothing,
        searchString = Core.Nothing
      }
  
  instance Core.FromJSON Filter_SearchAndReplaceDetails where
    parseJSON =
      Core.withObject
        "Filter_SearchAndReplaceDetails"
        ( \o ->
            Filter_SearchAndReplaceDetails
              Core.<$> (o Core..:? "caseSensitive")
              Core.<*> (o Core..:? "field")
              Core.<*> (o Core..:? "fieldIndex")
              Core.<*> (o Core..:? "replaceString")
              Core.<*> (o Core..:? "searchString")
        )
  
  instance Core.ToJSON Filter_SearchAndReplaceDetails where
    toJSON Filter_SearchAndReplaceDetails {..} =
      Core.object
        ( Core.catMaybes
            [ ("caseSensitive" Core..=) Core.<$> caseSensitive,
              ("field" Core..=) Core.<$> field,
              ("fieldIndex" Core..=) Core.<$> fieldIndex,
              ("replaceString" Core..=) Core.<$> replaceString,
              ("searchString" Core..=) Core.<$> searchString
            ]
        )
  
  -- | Details for the filter of the type UPPER.
  --
  -- /See:/ 'newFilter_UppercaseDetails' smart constructor.
  data Filter_UppercaseDetails = Filter_UppercaseDetails
    { -- | Field to use in the filter.
      field :: (Core.Maybe Core.Text),
      -- | The Index of the custom dimension. Required if field is a CUSTOM_DIMENSION.
      fieldIndex :: (Core.Maybe Core.Int32)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Filter_UppercaseDetails' with the minimum fields required to make a request.
  newFilter_UppercaseDetails ::
    Filter_UppercaseDetails
  newFilter_UppercaseDetails =
    Filter_UppercaseDetails
      { field = Core.Nothing,
        fieldIndex = Core.Nothing
      }
  
  instance Core.FromJSON Filter_UppercaseDetails where
    parseJSON =
      Core.withObject
        "Filter_UppercaseDetails"
        ( \o ->
            Filter_UppercaseDetails
              Core.<$> (o Core..:? "field")
              Core.<*> (o Core..:? "fieldIndex")
        )
  
  instance Core.ToJSON Filter_UppercaseDetails where
    toJSON Filter_UppercaseDetails {..} =
      Core.object
        ( Core.catMaybes
            [ ("field" Core..=) Core.<$> field,
              ("fieldIndex" Core..=) Core.<$> fieldIndex
            ]
        )
  
  -- | JSON template for an Analytics filter expression.
  --
  -- /See:/ 'newFilterExpression' smart constructor.
  data FilterExpression = FilterExpression
    { -- | Determines if the filter is case sensitive.
      caseSensitive :: (Core.Maybe Core.Bool),
      -- | Filter expression value
      expressionValue :: (Core.Maybe Core.Text),
      -- | Field to filter. Possible values:
      -- - Content and Traffic
      -- - PAGE/REQUEST/URI, - PAGE/HOSTNAME, - PAGE/TITLE, - REFERRAL, - COST/DATA/URI (Campaign target URL), - HIT/TYPE, - INTERNAL/SEARCH/TERM, - INTERNAL/SEARCH/TYPE, - SOURCE/PROPERTY/TRACKING/ID,
      -- - Campaign or AdGroup
      -- - CAMPAIGN/SOURCE, - CAMPAIGN/MEDIUM, - CAMPAIGN/NAME, - CAMPAIGN/AD/GROUP, - CAMPAIGN/TERM, - CAMPAIGN/CONTENT, - CAMPAIGN/CODE, - CAMPAIGN/REFERRAL/PATH,
      -- - E-Commerce
      -- - TRANSACTION/COUNTRY, - TRANSACTION/REGION, - TRANSACTION/CITY, - TRANSACTION/AFFILIATION (Store or order location), - ITEM/NAME, - ITEM/CODE, - ITEM/VARIATION, - TRANSACTION/ID, - TRANSACTION/CURRENCY/CODE, - PRODUCT/ACTION/TYPE,
      -- - Audience\/Users
      -- - BROWSER, - BROWSER/VERSION, - BROWSER/SIZE, - PLATFORM, - PLATFORM/VERSION, - LANGUAGE, - SCREEN/RESOLUTION, - SCREEN/COLORS, - JAVA/ENABLED (Boolean Field), - FLASH/VERSION, - GEO/SPEED (Connection speed), - VISITOR/TYPE, - GEO/ORGANIZATION (ISP organization), - GEO/DOMAIN, - GEO/IP/ADDRESS, - GEO/IP/VERSION,
      -- - Location
      -- - GEO/COUNTRY, - GEO/REGION, - GEO/CITY,
      -- - Event
      -- - EVENT/CATEGORY, - EVENT/ACTION, - EVENT/LABEL,
      -- - Other
      -- - CUSTOM/FIELD/1, - CUSTOM/FIELD/2, - USER/DEFINED/VALUE,
      -- - Application
      -- - APP/ID, - APP/INSTALLER/ID, - APP/NAME, - APP/VERSION, - SCREEN, - IS/APP (Boolean Field), - IS/FATAL/EXCEPTION (Boolean Field), - EXCEPTION/DESCRIPTION,
      -- - Mobile device
      -- - IS/MOBILE (Boolean Field, Deprecated. Use DEVICE/CATEGORY=mobile), - IS/TABLET (Boolean Field, Deprecated. Use DEVICE/CATEGORY=tablet), - DEVICE/CATEGORY, - MOBILE/HAS/QWERTY/KEYBOARD (Boolean Field), - MOBILE/HAS/NFC/SUPPORT (Boolean Field), - MOBILE/HAS/CELLULAR/RADIO (Boolean Field), - MOBILE/HAS/WIFI/SUPPORT (Boolean Field), - MOBILE/BRAND/NAME, - MOBILE/MODEL/NAME, - MOBILE/MARKETING/NAME, - MOBILE/POINTING/METHOD,
      -- - Social
      -- - SOCIAL/NETWORK, - SOCIAL/ACTION, - SOCIAL/ACTION/TARGET,
      -- - Custom dimension
      -- - CUSTOM/DIMENSION (See accompanying field index),
      field :: (Core.Maybe Core.Text),
      -- | The Index of the custom dimension. Set only if the field is a is CUSTOM_DIMENSION.
      fieldIndex :: (Core.Maybe Core.Int32),
      -- | Kind value for filter expression
      kind :: Core.Text,
      -- | Match type for this filter. Possible values are BEGINS/WITH, EQUAL, ENDS/WITH, CONTAINS, or MATCHES. GEO/DOMAIN, GEO/IP/ADDRESS, PAGE/REQUEST/URI, or PAGE/HOSTNAME filters can use any match type; all other filters must use MATCHES.
      matchType :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'FilterExpression' with the minimum fields required to make a request.
  newFilterExpression ::
    FilterExpression
  newFilterExpression =
    FilterExpression
      { caseSensitive = Core.Nothing,
        expressionValue = Core.Nothing,
        field = Core.Nothing,
        fieldIndex = Core.Nothing,
        kind = "analytics#filterExpression",
        matchType = Core.Nothing
      }
  
  instance Core.FromJSON FilterExpression where
    parseJSON =
      Core.withObject
        "FilterExpression"
        ( \o ->
            FilterExpression
              Core.<$> (o Core..:? "caseSensitive")
              Core.<*> (o Core..:? "expressionValue")
              Core.<*> (o Core..:? "field")
              Core.<*> (o Core..:? "fieldIndex")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#filterExpression")
              Core.<*> (o Core..:? "matchType")
        )
  
  instance Core.ToJSON FilterExpression where
    toJSON FilterExpression {..} =
      Core.object
        ( Core.catMaybes
            [ ("caseSensitive" Core..=) Core.<$> caseSensitive,
              ("expressionValue" Core..=) Core.<$> expressionValue,
              ("field" Core..=) Core.<$> field,
              ("fieldIndex" Core..=) Core.<$> fieldIndex,
              Core.Just ("kind" Core..= kind),
              ("matchType" Core..=) Core.<$> matchType
            ]
        )
  
  -- | JSON template for a profile filter link.
  --
  -- /See:/ 'newFilterRef' smart constructor.
  data FilterRef = FilterRef
    { -- | Account ID to which this filter belongs.
      accountId :: (Core.Maybe Core.Text),
      -- | Link for this filter.
      href :: (Core.Maybe Core.Text),
      -- | Filter ID.
      id :: (Core.Maybe Core.Text),
      -- | Kind value for filter reference.
      kind :: Core.Text,
      -- | Name of this filter.
      name :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'FilterRef' with the minimum fields required to make a request.
  newFilterRef ::
    FilterRef
  newFilterRef =
    FilterRef
      { accountId = Core.Nothing,
        href = Core.Nothing,
        id = Core.Nothing,
        kind = "analytics#filterRef",
        name = Core.Nothing
      }
  
  instance Core.FromJSON FilterRef where
    parseJSON =
      Core.withObject
        "FilterRef"
        ( \o ->
            FilterRef
              Core.<$> (o Core..:? "accountId")
              Core.<*> (o Core..:? "href")
              Core.<*> (o Core..:? "id")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#filterRef")
              Core.<*> (o Core..:? "name")
        )
  
  instance Core.ToJSON FilterRef where
    toJSON FilterRef {..} =
      Core.object
        ( Core.catMaybes
            [ ("accountId" Core..=) Core.<$> accountId,
              ("href" Core..=) Core.<$> href,
              ("id" Core..=) Core.<$> id,
              Core.Just ("kind" Core..= kind),
              ("name" Core..=) Core.<$> name
            ]
        )
  
  -- | A filter collection lists filters created by users in an Analytics account. Each resource in the collection corresponds to a filter.
  --
  -- /See:/ 'newFilters' smart constructor.
  data Filters = Filters
    { -- | A list of filters.
      items :: (Core.Maybe [Filter]),
      -- | The maximum number of resources the response can contain, regardless of the actual number of resources returned. Its value ranges from 1 to 1,000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.
      itemsPerPage :: (Core.Maybe Core.Int32),
      -- | Collection type.
      kind :: Core.Text,
      -- | Link to next page for this filter collection.
      nextLink :: (Core.Maybe Core.Text),
      -- | Link to previous page for this filter collection.
      previousLink :: (Core.Maybe Core.Text),
      -- | The starting index of the resources, which is 1 by default or otherwise specified by the start-index query parameter.
      startIndex :: (Core.Maybe Core.Int32),
      -- | The total number of results for the query, regardless of the number of results in the response.
      totalResults :: (Core.Maybe Core.Int32),
      -- | Email ID of the authenticated user
      username :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Filters' with the minimum fields required to make a request.
  newFilters ::
    Filters
  newFilters =
    Filters
      { items = Core.Nothing,
        itemsPerPage = Core.Nothing,
        kind = "analytics#filters",
        nextLink = Core.Nothing,
        previousLink = Core.Nothing,
        startIndex = Core.Nothing,
        totalResults = Core.Nothing,
        username = Core.Nothing
      }
  
  instance Core.FromJSON Filters where
    parseJSON =
      Core.withObject
        "Filters"
        ( \o ->
            Filters
              Core.<$> (o Core..:? "items")
              Core.<*> (o Core..:? "itemsPerPage")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#filters")
              Core.<*> (o Core..:? "nextLink")
              Core.<*> (o Core..:? "previousLink")
              Core.<*> (o Core..:? "startIndex")
              Core.<*> (o Core..:? "totalResults")
              Core.<*> (o Core..:? "username")
        )
  
  instance Core.ToJSON Filters where
    toJSON Filters {..} =
      Core.object
        ( Core.catMaybes
            [ ("items" Core..=) Core.<$> items,
              ("itemsPerPage" Core..=) Core.<$> itemsPerPage,
              Core.Just ("kind" Core..= kind),
              ("nextLink" Core..=) Core.<$> nextLink,
              ("previousLink" Core..=) Core.<$> previousLink,
              ("startIndex" Core..=) Core.<$> startIndex,
              ("totalResults" Core..=) Core.<$> totalResults,
              ("username" Core..=) Core.<$> username
            ]
        )
  
  -- | Analytics data for a given view (profile).
  --
  -- /See:/ 'newGaData' smart constructor.
  data GaData = GaData
    { -- | Column headers that list dimension names followed by the metric names. The order of dimensions and metrics is same as specified in the request.
      columnHeaders :: (Core.Maybe [GaData_ColumnHeadersItem]),
      -- | Determines if Analytics data contains samples.
      containsSampledData :: (Core.Maybe Core.Bool),
      -- | The last refreshed time in seconds for Analytics data.
      dataLastRefreshed :: (Core.Maybe Core.Int64),
      dataTable :: (Core.Maybe GaData_DataTable),
      -- | Unique ID for this data response.
      id :: (Core.Maybe Core.Text),
      -- | The maximum number of rows the response can contain, regardless of the actual number of rows returned. Its value ranges from 1 to 10,000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.
      itemsPerPage :: (Core.Maybe Core.Int32),
      -- | Resource type.
      kind :: Core.Text,
      -- | Link to next page for this Analytics data query.
      nextLink :: (Core.Maybe Core.Text),
      -- | Link to previous page for this Analytics data query.
      previousLink :: (Core.Maybe Core.Text),
      -- | Information for the view (profile), for which the Analytics data was requested.
      profileInfo :: (Core.Maybe GaData_ProfileInfo),
      -- | Analytics data request query parameters.
      query :: (Core.Maybe GaData_Query),
      -- | Analytics data rows, where each row contains a list of dimension values followed by the metric values. The order of dimensions and metrics is same as specified in the request.
      rows :: (Core.Maybe [[Core.Text]]),
      -- | The number of samples used to calculate the result.
      sampleSize :: (Core.Maybe Core.Int64),
      -- | Total size of the sample space from which the samples were selected.
      sampleSpace :: (Core.Maybe Core.Int64),
      -- | Link to this page.
      selfLink :: (Core.Maybe Core.Text),
      -- | The total number of rows for the query, regardless of the number of rows in the response.
      totalResults :: (Core.Maybe Core.Int32),
      -- | Total values for the requested metrics over all the results, not just the results returned in this response. The order of the metric totals is same as the metric order specified in the request.
      totalsForAllResults :: (Core.Maybe GaData_TotalsForAllResults)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GaData' with the minimum fields required to make a request.
  newGaData ::
    GaData
  newGaData =
    GaData
      { columnHeaders = Core.Nothing,
        containsSampledData = Core.Nothing,
        dataLastRefreshed = Core.Nothing,
        dataTable = Core.Nothing,
        id = Core.Nothing,
        itemsPerPage = Core.Nothing,
        kind = "analytics#gaData",
        nextLink = Core.Nothing,
        previousLink = Core.Nothing,
        profileInfo = Core.Nothing,
        query = Core.Nothing,
        rows = Core.Nothing,
        sampleSize = Core.Nothing,
        sampleSpace = Core.Nothing,
        selfLink = Core.Nothing,
        totalResults = Core.Nothing,
        totalsForAllResults = Core.Nothing
      }
  
  instance Core.FromJSON GaData where
    parseJSON =
      Core.withObject
        "GaData"
        ( \o ->
            GaData
              Core.<$> (o Core..:? "columnHeaders")
              Core.<*> (o Core..:? "containsSampledData")
              Core.<*> (o Core..:? "dataLastRefreshed" Core.<&> Core.fmap Core.fromAsText)
              Core.<*> (o Core..:? "dataTable")
              Core.<*> (o Core..:? "id")
              Core.<*> (o Core..:? "itemsPerPage")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#gaData")
              Core.<*> (o Core..:? "nextLink")
              Core.<*> (o Core..:? "previousLink")
              Core.<*> (o Core..:? "profileInfo")
              Core.<*> (o Core..:? "query")
              Core.<*> (o Core..:? "rows")
              Core.<*> (o Core..:? "sampleSize" Core.<&> Core.fmap Core.fromAsText)
              Core.<*> (o Core..:? "sampleSpace" Core.<&> Core.fmap Core.fromAsText)
              Core.<*> (o Core..:? "selfLink")
              Core.<*> (o Core..:? "totalResults")
              Core.<*> (o Core..:? "totalsForAllResults")
        )
  
  instance Core.ToJSON GaData where
    toJSON GaData {..} =
      Core.object
        ( Core.catMaybes
            [ ("columnHeaders" Core..=) Core.<$> columnHeaders,
              ("containsSampledData" Core..=) Core.<$> containsSampledData,
              ("dataLastRefreshed" Core..=)
                Core.. Core.AsText
                Core.<$> dataLastRefreshed,
              ("dataTable" Core..=) Core.<$> dataTable,
              ("id" Core..=) Core.<$> id,
              ("itemsPerPage" Core..=) Core.<$> itemsPerPage,
              Core.Just ("kind" Core..= kind),
              ("nextLink" Core..=) Core.<$> nextLink,
              ("previousLink" Core..=) Core.<$> previousLink,
              ("profileInfo" Core..=) Core.<$> profileInfo,
              ("query" Core..=) Core.<$> query,
              ("rows" Core..=) Core.<$> rows,
              ("sampleSize" Core..=) Core.. Core.AsText Core.<$> sampleSize,
              ("sampleSpace" Core..=) Core.. Core.AsText Core.<$> sampleSpace,
              ("selfLink" Core..=) Core.<$> selfLink,
              ("totalResults" Core..=) Core.<$> totalResults,
              ("totalsForAllResults" Core..=) Core.<$> totalsForAllResults
            ]
        )
  
  --
  -- /See:/ 'newGaData_ColumnHeadersItem' smart constructor.
  data GaData_ColumnHeadersItem = GaData_ColumnHeadersItem
    { -- | Column Type. Either DIMENSION or METRIC.
      columnType :: (Core.Maybe Core.Text),
      -- | Data type. Dimension column headers have only STRING as the data type. Metric column headers have data types for metric values such as INTEGER, DOUBLE, CURRENCY etc.
      dataType :: (Core.Maybe Core.Text),
      -- | Column name.
      name :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GaData_ColumnHeadersItem' with the minimum fields required to make a request.
  newGaData_ColumnHeadersItem ::
    GaData_ColumnHeadersItem
  newGaData_ColumnHeadersItem =
    GaData_ColumnHeadersItem
      { columnType = Core.Nothing,
        dataType = Core.Nothing,
        name = Core.Nothing
      }
  
  instance Core.FromJSON GaData_ColumnHeadersItem where
    parseJSON =
      Core.withObject
        "GaData_ColumnHeadersItem"
        ( \o ->
            GaData_ColumnHeadersItem
              Core.<$> (o Core..:? "columnType")
              Core.<*> (o Core..:? "dataType")
              Core.<*> (o Core..:? "name")
        )
  
  instance Core.ToJSON GaData_ColumnHeadersItem where
    toJSON GaData_ColumnHeadersItem {..} =
      Core.object
        ( Core.catMaybes
            [ ("columnType" Core..=) Core.<$> columnType,
              ("dataType" Core..=) Core.<$> dataType,
              ("name" Core..=) Core.<$> name
            ]
        )
  
  --
  -- /See:/ 'newGaData_DataTable' smart constructor.
  data GaData_DataTable = GaData_DataTable
    { cols :: (Core.Maybe [GaData_DataTable_ColsItem]),
      rows :: (Core.Maybe [GaData_DataTable_RowsItem])
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GaData_DataTable' with the minimum fields required to make a request.
  newGaData_DataTable ::
    GaData_DataTable
  newGaData_DataTable =
    GaData_DataTable {cols = Core.Nothing, rows = Core.Nothing}
  
  instance Core.FromJSON GaData_DataTable where
    parseJSON =
      Core.withObject
        "GaData_DataTable"
        ( \o ->
            GaData_DataTable
              Core.<$> (o Core..:? "cols")
              Core.<*> (o Core..:? "rows")
        )
  
  instance Core.ToJSON GaData_DataTable where
    toJSON GaData_DataTable {..} =
      Core.object
        ( Core.catMaybes
            [("cols" Core..=) Core.<$> cols, ("rows" Core..=) Core.<$> rows]
        )
  
  --
  -- /See:/ 'newGaData_DataTable_ColsItem' smart constructor.
  data GaData_DataTable_ColsItem = GaData_DataTable_ColsItem
    { id :: (Core.Maybe Core.Text),
      label :: (Core.Maybe Core.Text),
      type' :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GaData_DataTable_ColsItem' with the minimum fields required to make a request.
  newGaData_DataTable_ColsItem ::
    GaData_DataTable_ColsItem
  newGaData_DataTable_ColsItem =
    GaData_DataTable_ColsItem
      { id = Core.Nothing,
        label = Core.Nothing,
        type' = Core.Nothing
      }
  
  instance Core.FromJSON GaData_DataTable_ColsItem where
    parseJSON =
      Core.withObject
        "GaData_DataTable_ColsItem"
        ( \o ->
            GaData_DataTable_ColsItem
              Core.<$> (o Core..:? "id")
              Core.<*> (o Core..:? "label")
              Core.<*> (o Core..:? "type")
        )
  
  instance Core.ToJSON GaData_DataTable_ColsItem where
    toJSON GaData_DataTable_ColsItem {..} =
      Core.object
        ( Core.catMaybes
            [ ("id" Core..=) Core.<$> id,
              ("label" Core..=) Core.<$> label,
              ("type" Core..=) Core.<$> type'
            ]
        )
  
  --
  -- /See:/ 'newGaData_DataTable_RowsItem' smart constructor.
  newtype GaData_DataTable_RowsItem = GaData_DataTable_RowsItem
    { c :: (Core.Maybe [GaData_DataTable_RowsItem_CItem])
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GaData_DataTable_RowsItem' with the minimum fields required to make a request.
  newGaData_DataTable_RowsItem ::
    GaData_DataTable_RowsItem
  newGaData_DataTable_RowsItem =
    GaData_DataTable_RowsItem {c = Core.Nothing}
  
  instance Core.FromJSON GaData_DataTable_RowsItem where
    parseJSON =
      Core.withObject
        "GaData_DataTable_RowsItem"
        (\o -> GaData_DataTable_RowsItem Core.<$> (o Core..:? "c"))
  
  instance Core.ToJSON GaData_DataTable_RowsItem where
    toJSON GaData_DataTable_RowsItem {..} =
      Core.object (Core.catMaybes [("c" Core..=) Core.<$> c])
  
  --
  -- /See:/ 'newGaData_DataTable_RowsItem_CItem' smart constructor.
  newtype GaData_DataTable_RowsItem_CItem = GaData_DataTable_RowsItem_CItem
    { v :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GaData_DataTable_RowsItem_CItem' with the minimum fields required to make a request.
  newGaData_DataTable_RowsItem_CItem ::
    GaData_DataTable_RowsItem_CItem
  newGaData_DataTable_RowsItem_CItem =
    GaData_DataTable_RowsItem_CItem {v = Core.Nothing}
  
  instance Core.FromJSON GaData_DataTable_RowsItem_CItem where
    parseJSON =
      Core.withObject
        "GaData_DataTable_RowsItem_CItem"
        (\o -> GaData_DataTable_RowsItem_CItem Core.<$> (o Core..:? "v"))
  
  instance Core.ToJSON GaData_DataTable_RowsItem_CItem where
    toJSON GaData_DataTable_RowsItem_CItem {..} =
      Core.object (Core.catMaybes [("v" Core..=) Core.<$> v])
  
  -- | Information for the view (profile), for which the Analytics data was requested.
  --
  -- /See:/ 'newGaData_ProfileInfo' smart constructor.
  data GaData_ProfileInfo = GaData_ProfileInfo
    { -- | Account ID to which this view (profile) belongs.
      accountId :: (Core.Maybe Core.Text),
      -- | Internal ID for the web property to which this view (profile) belongs.
      internalWebPropertyId :: (Core.Maybe Core.Text),
      -- | View (Profile) ID.
      profileId :: (Core.Maybe Core.Text),
      -- | View (Profile) name.
      profileName :: (Core.Maybe Core.Text),
      -- | Table ID for view (profile).
      tableId :: (Core.Maybe Core.Text),
      -- | Web Property ID to which this view (profile) belongs.
      webPropertyId :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GaData_ProfileInfo' with the minimum fields required to make a request.
  newGaData_ProfileInfo ::
    GaData_ProfileInfo
  newGaData_ProfileInfo =
    GaData_ProfileInfo
      { accountId = Core.Nothing,
        internalWebPropertyId = Core.Nothing,
        profileId = Core.Nothing,
        profileName = Core.Nothing,
        tableId = Core.Nothing,
        webPropertyId = Core.Nothing
      }
  
  instance Core.FromJSON GaData_ProfileInfo where
    parseJSON =
      Core.withObject
        "GaData_ProfileInfo"
        ( \o ->
            GaData_ProfileInfo
              Core.<$> (o Core..:? "accountId")
              Core.<*> (o Core..:? "internalWebPropertyId")
              Core.<*> (o Core..:? "profileId")
              Core.<*> (o Core..:? "profileName")
              Core.<*> (o Core..:? "tableId")
              Core.<*> (o Core..:? "webPropertyId")
        )
  
  instance Core.ToJSON GaData_ProfileInfo where
    toJSON GaData_ProfileInfo {..} =
      Core.object
        ( Core.catMaybes
            [ ("accountId" Core..=) Core.<$> accountId,
              ("internalWebPropertyId" Core..=) Core.<$> internalWebPropertyId,
              ("profileId" Core..=) Core.<$> profileId,
              ("profileName" Core..=) Core.<$> profileName,
              ("tableId" Core..=) Core.<$> tableId,
              ("webPropertyId" Core..=) Core.<$> webPropertyId
            ]
        )
  
  -- | Analytics data request query parameters.
  --
  -- /See:/ 'newGaData_Query' smart constructor.
  data GaData_Query = GaData_Query
    { -- | List of analytics dimensions.
      dimensions :: (Core.Maybe Core.Text),
      -- | End date.
      endDate :: (Core.Maybe Core.Text),
      -- | Comma-separated list of dimension or metric filters.
      filters :: (Core.Maybe Core.Text),
      -- | Unique table ID.
      ids :: (Core.Maybe Core.Text),
      -- | Maximum results per page.
      maxResults :: (Core.Maybe Core.Int32),
      -- | List of analytics metrics.
      metrics :: (Core.Maybe [Core.Text]),
      -- | Desired sampling level
      samplingLevel :: (Core.Maybe Core.Text),
      -- | Analytics advanced segment.
      segment :: (Core.Maybe Core.Text),
      -- | List of dimensions or metrics based on which Analytics data is sorted.
      sort :: (Core.Maybe [Core.Text]),
      -- | Start date.
      startDate :: (Core.Maybe Core.Text),
      -- | Start index.
      startIndex :: (Core.Maybe Core.Int32)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GaData_Query' with the minimum fields required to make a request.
  newGaData_Query ::
    GaData_Query
  newGaData_Query =
    GaData_Query
      { dimensions = Core.Nothing,
        endDate = Core.Nothing,
        filters = Core.Nothing,
        ids = Core.Nothing,
        maxResults = Core.Nothing,
        metrics = Core.Nothing,
        samplingLevel = Core.Nothing,
        segment = Core.Nothing,
        sort = Core.Nothing,
        startDate = Core.Nothing,
        startIndex = Core.Nothing
      }
  
  instance Core.FromJSON GaData_Query where
    parseJSON =
      Core.withObject
        "GaData_Query"
        ( \o ->
            GaData_Query
              Core.<$> (o Core..:? "dimensions")
              Core.<*> (o Core..:? "end-date")
              Core.<*> (o Core..:? "filters")
              Core.<*> (o Core..:? "ids")
              Core.<*> (o Core..:? "max-results")
              Core.<*> (o Core..:? "metrics")
              Core.<*> (o Core..:? "samplingLevel")
              Core.<*> (o Core..:? "segment")
              Core.<*> (o Core..:? "sort")
              Core.<*> (o Core..:? "start-date")
              Core.<*> (o Core..:? "start-index")
        )
  
  instance Core.ToJSON GaData_Query where
    toJSON GaData_Query {..} =
      Core.object
        ( Core.catMaybes
            [ ("dimensions" Core..=) Core.<$> dimensions,
              ("end-date" Core..=) Core.<$> endDate,
              ("filters" Core..=) Core.<$> filters,
              ("ids" Core..=) Core.<$> ids,
              ("max-results" Core..=) Core.<$> maxResults,
              ("metrics" Core..=) Core.<$> metrics,
              ("samplingLevel" Core..=) Core.<$> samplingLevel,
              ("segment" Core..=) Core.<$> segment,
              ("sort" Core..=) Core.<$> sort,
              ("start-date" Core..=) Core.<$> startDate,
              ("start-index" Core..=) Core.<$> startIndex
            ]
        )
  
  -- | Total values for the requested metrics over all the results, not just the results returned in this response. The order of the metric totals is same as the metric order specified in the request.
  --
  -- /See:/ 'newGaData_TotalsForAllResults' smart constructor.
  newtype GaData_TotalsForAllResults = GaData_TotalsForAllResults
    { -- | Key-value pair for the total value of a metric. Key is the metric name and the value is the total value for that metric.
      additional :: (Core.HashMap Core.Text Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'GaData_TotalsForAllResults' with the minimum fields required to make a request.
  newGaData_TotalsForAllResults ::
    -- |  Key-value pair for the total value of a metric. Key is the metric name and the value is the total value for that metric. See 'additional'.
    Core.HashMap Core.Text Core.Text ->
    GaData_TotalsForAllResults
  newGaData_TotalsForAllResults additional =
    GaData_TotalsForAllResults {additional = additional}
  
  instance Core.FromJSON GaData_TotalsForAllResults where
    parseJSON =
      Core.withObject
        "GaData_TotalsForAllResults"
        ( \o ->
            GaData_TotalsForAllResults Core.<$> (Core.parseJSONObject o)
        )
  
  instance Core.ToJSON GaData_TotalsForAllResults where
    toJSON GaData_TotalsForAllResults {..} = Core.toJSON additional
  
  -- | JSON template for Analytics goal resource.
  --
  -- /See:/ 'newGoal' smart constructor.
  data Goal = Goal
    { -- | Account ID to which this goal belongs.
      accountId :: (Core.Maybe Core.Text),
      -- | Determines whether this goal is active.
      active :: (Core.Maybe Core.Bool),
      -- | Time this goal was created.
      created :: (Core.Maybe Core.DateTime),
      -- | Details for the goal of the type EVENT.
      eventDetails :: (Core.Maybe Goal_EventDetails),
      -- | Goal ID.
      id :: (Core.Maybe Core.Text),
      -- | Internal ID for the web property to which this goal belongs.
      internalWebPropertyId :: (Core.Maybe Core.Text),
      -- | Resource type for an Analytics goal.
      kind :: Core.Text,
      -- | Goal name.
      name :: (Core.Maybe Core.Text),
      -- | Parent link for a goal. Points to the view (profile) to which this goal belongs.
      parentLink :: (Core.Maybe Goal_ParentLink),
      -- | View (Profile) ID to which this goal belongs.
      profileId :: (Core.Maybe Core.Text),
      -- | Link for this goal.
      selfLink :: (Core.Maybe Core.Text),
      -- | Goal type. Possible values are URL/DESTINATION, VISIT/TIME/ON/SITE, VISIT/NUM/PAGES, AND EVENT.
      type' :: (Core.Maybe Core.Text),
      -- | Time this goal was last modified.
      updated :: (Core.Maybe Core.DateTime),
      -- | Details for the goal of the type URL_DESTINATION.
      urlDestinationDetails :: (Core.Maybe Goal_UrlDestinationDetails),
      -- | Goal value.
      value :: (Core.Maybe Core.Double),
      -- | Details for the goal of the type VISIT/NUM/PAGES.
      visitNumPagesDetails :: (Core.Maybe Goal_VisitNumPagesDetails),
      -- | Details for the goal of the type VISIT/TIME/ON_SITE.
      visitTimeOnSiteDetails :: (Core.Maybe Goal_VisitTimeOnSiteDetails),
      -- | Web property ID to which this goal belongs. The web property ID is of the form UA-XXXXX-YY.
      webPropertyId :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Goal' with the minimum fields required to make a request.
  newGoal ::
    Goal
  newGoal =
    Goal
      { accountId = Core.Nothing,
        active = Core.Nothing,
        created = Core.Nothing,
        eventDetails = Core.Nothing,
        id = Core.Nothing,
        internalWebPropertyId = Core.Nothing,
        kind = "analytics#goal",
        name = Core.Nothing,
        parentLink = Core.Nothing,
        profileId = Core.Nothing,
        selfLink = Core.Nothing,
        type' = Core.Nothing,
        updated = Core.Nothing,
        urlDestinationDetails = Core.Nothing,
        value = Core.Nothing,
        visitNumPagesDetails = Core.Nothing,
        visitTimeOnSiteDetails = Core.Nothing,
        webPropertyId = Core.Nothing
      }
  
  instance Core.FromJSON Goal where
    parseJSON =
      Core.withObject
        "Goal"
        ( \o ->
            Goal
              Core.<$> (o Core..:? "accountId")
              Core.<*> (o Core..:? "active")
              Core.<*> (o Core..:? "created")
              Core.<*> (o Core..:? "eventDetails")
              Core.<*> (o Core..:? "id")
              Core.<*> (o Core..:? "internalWebPropertyId")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#goal")
              Core.<*> (o Core..:? "name")
              Core.<*> (o Core..:? "parentLink")
              Core.<*> (o Core..:? "profileId")
              Core.<*> (o Core..:? "selfLink")
              Core.<*> (o Core..:? "type")
              Core.<*> (o Core..:? "updated")
              Core.<*> (o Core..:? "urlDestinationDetails")
              Core.<*> (o Core..:? "value")
              Core.<*> (o Core..:? "visitNumPagesDetails")
              Core.<*> (o Core..:? "visitTimeOnSiteDetails")
              Core.<*> (o Core..:? "webPropertyId")
        )
  
  instance Core.ToJSON Goal where
    toJSON Goal {..} =
      Core.object
        ( Core.catMaybes
            [ ("accountId" Core..=) Core.<$> accountId,
              ("active" Core..=) Core.<$> active,
              ("created" Core..=) Core.<$> created,
              ("eventDetails" Core..=) Core.<$> eventDetails,
              ("id" Core..=) Core.<$> id,
              ("internalWebPropertyId" Core..=) Core.<$> internalWebPropertyId,
              Core.Just ("kind" Core..= kind),
              ("name" Core..=) Core.<$> name,
              ("parentLink" Core..=) Core.<$> parentLink,
              ("profileId" Core..=) Core.<$> profileId,
              ("selfLink" Core..=) Core.<$> selfLink,
              ("type" Core..=) Core.<$> type',
              ("updated" Core..=) Core.<$> updated,
              ("urlDestinationDetails" Core..=) Core.<$> urlDestinationDetails,
              ("value" Core..=) Core.<$> value,
              ("visitNumPagesDetails" Core..=) Core.<$> visitNumPagesDetails,
              ("visitTimeOnSiteDetails" Core..=) Core.<$> visitTimeOnSiteDetails,
              ("webPropertyId" Core..=) Core.<$> webPropertyId
            ]
        )
  
  -- | Details for the goal of the type EVENT.
  --
  -- /See:/ 'newGoal_EventDetails' smart constructor.
  data Goal_EventDetails = Goal_EventDetails
    { -- | List of event conditions.
      eventConditions :: (Core.Maybe [Goal_EventDetails_EventConditionsItem]),
      -- | Determines if the event value should be used as the value for this goal.
      useEventValue :: (Core.Maybe Core.Bool)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Goal_EventDetails' with the minimum fields required to make a request.
  newGoal_EventDetails ::
    Goal_EventDetails
  newGoal_EventDetails =
    Goal_EventDetails
      { eventConditions = Core.Nothing,
        useEventValue = Core.Nothing
      }
  
  instance Core.FromJSON Goal_EventDetails where
    parseJSON =
      Core.withObject
        "Goal_EventDetails"
        ( \o ->
            Goal_EventDetails
              Core.<$> (o Core..:? "eventConditions")
              Core.<*> (o Core..:? "useEventValue")
        )
  
  instance Core.ToJSON Goal_EventDetails where
    toJSON Goal_EventDetails {..} =
      Core.object
        ( Core.catMaybes
            [ ("eventConditions" Core..=) Core.<$> eventConditions,
              ("useEventValue" Core..=) Core.<$> useEventValue
            ]
        )
  
  --
  -- /See:/ 'newGoal_EventDetails_EventConditionsItem' smart constructor.
  data Goal_EventDetails_EventConditionsItem = Goal_EventDetails_EventConditionsItem
    { -- | Type of comparison. Possible values are LESS/THAN, GREATER/THAN or EQUAL.
      comparisonType :: (Core.Maybe Core.Text),
      -- | Value used for this comparison.
      comparisonValue :: (Core.Maybe Core.Int64),
      -- | Expression used for this match.
      expression :: (Core.Maybe Core.Text),
      -- | Type of the match to be performed. Possible values are REGEXP, BEGINS_WITH, or EXACT.
      matchType :: (Core.Maybe Core.Text),
      -- | Type of this event condition. Possible values are CATEGORY, ACTION, LABEL, or VALUE.
      type' :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Goal_EventDetails_EventConditionsItem' with the minimum fields required to make a request.
  newGoal_EventDetails_EventConditionsItem ::
    Goal_EventDetails_EventConditionsItem
  newGoal_EventDetails_EventConditionsItem =
    Goal_EventDetails_EventConditionsItem
      { comparisonType =
          Core.Nothing,
        comparisonValue = Core.Nothing,
        expression = Core.Nothing,
        matchType = Core.Nothing,
        type' = Core.Nothing
      }
  
  instance Core.FromJSON Goal_EventDetails_EventConditionsItem where
    parseJSON =
      Core.withObject
        "Goal_EventDetails_EventConditionsItem"
        ( \o ->
            Goal_EventDetails_EventConditionsItem
              Core.<$> (o Core..:? "comparisonType")
              Core.<*> (o Core..:? "comparisonValue" Core.<&> Core.fmap Core.fromAsText)
              Core.<*> (o Core..:? "expression")
              Core.<*> (o Core..:? "matchType")
              Core.<*> (o Core..:? "type")
        )
  
  instance Core.ToJSON Goal_EventDetails_EventConditionsItem where
    toJSON Goal_EventDetails_EventConditionsItem {..} =
      Core.object
        ( Core.catMaybes
            [ ("comparisonType" Core..=) Core.<$> comparisonType,
              ("comparisonValue" Core..=)
                Core.. Core.AsText
                Core.<$> comparisonValue,
              ("expression" Core..=) Core.<$> expression,
              ("matchType" Core..=) Core.<$> matchType,
              ("type" Core..=) Core.<$> type'
            ]
        )
  
  -- | Parent link for a goal. Points to the view (profile) to which this goal belongs.
  --
  -- /See:/ 'newGoal_ParentLink' smart constructor.
  data Goal_ParentLink = Goal_ParentLink
    { -- | Link to the view (profile) to which this goal belongs.
      href :: (Core.Maybe Core.Text),
      -- | Value is \"analytics#profile\".
      type' :: Core.Text
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Goal_ParentLink' with the minimum fields required to make a request.
  newGoal_ParentLink ::
    Goal_ParentLink
  newGoal_ParentLink =
    Goal_ParentLink {href = Core.Nothing, type' = "analytics#profile"}
  
  instance Core.FromJSON Goal_ParentLink where
    parseJSON =
      Core.withObject
        "Goal_ParentLink"
        ( \o ->
            Goal_ParentLink
              Core.<$> (o Core..:? "href")
              Core.<*> (o Core..:? "type" Core..!= "analytics#profile")
        )
  
  instance Core.ToJSON Goal_ParentLink where
    toJSON Goal_ParentLink {..} =
      Core.object
        ( Core.catMaybes
            [("href" Core..=) Core.<$> href, Core.Just ("type" Core..= type')]
        )
  
  -- | Details for the goal of the type URL_DESTINATION.
  --
  -- /See:/ 'newGoal_UrlDestinationDetails' smart constructor.
  data Goal_UrlDestinationDetails = Goal_UrlDestinationDetails
    { -- | Determines if the goal URL must exactly match the capitalization of visited URLs.
      caseSensitive :: (Core.Maybe Core.Bool),
      -- | Determines if the first step in this goal is required.
      firstStepRequired :: (Core.Maybe Core.Bool),
      -- | Match type for the goal URL. Possible values are HEAD, EXACT, or REGEX.
      matchType :: (Core.Maybe Core.Text),
      -- | List of steps configured for this goal funnel.
      steps :: (Core.Maybe [Goal_UrlDestinationDetails_StepsItem]),
      -- | URL for this goal.
      url :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Goal_UrlDestinationDetails' with the minimum fields required to make a request.
  newGoal_UrlDestinationDetails ::
    Goal_UrlDestinationDetails
  newGoal_UrlDestinationDetails =
    Goal_UrlDestinationDetails
      { caseSensitive = Core.Nothing,
        firstStepRequired = Core.Nothing,
        matchType = Core.Nothing,
        steps = Core.Nothing,
        url = Core.Nothing
      }
  
  instance Core.FromJSON Goal_UrlDestinationDetails where
    parseJSON =
      Core.withObject
        "Goal_UrlDestinationDetails"
        ( \o ->
            Goal_UrlDestinationDetails
              Core.<$> (o Core..:? "caseSensitive")
              Core.<*> (o Core..:? "firstStepRequired")
              Core.<*> (o Core..:? "matchType")
              Core.<*> (o Core..:? "steps")
              Core.<*> (o Core..:? "url")
        )
  
  instance Core.ToJSON Goal_UrlDestinationDetails where
    toJSON Goal_UrlDestinationDetails {..} =
      Core.object
        ( Core.catMaybes
            [ ("caseSensitive" Core..=) Core.<$> caseSensitive,
              ("firstStepRequired" Core..=) Core.<$> firstStepRequired,
              ("matchType" Core..=) Core.<$> matchType,
              ("steps" Core..=) Core.<$> steps,
              ("url" Core..=) Core.<$> url
            ]
        )
  
  --
  -- /See:/ 'newGoal_UrlDestinationDetails_StepsItem' smart constructor.
  data Goal_UrlDestinationDetails_StepsItem = Goal_UrlDestinationDetails_StepsItem
    { -- | Step name.
      name :: (Core.Maybe Core.Text),
      -- | Step number.
      number :: (Core.Maybe Core.Int32),
      -- | URL for this step.
      url :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Goal_UrlDestinationDetails_StepsItem' with the minimum fields required to make a request.
  newGoal_UrlDestinationDetails_StepsItem ::
    Goal_UrlDestinationDetails_StepsItem
  newGoal_UrlDestinationDetails_StepsItem =
    Goal_UrlDestinationDetails_StepsItem
      { name = Core.Nothing,
        number = Core.Nothing,
        url = Core.Nothing
      }
  
  instance Core.FromJSON Goal_UrlDestinationDetails_StepsItem where
    parseJSON =
      Core.withObject
        "Goal_UrlDestinationDetails_StepsItem"
        ( \o ->
            Goal_UrlDestinationDetails_StepsItem
              Core.<$> (o Core..:? "name")
              Core.<*> (o Core..:? "number")
              Core.<*> (o Core..:? "url")
        )
  
  instance Core.ToJSON Goal_UrlDestinationDetails_StepsItem where
    toJSON Goal_UrlDestinationDetails_StepsItem {..} =
      Core.object
        ( Core.catMaybes
            [ ("name" Core..=) Core.<$> name,
              ("number" Core..=) Core.<$> number,
              ("url" Core..=) Core.<$> url
            ]
        )
  
  -- | Details for the goal of the type VISIT/NUM/PAGES.
  --
  -- /See:/ 'newGoal_VisitNumPagesDetails' smart constructor.
  data Goal_VisitNumPagesDetails = Goal_VisitNumPagesDetails
    { -- | Type of comparison. Possible values are LESS/THAN, GREATER/THAN, or EQUAL.
      comparisonType :: (Core.Maybe Core.Text),
      -- | Value used for this comparison.
      comparisonValue :: (Core.Maybe Core.Int64)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Goal_VisitNumPagesDetails' with the minimum fields required to make a request.
  newGoal_VisitNumPagesDetails ::
    Goal_VisitNumPagesDetails
  newGoal_VisitNumPagesDetails =
    Goal_VisitNumPagesDetails
      { comparisonType = Core.Nothing,
        comparisonValue = Core.Nothing
      }
  
  instance Core.FromJSON Goal_VisitNumPagesDetails where
    parseJSON =
      Core.withObject
        "Goal_VisitNumPagesDetails"
        ( \o ->
            Goal_VisitNumPagesDetails
              Core.<$> (o Core..:? "comparisonType")
              Core.<*> (o Core..:? "comparisonValue" Core.<&> Core.fmap Core.fromAsText)
        )
  
  instance Core.ToJSON Goal_VisitNumPagesDetails where
    toJSON Goal_VisitNumPagesDetails {..} =
      Core.object
        ( Core.catMaybes
            [ ("comparisonType" Core..=) Core.<$> comparisonType,
              ("comparisonValue" Core..=)
                Core.. Core.AsText
                Core.<$> comparisonValue
            ]
        )
  
  -- | Details for the goal of the type VISIT/TIME/ON_SITE.
  --
  -- /See:/ 'newGoal_VisitTimeOnSiteDetails' smart constructor.
  data Goal_VisitTimeOnSiteDetails = Goal_VisitTimeOnSiteDetails
    { -- | Type of comparison. Possible values are LESS/THAN or GREATER/THAN.
      comparisonType :: (Core.Maybe Core.Text),
      -- | Value used for this comparison.
      comparisonValue :: (Core.Maybe Core.Int64)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Goal_VisitTimeOnSiteDetails' with the minimum fields required to make a request.
  newGoal_VisitTimeOnSiteDetails ::
    Goal_VisitTimeOnSiteDetails
  newGoal_VisitTimeOnSiteDetails =
    Goal_VisitTimeOnSiteDetails
      { comparisonType = Core.Nothing,
        comparisonValue = Core.Nothing
      }
  
  instance Core.FromJSON Goal_VisitTimeOnSiteDetails where
    parseJSON =
      Core.withObject
        "Goal_VisitTimeOnSiteDetails"
        ( \o ->
            Goal_VisitTimeOnSiteDetails
              Core.<$> (o Core..:? "comparisonType")
              Core.<*> (o Core..:? "comparisonValue" Core.<&> Core.fmap Core.fromAsText)
        )
  
  instance Core.ToJSON Goal_VisitTimeOnSiteDetails where
    toJSON Goal_VisitTimeOnSiteDetails {..} =
      Core.object
        ( Core.catMaybes
            [ ("comparisonType" Core..=) Core.<$> comparisonType,
              ("comparisonValue" Core..=)
                Core.. Core.AsText
                Core.<$> comparisonValue
            ]
        )
  
  -- | A goal collection lists Analytics goals to which the user has access. Each view (profile) can have a set of goals. Each resource in the Goal collection corresponds to a single Analytics goal.
  --
  -- /See:/ 'newGoals' smart constructor.
  data Goals = Goals
    { -- | A list of goals.
      items :: (Core.Maybe [Goal]),
      -- | The maximum number of resources the response can contain, regardless of the actual number of resources returned. Its value ranges from 1 to 1000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.
      itemsPerPage :: (Core.Maybe Core.Int32),
      -- | Collection type.
      kind :: Core.Text,
      -- | Link to next page for this goal collection.
      nextLink :: (Core.Maybe Core.Text),
      -- | Link to previous page for this goal collection.
      previousLink :: (Core.Maybe Core.Text),
      -- | The starting index of the resources, which is 1 by default or otherwise specified by the start-index query parameter.
      startIndex :: (Core.Maybe Core.Int32),
      -- | The total number of results for the query, regardless of the number of resources in the result.
      totalResults :: (Core.Maybe Core.Int32),
      -- | Email ID of the authenticated user
      username :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Goals' with the minimum fields required to make a request.
  newGoals ::
    Goals
  newGoals =
    Goals
      { items = Core.Nothing,
        itemsPerPage = Core.Nothing,
        kind = "analytics#goals",
        nextLink = Core.Nothing,
        previousLink = Core.Nothing,
        startIndex = Core.Nothing,
        totalResults = Core.Nothing,
        username = Core.Nothing
      }
  
  instance Core.FromJSON Goals where
    parseJSON =
      Core.withObject
        "Goals"
        ( \o ->
            Goals
              Core.<$> (o Core..:? "items")
              Core.<*> (o Core..:? "itemsPerPage")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#goals")
              Core.<*> (o Core..:? "nextLink")
              Core.<*> (o Core..:? "previousLink")
              Core.<*> (o Core..:? "startIndex")
              Core.<*> (o Core..:? "totalResults")
              Core.<*> (o Core..:? "username")
        )
  
  instance Core.ToJSON Goals where
    toJSON Goals {..} =
      Core.object
        ( Core.catMaybes
            [ ("items" Core..=) Core.<$> items,
              ("itemsPerPage" Core..=) Core.<$> itemsPerPage,
              Core.Just ("kind" Core..= kind),
              ("nextLink" Core..=) Core.<$> nextLink,
              ("previousLink" Core..=) Core.<$> previousLink,
              ("startIndex" Core..=) Core.<$> startIndex,
              ("totalResults" Core..=) Core.<$> totalResults,
              ("username" Core..=) Core.<$> username
            ]
        )
  
  -- | JSON template for a hash Client Id request resource.
  --
  -- /See:/ 'newHashClientIdRequest' smart constructor.
  data HashClientIdRequest = HashClientIdRequest
    { clientId :: (Core.Maybe Core.Text),
      kind :: Core.Text,
      webPropertyId :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'HashClientIdRequest' with the minimum fields required to make a request.
  newHashClientIdRequest ::
    HashClientIdRequest
  newHashClientIdRequest =
    HashClientIdRequest
      { clientId = Core.Nothing,
        kind = "analytics#hashClientIdRequest",
        webPropertyId = Core.Nothing
      }
  
  instance Core.FromJSON HashClientIdRequest where
    parseJSON =
      Core.withObject
        "HashClientIdRequest"
        ( \o ->
            HashClientIdRequest
              Core.<$> (o Core..:? "clientId")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#hashClientIdRequest")
              Core.<*> (o Core..:? "webPropertyId")
        )
  
  instance Core.ToJSON HashClientIdRequest where
    toJSON HashClientIdRequest {..} =
      Core.object
        ( Core.catMaybes
            [ ("clientId" Core..=) Core.<$> clientId,
              Core.Just ("kind" Core..= kind),
              ("webPropertyId" Core..=) Core.<$> webPropertyId
            ]
        )
  
  -- | JSON template for a hash Client Id response resource.
  --
  -- /See:/ 'newHashClientIdResponse' smart constructor.
  data HashClientIdResponse = HashClientIdResponse
    { clientId :: (Core.Maybe Core.Text),
      hashedClientId :: (Core.Maybe Core.Text),
      kind :: Core.Text,
      webPropertyId :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'HashClientIdResponse' with the minimum fields required to make a request.
  newHashClientIdResponse ::
    HashClientIdResponse
  newHashClientIdResponse =
    HashClientIdResponse
      { clientId = Core.Nothing,
        hashedClientId = Core.Nothing,
        kind = "analytics#hashClientIdResponse",
        webPropertyId = Core.Nothing
      }
  
  instance Core.FromJSON HashClientIdResponse where
    parseJSON =
      Core.withObject
        "HashClientIdResponse"
        ( \o ->
            HashClientIdResponse
              Core.<$> (o Core..:? "clientId")
              Core.<*> (o Core..:? "hashedClientId")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#hashClientIdResponse")
              Core.<*> (o Core..:? "webPropertyId")
        )
  
  instance Core.ToJSON HashClientIdResponse where
    toJSON HashClientIdResponse {..} =
      Core.object
        ( Core.catMaybes
            [ ("clientId" Core..=) Core.<$> clientId,
              ("hashedClientId" Core..=) Core.<$> hashedClientId,
              Core.Just ("kind" Core..= kind),
              ("webPropertyId" Core..=) Core.<$> webPropertyId
            ]
        )
  
  -- | JSON template for an Analytics Remarketing Include Conditions.
  --
  -- /See:/ 'newIncludeConditions' smart constructor.
  data IncludeConditions = IncludeConditions
    { -- | The look-back window lets you specify a time frame for evaluating the behavior that qualifies users for your audience. For example, if your filters include users from Central Asia, and Transactions Greater than 2, and you set the look-back window to 14 days, then any user from Central Asia whose cumulative transactions exceed 2 during the last 14 days is added to the audience.
      daysToLookBack :: (Core.Maybe Core.Int32),
      -- | Boolean indicating whether this segment is a smart list. https:\/\/support.google.com\/analytics\/answer\/4628577
      isSmartList :: (Core.Maybe Core.Bool),
      -- | Resource type for include conditions.
      kind :: Core.Text,
      -- | Number of days (in the range 1 to 540) a user remains in the audience.
      membershipDurationDays :: (Core.Maybe Core.Int32),
      -- | The segment condition that will cause a user to be added to an audience.
      segment :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'IncludeConditions' with the minimum fields required to make a request.
  newIncludeConditions ::
    IncludeConditions
  newIncludeConditions =
    IncludeConditions
      { daysToLookBack = Core.Nothing,
        isSmartList = Core.Nothing,
        kind = "analytics#includeConditions",
        membershipDurationDays = Core.Nothing,
        segment = Core.Nothing
      }
  
  instance Core.FromJSON IncludeConditions where
    parseJSON =
      Core.withObject
        "IncludeConditions"
        ( \o ->
            IncludeConditions
              Core.<$> (o Core..:? "daysToLookBack")
              Core.<*> (o Core..:? "isSmartList")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#includeConditions")
              Core.<*> (o Core..:? "membershipDurationDays")
              Core.<*> (o Core..:? "segment")
        )
  
  instance Core.ToJSON IncludeConditions where
    toJSON IncludeConditions {..} =
      Core.object
        ( Core.catMaybes
            [ ("daysToLookBack" Core..=) Core.<$> daysToLookBack,
              ("isSmartList" Core..=) Core.<$> isSmartList,
              Core.Just ("kind" Core..= kind),
              ("membershipDurationDays" Core..=) Core.<$> membershipDurationDays,
              ("segment" Core..=) Core.<$> segment
            ]
        )
  
  -- | JSON template for an Analytics Remarketing Audience Foreign Link.
  --
  -- /See:/ 'newLinkedForeignAccount' smart constructor.
  data LinkedForeignAccount = LinkedForeignAccount
    { -- | Account ID to which this linked foreign account belongs.
      accountId :: (Core.Maybe Core.Text),
      -- | Boolean indicating whether this is eligible for search.
      eligibleForSearch :: (Core.Maybe Core.Bool),
      -- | Entity ad account link ID.
      id :: (Core.Maybe Core.Text),
      -- | Internal ID for the web property to which this linked foreign account belongs.
      internalWebPropertyId :: (Core.Maybe Core.Text),
      -- | Resource type for linked foreign account.
      kind :: Core.Text,
      -- | The foreign account ID. For example the an Google Ads @linkedAccountId@ has the following format XXX-XXX-XXXX.
      linkedAccountId :: (Core.Maybe Core.Text),
      -- | Remarketing audience ID to which this linked foreign account belongs.
      remarketingAudienceId :: (Core.Maybe Core.Text),
      -- | The status of this foreign account link.
      status :: (Core.Maybe Core.Text),
      -- | The type of the foreign account. For example, @ADWORDS_LINKS@, @DBM_LINKS@, @MCC_LINKS@ or @OPTIMIZE@.
      type' :: (Core.Maybe Core.Text),
      -- | Web property ID of the form UA-XXXXX-YY to which this linked foreign account belongs.
      webPropertyId :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'LinkedForeignAccount' with the minimum fields required to make a request.
  newLinkedForeignAccount ::
    LinkedForeignAccount
  newLinkedForeignAccount =
    LinkedForeignAccount
      { accountId = Core.Nothing,
        eligibleForSearch = Core.Nothing,
        id = Core.Nothing,
        internalWebPropertyId = Core.Nothing,
        kind = "analytics#linkedForeignAccount",
        linkedAccountId = Core.Nothing,
        remarketingAudienceId = Core.Nothing,
        status = Core.Nothing,
        type' = Core.Nothing,
        webPropertyId = Core.Nothing
      }
  
  instance Core.FromJSON LinkedForeignAccount where
    parseJSON =
      Core.withObject
        "LinkedForeignAccount"
        ( \o ->
            LinkedForeignAccount
              Core.<$> (o Core..:? "accountId")
              Core.<*> (o Core..:? "eligibleForSearch")
              Core.<*> (o Core..:? "id")
              Core.<*> (o Core..:? "internalWebPropertyId")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#linkedForeignAccount")
              Core.<*> (o Core..:? "linkedAccountId")
              Core.<*> (o Core..:? "remarketingAudienceId")
              Core.<*> (o Core..:? "status")
              Core.<*> (o Core..:? "type")
              Core.<*> (o Core..:? "webPropertyId")
        )
  
  instance Core.ToJSON LinkedForeignAccount where
    toJSON LinkedForeignAccount {..} =
      Core.object
        ( Core.catMaybes
            [ ("accountId" Core..=) Core.<$> accountId,
              ("eligibleForSearch" Core..=) Core.<$> eligibleForSearch,
              ("id" Core..=) Core.<$> id,
              ("internalWebPropertyId" Core..=) Core.<$> internalWebPropertyId,
              Core.Just ("kind" Core..= kind),
              ("linkedAccountId" Core..=) Core.<$> linkedAccountId,
              ("remarketingAudienceId" Core..=) Core.<$> remarketingAudienceId,
              ("status" Core..=) Core.<$> status,
              ("type" Core..=) Core.<$> type',
              ("webPropertyId" Core..=) Core.<$> webPropertyId
            ]
        )
  
  -- | Multi-Channel Funnels data for a given view (profile).
  --
  -- /See:/ 'newMcfData' smart constructor.
  data McfData = McfData
    { -- | Column headers that list dimension names followed by the metric names. The order of dimensions and metrics is same as specified in the request.
      columnHeaders :: (Core.Maybe [McfData_ColumnHeadersItem]),
      -- | Determines if the Analytics data contains sampled data.
      containsSampledData :: (Core.Maybe Core.Bool),
      -- | Unique ID for this data response.
      id :: (Core.Maybe Core.Text),
      -- | The maximum number of rows the response can contain, regardless of the actual number of rows returned. Its value ranges from 1 to 10,000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.
      itemsPerPage :: (Core.Maybe Core.Int32),
      -- | Resource type.
      kind :: Core.Text,
      -- | Link to next page for this Analytics data query.
      nextLink :: (Core.Maybe Core.Text),
      -- | Link to previous page for this Analytics data query.
      previousLink :: (Core.Maybe Core.Text),
      -- | Information for the view (profile), for which the Analytics data was requested.
      profileInfo :: (Core.Maybe McfData_ProfileInfo),
      -- | Analytics data request query parameters.
      query :: (Core.Maybe McfData_Query),
      -- | Analytics data rows, where each row contains a list of dimension values followed by the metric values. The order of dimensions and metrics is same as specified in the request.
      rows :: (Core.Maybe [[McfData_RowsItemItem]]),
      -- | The number of samples used to calculate the result.
      sampleSize :: (Core.Maybe Core.Int64),
      -- | Total size of the sample space from which the samples were selected.
      sampleSpace :: (Core.Maybe Core.Int64),
      -- | Link to this page.
      selfLink :: (Core.Maybe Core.Text),
      -- | The total number of rows for the query, regardless of the number of rows in the response.
      totalResults :: (Core.Maybe Core.Int32),
      -- | Total values for the requested metrics over all the results, not just the results returned in this response. The order of the metric totals is same as the metric order specified in the request.
      totalsForAllResults :: (Core.Maybe McfData_TotalsForAllResults)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'McfData' with the minimum fields required to make a request.
  newMcfData ::
    McfData
  newMcfData =
    McfData
      { columnHeaders = Core.Nothing,
        containsSampledData = Core.Nothing,
        id = Core.Nothing,
        itemsPerPage = Core.Nothing,
        kind = "analytics#mcfData",
        nextLink = Core.Nothing,
        previousLink = Core.Nothing,
        profileInfo = Core.Nothing,
        query = Core.Nothing,
        rows = Core.Nothing,
        sampleSize = Core.Nothing,
        sampleSpace = Core.Nothing,
        selfLink = Core.Nothing,
        totalResults = Core.Nothing,
        totalsForAllResults = Core.Nothing
      }
  
  instance Core.FromJSON McfData where
    parseJSON =
      Core.withObject
        "McfData"
        ( \o ->
            McfData
              Core.<$> (o Core..:? "columnHeaders")
              Core.<*> (o Core..:? "containsSampledData")
              Core.<*> (o Core..:? "id")
              Core.<*> (o Core..:? "itemsPerPage")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#mcfData")
              Core.<*> (o Core..:? "nextLink")
              Core.<*> (o Core..:? "previousLink")
              Core.<*> (o Core..:? "profileInfo")
              Core.<*> (o Core..:? "query")
              Core.<*> (o Core..:? "rows")
              Core.<*> (o Core..:? "sampleSize" Core.<&> Core.fmap Core.fromAsText)
              Core.<*> (o Core..:? "sampleSpace" Core.<&> Core.fmap Core.fromAsText)
              Core.<*> (o Core..:? "selfLink")
              Core.<*> (o Core..:? "totalResults")
              Core.<*> (o Core..:? "totalsForAllResults")
        )
  
  instance Core.ToJSON McfData where
    toJSON McfData {..} =
      Core.object
        ( Core.catMaybes
            [ ("columnHeaders" Core..=) Core.<$> columnHeaders,
              ("containsSampledData" Core..=) Core.<$> containsSampledData,
              ("id" Core..=) Core.<$> id,
              ("itemsPerPage" Core..=) Core.<$> itemsPerPage,
              Core.Just ("kind" Core..= kind),
              ("nextLink" Core..=) Core.<$> nextLink,
              ("previousLink" Core..=) Core.<$> previousLink,
              ("profileInfo" Core..=) Core.<$> profileInfo,
              ("query" Core..=) Core.<$> query,
              ("rows" Core..=) Core.<$> rows,
              ("sampleSize" Core..=) Core.. Core.AsText Core.<$> sampleSize,
              ("sampleSpace" Core..=) Core.. Core.AsText Core.<$> sampleSpace,
              ("selfLink" Core..=) Core.<$> selfLink,
              ("totalResults" Core..=) Core.<$> totalResults,
              ("totalsForAllResults" Core..=) Core.<$> totalsForAllResults
            ]
        )
  
  --
  -- /See:/ 'newMcfData_ColumnHeadersItem' smart constructor.
  data McfData_ColumnHeadersItem = McfData_ColumnHeadersItem
    { -- | Column Type. Either DIMENSION or METRIC.
      columnType :: (Core.Maybe Core.Text),
      -- | Data type. Dimension and metric values data types such as INTEGER, DOUBLE, CURRENCY, MCF_SEQUENCE etc.
      dataType :: (Core.Maybe Core.Text),
      -- | Column name.
      name :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'McfData_ColumnHeadersItem' with the minimum fields required to make a request.
  newMcfData_ColumnHeadersItem ::
    McfData_ColumnHeadersItem
  newMcfData_ColumnHeadersItem =
    McfData_ColumnHeadersItem
      { columnType = Core.Nothing,
        dataType = Core.Nothing,
        name = Core.Nothing
      }
  
  instance Core.FromJSON McfData_ColumnHeadersItem where
    parseJSON =
      Core.withObject
        "McfData_ColumnHeadersItem"
        ( \o ->
            McfData_ColumnHeadersItem
              Core.<$> (o Core..:? "columnType")
              Core.<*> (o Core..:? "dataType")
              Core.<*> (o Core..:? "name")
        )
  
  instance Core.ToJSON McfData_ColumnHeadersItem where
    toJSON McfData_ColumnHeadersItem {..} =
      Core.object
        ( Core.catMaybes
            [ ("columnType" Core..=) Core.<$> columnType,
              ("dataType" Core..=) Core.<$> dataType,
              ("name" Core..=) Core.<$> name
            ]
        )
  
  -- | Information for the view (profile), for which the Analytics data was requested.
  --
  -- /See:/ 'newMcfData_ProfileInfo' smart constructor.
  data McfData_ProfileInfo = McfData_ProfileInfo
    { -- | Account ID to which this view (profile) belongs.
      accountId :: (Core.Maybe Core.Text),
      -- | Internal ID for the web property to which this view (profile) belongs.
      internalWebPropertyId :: (Core.Maybe Core.Text),
      -- | View (Profile) ID.
      profileId :: (Core.Maybe Core.Text),
      -- | View (Profile) name.
      profileName :: (Core.Maybe Core.Text),
      -- | Table ID for view (profile).
      tableId :: (Core.Maybe Core.Text),
      -- | Web Property ID to which this view (profile) belongs.
      webPropertyId :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'McfData_ProfileInfo' with the minimum fields required to make a request.
  newMcfData_ProfileInfo ::
    McfData_ProfileInfo
  newMcfData_ProfileInfo =
    McfData_ProfileInfo
      { accountId = Core.Nothing,
        internalWebPropertyId = Core.Nothing,
        profileId = Core.Nothing,
        profileName = Core.Nothing,
        tableId = Core.Nothing,
        webPropertyId = Core.Nothing
      }
  
  instance Core.FromJSON McfData_ProfileInfo where
    parseJSON =
      Core.withObject
        "McfData_ProfileInfo"
        ( \o ->
            McfData_ProfileInfo
              Core.<$> (o Core..:? "accountId")
              Core.<*> (o Core..:? "internalWebPropertyId")
              Core.<*> (o Core..:? "profileId")
              Core.<*> (o Core..:? "profileName")
              Core.<*> (o Core..:? "tableId")
              Core.<*> (o Core..:? "webPropertyId")
        )
  
  instance Core.ToJSON McfData_ProfileInfo where
    toJSON McfData_ProfileInfo {..} =
      Core.object
        ( Core.catMaybes
            [ ("accountId" Core..=) Core.<$> accountId,
              ("internalWebPropertyId" Core..=) Core.<$> internalWebPropertyId,
              ("profileId" Core..=) Core.<$> profileId,
              ("profileName" Core..=) Core.<$> profileName,
              ("tableId" Core..=) Core.<$> tableId,
              ("webPropertyId" Core..=) Core.<$> webPropertyId
            ]
        )
  
  -- | Analytics data request query parameters.
  --
  -- /See:/ 'newMcfData_Query' smart constructor.
  data McfData_Query = McfData_Query
    { -- | List of analytics dimensions.
      dimensions :: (Core.Maybe Core.Text),
      -- | End date.
      endDate :: (Core.Maybe Core.Text),
      -- | Comma-separated list of dimension or metric filters.
      filters :: (Core.Maybe Core.Text),
      -- | Unique table ID.
      ids :: (Core.Maybe Core.Text),
      -- | Maximum results per page.
      maxResults :: (Core.Maybe Core.Int32),
      -- | List of analytics metrics.
      metrics :: (Core.Maybe [Core.Text]),
      -- | Desired sampling level
      samplingLevel :: (Core.Maybe Core.Text),
      -- | Analytics advanced segment.
      segment :: (Core.Maybe Core.Text),
      -- | List of dimensions or metrics based on which Analytics data is sorted.
      sort :: (Core.Maybe [Core.Text]),
      -- | Start date.
      startDate :: (Core.Maybe Core.Text),
      -- | Start index.
      startIndex :: (Core.Maybe Core.Int32)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'McfData_Query' with the minimum fields required to make a request.
  newMcfData_Query ::
    McfData_Query
  newMcfData_Query =
    McfData_Query
      { dimensions = Core.Nothing,
        endDate = Core.Nothing,
        filters = Core.Nothing,
        ids = Core.Nothing,
        maxResults = Core.Nothing,
        metrics = Core.Nothing,
        samplingLevel = Core.Nothing,
        segment = Core.Nothing,
        sort = Core.Nothing,
        startDate = Core.Nothing,
        startIndex = Core.Nothing
      }
  
  instance Core.FromJSON McfData_Query where
    parseJSON =
      Core.withObject
        "McfData_Query"
        ( \o ->
            McfData_Query
              Core.<$> (o Core..:? "dimensions")
              Core.<*> (o Core..:? "end-date")
              Core.<*> (o Core..:? "filters")
              Core.<*> (o Core..:? "ids")
              Core.<*> (o Core..:? "max-results")
              Core.<*> (o Core..:? "metrics")
              Core.<*> (o Core..:? "samplingLevel")
              Core.<*> (o Core..:? "segment")
              Core.<*> (o Core..:? "sort")
              Core.<*> (o Core..:? "start-date")
              Core.<*> (o Core..:? "start-index")
        )
  
  instance Core.ToJSON McfData_Query where
    toJSON McfData_Query {..} =
      Core.object
        ( Core.catMaybes
            [ ("dimensions" Core..=) Core.<$> dimensions,
              ("end-date" Core..=) Core.<$> endDate,
              ("filters" Core..=) Core.<$> filters,
              ("ids" Core..=) Core.<$> ids,
              ("max-results" Core..=) Core.<$> maxResults,
              ("metrics" Core..=) Core.<$> metrics,
              ("samplingLevel" Core..=) Core.<$> samplingLevel,
              ("segment" Core..=) Core.<$> segment,
              ("sort" Core..=) Core.<$> sort,
              ("start-date" Core..=) Core.<$> startDate,
              ("start-index" Core..=) Core.<$> startIndex
            ]
        )
  
  -- | A union object representing a dimension or metric value. Only one of \"primitiveValue\" or \"conversionPathValue\" attribute will be populated.
  --
  -- /See:/ 'newMcfData_RowsItemItem' smart constructor.
  data McfData_RowsItemItem = McfData_RowsItemItem
    { -- | A conversion path dimension value, containing a list of interactions with their attributes.
      conversionPathValue :: (Core.Maybe [McfData_RowsItemItem_ConversionPathValueItem]),
      -- | A primitive dimension value. A primitive metric value.
      primitiveValue :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'McfData_RowsItemItem' with the minimum fields required to make a request.
  newMcfData_RowsItemItem ::
    McfData_RowsItemItem
  newMcfData_RowsItemItem =
    McfData_RowsItemItem
      { conversionPathValue = Core.Nothing,
        primitiveValue = Core.Nothing
      }
  
  instance Core.FromJSON McfData_RowsItemItem where
    parseJSON =
      Core.withObject
        "McfData_RowsItemItem"
        ( \o ->
            McfData_RowsItemItem
              Core.<$> (o Core..:? "conversionPathValue")
              Core.<*> (o Core..:? "primitiveValue")
        )
  
  instance Core.ToJSON McfData_RowsItemItem where
    toJSON McfData_RowsItemItem {..} =
      Core.object
        ( Core.catMaybes
            [ ("conversionPathValue" Core..=) Core.<$> conversionPathValue,
              ("primitiveValue" Core..=) Core.<$> primitiveValue
            ]
        )
  
  --
  -- /See:/ 'newMcfData_RowsItemItem_ConversionPathValueItem' smart constructor.
  data McfData_RowsItemItem_ConversionPathValueItem = McfData_RowsItemItem_ConversionPathValueItem
    { -- | Type of an interaction on conversion path. Such as CLICK, IMPRESSION etc.
      interactionType :: (Core.Maybe Core.Text),
      -- | Node value of an interaction on conversion path. Such as source, medium etc.
      nodeValue :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'McfData_RowsItemItem_ConversionPathValueItem' with the minimum fields required to make a request.
  newMcfData_RowsItemItem_ConversionPathValueItem ::
    McfData_RowsItemItem_ConversionPathValueItem
  newMcfData_RowsItemItem_ConversionPathValueItem =
    McfData_RowsItemItem_ConversionPathValueItem
      { interactionType =
          Core.Nothing,
        nodeValue = Core.Nothing
      }
  
  instance Core.FromJSON McfData_RowsItemItem_ConversionPathValueItem where
    parseJSON =
      Core.withObject
        "McfData_RowsItemItem_ConversionPathValueItem"
        ( \o ->
            McfData_RowsItemItem_ConversionPathValueItem
              Core.<$> (o Core..:? "interactionType")
              Core.<*> (o Core..:? "nodeValue")
        )
  
  instance Core.ToJSON McfData_RowsItemItem_ConversionPathValueItem where
    toJSON McfData_RowsItemItem_ConversionPathValueItem {..} =
      Core.object
        ( Core.catMaybes
            [ ("interactionType" Core..=) Core.<$> interactionType,
              ("nodeValue" Core..=) Core.<$> nodeValue
            ]
        )
  
  -- | Total values for the requested metrics over all the results, not just the results returned in this response. The order of the metric totals is same as the metric order specified in the request.
  --
  -- /See:/ 'newMcfData_TotalsForAllResults' smart constructor.
  newtype McfData_TotalsForAllResults = McfData_TotalsForAllResults
    { -- | Key-value pair for the total value of a metric. Key is the metric name and the value is the total value for that metric.
      additional :: (Core.HashMap Core.Text Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'McfData_TotalsForAllResults' with the minimum fields required to make a request.
  newMcfData_TotalsForAllResults ::
    -- |  Key-value pair for the total value of a metric. Key is the metric name and the value is the total value for that metric. See 'additional'.
    Core.HashMap Core.Text Core.Text ->
    McfData_TotalsForAllResults
  newMcfData_TotalsForAllResults additional =
    McfData_TotalsForAllResults {additional = additional}
  
  instance Core.FromJSON McfData_TotalsForAllResults where
    parseJSON =
      Core.withObject
        "McfData_TotalsForAllResults"
        ( \o ->
            McfData_TotalsForAllResults Core.<$> (Core.parseJSONObject o)
        )
  
  instance Core.ToJSON McfData_TotalsForAllResults where
    toJSON McfData_TotalsForAllResults {..} = Core.toJSON additional
  
  -- | JSON template for an Analytics view (profile).
  --
  -- /See:/ 'newProfile' smart constructor.
  data Profile = Profile
    { -- | Account ID to which this view (profile) belongs.
      accountId :: (Core.Maybe Core.Text),
      -- | Indicates whether bot filtering is enabled for this view (profile).
      botFilteringEnabled :: (Core.Maybe Core.Bool),
      -- | Child link for this view (profile). Points to the list of goals for this view (profile).
      childLink :: (Core.Maybe Profile_ChildLink),
      -- | Time this view (profile) was created.
      created :: (Core.Maybe Core.DateTime),
      -- | The currency type associated with this view (profile), defaults to USD. The supported values are: USD, JPY, EUR, GBP, AUD, KRW, BRL, CNY, DKK, RUB, SEK, NOK, PLN, TRY, TWD, HKD, THB, IDR, ARS, MXN, VND, PHP, INR, CHF, CAD, CZK, NZD, HUF, BGN, LTL, ZAR, UAH, AED, BOB, CLP, COP, EGP, HRK, ILS, MAD, MYR, PEN, PKR, RON, RSD, SAR, SGD, VEF, LVL
      currency :: (Core.Maybe Core.Text),
      -- | Default page for this view (profile).
      defaultPage :: (Core.Maybe Core.Text),
      -- | Indicates whether ecommerce tracking is enabled for this view (profile).
      eCommerceTracking :: (Core.Maybe Core.Bool),
      -- | Indicates whether enhanced ecommerce tracking is enabled for this view (profile). This property can only be enabled if ecommerce tracking is enabled.
      enhancedECommerceTracking :: (Core.Maybe Core.Bool),
      -- | The query parameters that are excluded from this view (profile).
      excludeQueryParameters :: (Core.Maybe Core.Text),
      -- | View (Profile) ID.
      id :: (Core.Maybe Core.Text),
      -- | Internal ID for the web property to which this view (profile) belongs.
      internalWebPropertyId :: (Core.Maybe Core.Text),
      -- | Resource type for Analytics view (profile).
      kind :: Core.Text,
      -- | Name of this view (profile).
      name :: (Core.Maybe Core.Text),
      -- | Parent link for this view (profile). Points to the web property to which this view (profile) belongs.
      parentLink :: (Core.Maybe Profile_ParentLink),
      -- | Permissions the user has for this view (profile).
      permissions :: (Core.Maybe Profile_Permissions),
      -- | Link for this view (profile).
      selfLink :: (Core.Maybe Core.Text),
      -- | Site search category parameters for this view (profile).
      siteSearchCategoryParameters :: (Core.Maybe Core.Text),
      -- | The site search query parameters for this view (profile).
      siteSearchQueryParameters :: (Core.Maybe Core.Text),
      -- | Indicates whether this view (profile) is starred or not.
      starred :: (Core.Maybe Core.Bool),
      -- | Whether or not Analytics will strip search category parameters from the URLs in your reports.
      stripSiteSearchCategoryParameters :: (Core.Maybe Core.Bool),
      -- | Whether or not Analytics will strip search query parameters from the URLs in your reports.
      stripSiteSearchQueryParameters :: (Core.Maybe Core.Bool),
      -- | Time zone for which this view (profile) has been configured. Time zones are identified by strings from the TZ database.
      timezone :: (Core.Maybe Core.Text),
      -- | View (Profile) type. Supported types: WEB or APP.
      type' :: (Core.Maybe Core.Text),
      -- | Time this view (profile) was last modified.
      updated :: (Core.Maybe Core.DateTime),
      -- | Web property ID of the form UA-XXXXX-YY to which this view (profile) belongs.
      webPropertyId :: (Core.Maybe Core.Text),
      -- | Website URL for this view (profile).
      websiteUrl :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Profile' with the minimum fields required to make a request.
  newProfile ::
    Profile
  newProfile =
    Profile
      { accountId = Core.Nothing,
        botFilteringEnabled = Core.Nothing,
        childLink = Core.Nothing,
        created = Core.Nothing,
        currency = Core.Nothing,
        defaultPage = Core.Nothing,
        eCommerceTracking = Core.Nothing,
        enhancedECommerceTracking = Core.Nothing,
        excludeQueryParameters = Core.Nothing,
        id = Core.Nothing,
        internalWebPropertyId = Core.Nothing,
        kind = "analytics#profile",
        name = Core.Nothing,
        parentLink = Core.Nothing,
        permissions = Core.Nothing,
        selfLink = Core.Nothing,
        siteSearchCategoryParameters = Core.Nothing,
        siteSearchQueryParameters = Core.Nothing,
        starred = Core.Nothing,
        stripSiteSearchCategoryParameters = Core.Nothing,
        stripSiteSearchQueryParameters = Core.Nothing,
        timezone = Core.Nothing,
        type' = Core.Nothing,
        updated = Core.Nothing,
        webPropertyId = Core.Nothing,
        websiteUrl = Core.Nothing
      }
  
  instance Core.FromJSON Profile where
    parseJSON =
      Core.withObject
        "Profile"
        ( \o ->
            Profile
              Core.<$> (o Core..:? "accountId")
              Core.<*> (o Core..:? "botFilteringEnabled")
              Core.<*> (o Core..:? "childLink")
              Core.<*> (o Core..:? "created")
              Core.<*> (o Core..:? "currency")
              Core.<*> (o Core..:? "defaultPage")
              Core.<*> (o Core..:? "eCommerceTracking")
              Core.<*> (o Core..:? "enhancedECommerceTracking")
              Core.<*> (o Core..:? "excludeQueryParameters")
              Core.<*> (o Core..:? "id")
              Core.<*> (o Core..:? "internalWebPropertyId")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#profile")
              Core.<*> (o Core..:? "name")
              Core.<*> (o Core..:? "parentLink")
              Core.<*> (o Core..:? "permissions")
              Core.<*> (o Core..:? "selfLink")
              Core.<*> (o Core..:? "siteSearchCategoryParameters")
              Core.<*> (o Core..:? "siteSearchQueryParameters")
              Core.<*> (o Core..:? "starred")
              Core.<*> (o Core..:? "stripSiteSearchCategoryParameters")
              Core.<*> (o Core..:? "stripSiteSearchQueryParameters")
              Core.<*> (o Core..:? "timezone")
              Core.<*> (o Core..:? "type")
              Core.<*> (o Core..:? "updated")
              Core.<*> (o Core..:? "webPropertyId")
              Core.<*> (o Core..:? "websiteUrl")
        )
  
  instance Core.ToJSON Profile where
    toJSON Profile {..} =
      Core.object
        ( Core.catMaybes
            [ ("accountId" Core..=) Core.<$> accountId,
              ("botFilteringEnabled" Core..=) Core.<$> botFilteringEnabled,
              ("childLink" Core..=) Core.<$> childLink,
              ("created" Core..=) Core.<$> created,
              ("currency" Core..=) Core.<$> currency,
              ("defaultPage" Core..=) Core.<$> defaultPage,
              ("eCommerceTracking" Core..=) Core.<$> eCommerceTracking,
              ("enhancedECommerceTracking" Core..=)
                Core.<$> enhancedECommerceTracking,
              ("excludeQueryParameters" Core..=) Core.<$> excludeQueryParameters,
              ("id" Core..=) Core.<$> id,
              ("internalWebPropertyId" Core..=) Core.<$> internalWebPropertyId,
              Core.Just ("kind" Core..= kind),
              ("name" Core..=) Core.<$> name,
              ("parentLink" Core..=) Core.<$> parentLink,
              ("permissions" Core..=) Core.<$> permissions,
              ("selfLink" Core..=) Core.<$> selfLink,
              ("siteSearchCategoryParameters" Core..=)
                Core.<$> siteSearchCategoryParameters,
              ("siteSearchQueryParameters" Core..=)
                Core.<$> siteSearchQueryParameters,
              ("starred" Core..=) Core.<$> starred,
              ("stripSiteSearchCategoryParameters" Core..=)
                Core.<$> stripSiteSearchCategoryParameters,
              ("stripSiteSearchQueryParameters" Core..=)
                Core.<$> stripSiteSearchQueryParameters,
              ("timezone" Core..=) Core.<$> timezone,
              ("type" Core..=) Core.<$> type',
              ("updated" Core..=) Core.<$> updated,
              ("webPropertyId" Core..=) Core.<$> webPropertyId,
              ("websiteUrl" Core..=) Core.<$> websiteUrl
            ]
        )
  
  -- | Child link for this view (profile). Points to the list of goals for this view (profile).
  --
  -- /See:/ 'newProfile_ChildLink' smart constructor.
  data Profile_ChildLink = Profile_ChildLink
    { -- | Link to the list of goals for this view (profile).
      href :: (Core.Maybe Core.Text),
      -- | Value is \"analytics#goals\".
      type' :: Core.Text
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Profile_ChildLink' with the minimum fields required to make a request.
  newProfile_ChildLink ::
    Profile_ChildLink
  newProfile_ChildLink =
    Profile_ChildLink {href = Core.Nothing, type' = "analytics#goals"}
  
  instance Core.FromJSON Profile_ChildLink where
    parseJSON =
      Core.withObject
        "Profile_ChildLink"
        ( \o ->
            Profile_ChildLink
              Core.<$> (o Core..:? "href")
              Core.<*> (o Core..:? "type" Core..!= "analytics#goals")
        )
  
  instance Core.ToJSON Profile_ChildLink where
    toJSON Profile_ChildLink {..} =
      Core.object
        ( Core.catMaybes
            [("href" Core..=) Core.<$> href, Core.Just ("type" Core..= type')]
        )
  
  -- | Parent link for this view (profile). Points to the web property to which this view (profile) belongs.
  --
  -- /See:/ 'newProfile_ParentLink' smart constructor.
  data Profile_ParentLink = Profile_ParentLink
    { -- | Link to the web property to which this view (profile) belongs.
      href :: (Core.Maybe Core.Text),
      -- | Value is \"analytics#webproperty\".
      type' :: Core.Text
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Profile_ParentLink' with the minimum fields required to make a request.
  newProfile_ParentLink ::
    Profile_ParentLink
  newProfile_ParentLink =
    Profile_ParentLink
      { href = Core.Nothing,
        type' = "analytics#webproperty"
      }
  
  instance Core.FromJSON Profile_ParentLink where
    parseJSON =
      Core.withObject
        "Profile_ParentLink"
        ( \o ->
            Profile_ParentLink
              Core.<$> (o Core..:? "href")
              Core.<*> (o Core..:? "type" Core..!= "analytics#webproperty")
        )
  
  instance Core.ToJSON Profile_ParentLink where
    toJSON Profile_ParentLink {..} =
      Core.object
        ( Core.catMaybes
            [("href" Core..=) Core.<$> href, Core.Just ("type" Core..= type')]
        )
  
  -- | Permissions the user has for this view (profile).
  --
  -- /See:/ 'newProfile_Permissions' smart constructor.
  newtype Profile_Permissions = Profile_Permissions
    { -- | All the permissions that the user has for this view (profile). These include any implied permissions (e.g., EDIT implies VIEW) or inherited permissions from the parent web property.
      effective :: (Core.Maybe [Core.Text])
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Profile_Permissions' with the minimum fields required to make a request.
  newProfile_Permissions ::
    Profile_Permissions
  newProfile_Permissions =
    Profile_Permissions {effective = Core.Nothing}
  
  instance Core.FromJSON Profile_Permissions where
    parseJSON =
      Core.withObject
        "Profile_Permissions"
        (\o -> Profile_Permissions Core.<$> (o Core..:? "effective"))
  
  instance Core.ToJSON Profile_Permissions where
    toJSON Profile_Permissions {..} =
      Core.object
        (Core.catMaybes [("effective" Core..=) Core.<$> effective])
  
  -- | JSON template for an Analytics profile filter link.
  --
  -- /See:/ 'newProfileFilterLink' smart constructor.
  data ProfileFilterLink = ProfileFilterLink
    { -- | Filter for this link.
      filterRef :: (Core.Maybe FilterRef),
      -- | Profile filter link ID.
      id :: (Core.Maybe Core.Text),
      -- | Resource type for Analytics filter.
      kind :: Core.Text,
      -- | View (Profile) for this link.
      profileRef :: (Core.Maybe ProfileRef),
      -- | The rank of this profile filter link relative to the other filters linked to the same profile. For readonly (i.e., list and get) operations, the rank always starts at 1. For write (i.e., create, update, or delete) operations, you may specify a value between 0 and 255 inclusively, [0, 255]. In order to insert a link at the end of the list, either don\'t specify a rank or set a rank to a number greater than the largest rank in the list. In order to insert a link to the beginning of the list specify a rank that is less than or equal to 1. The new link will move all existing filters with the same or lower rank down the list. After the link is inserted\/updated\/deleted all profile filter links will be renumbered starting at 1.
      rank :: (Core.Maybe Core.Int32),
      -- | Link for this profile filter link.
      selfLink :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'ProfileFilterLink' with the minimum fields required to make a request.
  newProfileFilterLink ::
    ProfileFilterLink
  newProfileFilterLink =
    ProfileFilterLink
      { filterRef = Core.Nothing,
        id = Core.Nothing,
        kind = "analytics#profileFilterLink",
        profileRef = Core.Nothing,
        rank = Core.Nothing,
        selfLink = Core.Nothing
      }
  
  instance Core.FromJSON ProfileFilterLink where
    parseJSON =
      Core.withObject
        "ProfileFilterLink"
        ( \o ->
            ProfileFilterLink
              Core.<$> (o Core..:? "filterRef")
              Core.<*> (o Core..:? "id")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#profileFilterLink")
              Core.<*> (o Core..:? "profileRef")
              Core.<*> (o Core..:? "rank")
              Core.<*> (o Core..:? "selfLink")
        )
  
  instance Core.ToJSON ProfileFilterLink where
    toJSON ProfileFilterLink {..} =
      Core.object
        ( Core.catMaybes
            [ ("filterRef" Core..=) Core.<$> filterRef,
              ("id" Core..=) Core.<$> id,
              Core.Just ("kind" Core..= kind),
              ("profileRef" Core..=) Core.<$> profileRef,
              ("rank" Core..=) Core.<$> rank,
              ("selfLink" Core..=) Core.<$> selfLink
            ]
        )
  
  -- | A profile filter link collection lists profile filter links between profiles and filters. Each resource in the collection corresponds to a profile filter link.
  --
  -- /See:/ 'newProfileFilterLinks' smart constructor.
  data ProfileFilterLinks = ProfileFilterLinks
    { -- | A list of profile filter links.
      items :: (Core.Maybe [ProfileFilterLink]),
      -- | The maximum number of resources the response can contain, regardless of the actual number of resources returned. Its value ranges from 1 to 1,000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.
      itemsPerPage :: (Core.Maybe Core.Int32),
      -- | Collection type.
      kind :: Core.Text,
      -- | Link to next page for this profile filter link collection.
      nextLink :: (Core.Maybe Core.Text),
      -- | Link to previous page for this profile filter link collection.
      previousLink :: (Core.Maybe Core.Text),
      -- | The starting index of the resources, which is 1 by default or otherwise specified by the start-index query parameter.
      startIndex :: (Core.Maybe Core.Int32),
      -- | The total number of results for the query, regardless of the number of results in the response.
      totalResults :: (Core.Maybe Core.Int32),
      -- | Email ID of the authenticated user
      username :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'ProfileFilterLinks' with the minimum fields required to make a request.
  newProfileFilterLinks ::
    ProfileFilterLinks
  newProfileFilterLinks =
    ProfileFilterLinks
      { items = Core.Nothing,
        itemsPerPage = Core.Nothing,
        kind = "analytics#profileFilterLinks",
        nextLink = Core.Nothing,
        previousLink = Core.Nothing,
        startIndex = Core.Nothing,
        totalResults = Core.Nothing,
        username = Core.Nothing
      }
  
  instance Core.FromJSON ProfileFilterLinks where
    parseJSON =
      Core.withObject
        "ProfileFilterLinks"
        ( \o ->
            ProfileFilterLinks
              Core.<$> (o Core..:? "items")
              Core.<*> (o Core..:? "itemsPerPage")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#profileFilterLinks")
              Core.<*> (o Core..:? "nextLink")
              Core.<*> (o Core..:? "previousLink")
              Core.<*> (o Core..:? "startIndex")
              Core.<*> (o Core..:? "totalResults")
              Core.<*> (o Core..:? "username")
        )
  
  instance Core.ToJSON ProfileFilterLinks where
    toJSON ProfileFilterLinks {..} =
      Core.object
        ( Core.catMaybes
            [ ("items" Core..=) Core.<$> items,
              ("itemsPerPage" Core..=) Core.<$> itemsPerPage,
              Core.Just ("kind" Core..= kind),
              ("nextLink" Core..=) Core.<$> nextLink,
              ("previousLink" Core..=) Core.<$> previousLink,
              ("startIndex" Core..=) Core.<$> startIndex,
              ("totalResults" Core..=) Core.<$> totalResults,
              ("username" Core..=) Core.<$> username
            ]
        )
  
  -- | JSON template for a linked view (profile).
  --
  -- /See:/ 'newProfileRef' smart constructor.
  data ProfileRef = ProfileRef
    { -- | Account ID to which this view (profile) belongs.
      accountId :: (Core.Maybe Core.Text),
      -- | Link for this view (profile).
      href :: (Core.Maybe Core.Text),
      -- | View (Profile) ID.
      id :: (Core.Maybe Core.Text),
      -- | Internal ID for the web property to which this view (profile) belongs.
      internalWebPropertyId :: (Core.Maybe Core.Text),
      -- | Analytics view (profile) reference.
      kind :: Core.Text,
      -- | Name of this view (profile).
      name :: (Core.Maybe Core.Text),
      -- | Web property ID of the form UA-XXXXX-YY to which this view (profile) belongs.
      webPropertyId :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'ProfileRef' with the minimum fields required to make a request.
  newProfileRef ::
    ProfileRef
  newProfileRef =
    ProfileRef
      { accountId = Core.Nothing,
        href = Core.Nothing,
        id = Core.Nothing,
        internalWebPropertyId = Core.Nothing,
        kind = "analytics#profileRef",
        name = Core.Nothing,
        webPropertyId = Core.Nothing
      }
  
  instance Core.FromJSON ProfileRef where
    parseJSON =
      Core.withObject
        "ProfileRef"
        ( \o ->
            ProfileRef
              Core.<$> (o Core..:? "accountId")
              Core.<*> (o Core..:? "href")
              Core.<*> (o Core..:? "id")
              Core.<*> (o Core..:? "internalWebPropertyId")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#profileRef")
              Core.<*> (o Core..:? "name")
              Core.<*> (o Core..:? "webPropertyId")
        )
  
  instance Core.ToJSON ProfileRef where
    toJSON ProfileRef {..} =
      Core.object
        ( Core.catMaybes
            [ ("accountId" Core..=) Core.<$> accountId,
              ("href" Core..=) Core.<$> href,
              ("id" Core..=) Core.<$> id,
              ("internalWebPropertyId" Core..=) Core.<$> internalWebPropertyId,
              Core.Just ("kind" Core..= kind),
              ("name" Core..=) Core.<$> name,
              ("webPropertyId" Core..=) Core.<$> webPropertyId
            ]
        )
  
  -- | JSON template for an Analytics ProfileSummary. ProfileSummary returns basic information (i.e., summary) for a profile.
  --
  -- /See:/ 'newProfileSummary' smart constructor.
  data ProfileSummary = ProfileSummary
    { -- | View (profile) ID.
      id :: (Core.Maybe Core.Text),
      -- | Resource type for Analytics ProfileSummary.
      kind :: Core.Text,
      -- | View (profile) name.
      name :: (Core.Maybe Core.Text),
      -- | Indicates whether this view (profile) is starred or not.
      starred :: (Core.Maybe Core.Bool),
      -- | View (Profile) type. Supported types: WEB or APP.
      type' :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'ProfileSummary' with the minimum fields required to make a request.
  newProfileSummary ::
    ProfileSummary
  newProfileSummary =
    ProfileSummary
      { id = Core.Nothing,
        kind = "analytics#profileSummary",
        name = Core.Nothing,
        starred = Core.Nothing,
        type' = Core.Nothing
      }
  
  instance Core.FromJSON ProfileSummary where
    parseJSON =
      Core.withObject
        "ProfileSummary"
        ( \o ->
            ProfileSummary
              Core.<$> (o Core..:? "id")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#profileSummary")
              Core.<*> (o Core..:? "name")
              Core.<*> (o Core..:? "starred")
              Core.<*> (o Core..:? "type")
        )
  
  instance Core.ToJSON ProfileSummary where
    toJSON ProfileSummary {..} =
      Core.object
        ( Core.catMaybes
            [ ("id" Core..=) Core.<$> id,
              Core.Just ("kind" Core..= kind),
              ("name" Core..=) Core.<$> name,
              ("starred" Core..=) Core.<$> starred,
              ("type" Core..=) Core.<$> type'
            ]
        )
  
  -- | A view (profile) collection lists Analytics views (profiles) to which the user has access. Each resource in the collection corresponds to a single Analytics view (profile).
  --
  -- /See:/ 'newProfiles' smart constructor.
  data Profiles = Profiles
    { -- | A list of views (profiles).
      items :: (Core.Maybe [Profile]),
      -- | The maximum number of resources the response can contain, regardless of the actual number of resources returned. Its value ranges from 1 to 1000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.
      itemsPerPage :: (Core.Maybe Core.Int32),
      -- | Collection type.
      kind :: Core.Text,
      -- | Link to next page for this view (profile) collection.
      nextLink :: (Core.Maybe Core.Text),
      -- | Link to previous page for this view (profile) collection.
      previousLink :: (Core.Maybe Core.Text),
      -- | The starting index of the resources, which is 1 by default or otherwise specified by the start-index query parameter.
      startIndex :: (Core.Maybe Core.Int32),
      -- | The total number of results for the query, regardless of the number of results in the response.
      totalResults :: (Core.Maybe Core.Int32),
      -- | Email ID of the authenticated user
      username :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Profiles' with the minimum fields required to make a request.
  newProfiles ::
    Profiles
  newProfiles =
    Profiles
      { items = Core.Nothing,
        itemsPerPage = Core.Nothing,
        kind = "analytics#profiles",
        nextLink = Core.Nothing,
        previousLink = Core.Nothing,
        startIndex = Core.Nothing,
        totalResults = Core.Nothing,
        username = Core.Nothing
      }
  
  instance Core.FromJSON Profiles where
    parseJSON =
      Core.withObject
        "Profiles"
        ( \o ->
            Profiles
              Core.<$> (o Core..:? "items")
              Core.<*> (o Core..:? "itemsPerPage")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#profiles")
              Core.<*> (o Core..:? "nextLink")
              Core.<*> (o Core..:? "previousLink")
              Core.<*> (o Core..:? "startIndex")
              Core.<*> (o Core..:? "totalResults")
              Core.<*> (o Core..:? "username")
        )
  
  instance Core.ToJSON Profiles where
    toJSON Profiles {..} =
      Core.object
        ( Core.catMaybes
            [ ("items" Core..=) Core.<$> items,
              ("itemsPerPage" Core..=) Core.<$> itemsPerPage,
              Core.Just ("kind" Core..= kind),
              ("nextLink" Core..=) Core.<$> nextLink,
              ("previousLink" Core..=) Core.<$> previousLink,
              ("startIndex" Core..=) Core.<$> startIndex,
              ("totalResults" Core..=) Core.<$> totalResults,
              ("username" Core..=) Core.<$> username
            ]
        )
  
  -- | Real time data for a given view (profile).
  --
  -- /See:/ 'newRealtimeData' smart constructor.
  data RealtimeData = RealtimeData
    { -- | Column headers that list dimension names followed by the metric names. The order of dimensions and metrics is same as specified in the request.
      columnHeaders :: (Core.Maybe [RealtimeData_ColumnHeadersItem]),
      -- | Unique ID for this data response.
      id :: (Core.Maybe Core.Text),
      -- | Resource type.
      kind :: Core.Text,
      -- | Information for the view (profile), for which the real time data was requested.
      profileInfo :: (Core.Maybe RealtimeData_ProfileInfo),
      -- | Real time data request query parameters.
      query :: (Core.Maybe RealtimeData_Query),
      -- | Real time data rows, where each row contains a list of dimension values followed by the metric values. The order of dimensions and metrics is same as specified in the request.
      rows :: (Core.Maybe [[Core.Text]]),
      -- | Link to this page.
      selfLink :: (Core.Maybe Core.Text),
      -- | The total number of rows for the query, regardless of the number of rows in the response.
      totalResults :: (Core.Maybe Core.Int32),
      -- | Total values for the requested metrics over all the results, not just the results returned in this response. The order of the metric totals is same as the metric order specified in the request.
      totalsForAllResults :: (Core.Maybe RealtimeData_TotalsForAllResults)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'RealtimeData' with the minimum fields required to make a request.
  newRealtimeData ::
    RealtimeData
  newRealtimeData =
    RealtimeData
      { columnHeaders = Core.Nothing,
        id = Core.Nothing,
        kind = "analytics#realtimeData",
        profileInfo = Core.Nothing,
        query = Core.Nothing,
        rows = Core.Nothing,
        selfLink = Core.Nothing,
        totalResults = Core.Nothing,
        totalsForAllResults = Core.Nothing
      }
  
  instance Core.FromJSON RealtimeData where
    parseJSON =
      Core.withObject
        "RealtimeData"
        ( \o ->
            RealtimeData
              Core.<$> (o Core..:? "columnHeaders")
              Core.<*> (o Core..:? "id")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#realtimeData")
              Core.<*> (o Core..:? "profileInfo")
              Core.<*> (o Core..:? "query")
              Core.<*> (o Core..:? "rows")
              Core.<*> (o Core..:? "selfLink")
              Core.<*> (o Core..:? "totalResults")
              Core.<*> (o Core..:? "totalsForAllResults")
        )
  
  instance Core.ToJSON RealtimeData where
    toJSON RealtimeData {..} =
      Core.object
        ( Core.catMaybes
            [ ("columnHeaders" Core..=) Core.<$> columnHeaders,
              ("id" Core..=) Core.<$> id,
              Core.Just ("kind" Core..= kind),
              ("profileInfo" Core..=) Core.<$> profileInfo,
              ("query" Core..=) Core.<$> query,
              ("rows" Core..=) Core.<$> rows,
              ("selfLink" Core..=) Core.<$> selfLink,
              ("totalResults" Core..=) Core.<$> totalResults,
              ("totalsForAllResults" Core..=) Core.<$> totalsForAllResults
            ]
        )
  
  --
  -- /See:/ 'newRealtimeData_ColumnHeadersItem' smart constructor.
  data RealtimeData_ColumnHeadersItem = RealtimeData_ColumnHeadersItem
    { -- | Column Type. Either DIMENSION or METRIC.
      columnType :: (Core.Maybe Core.Text),
      -- | Data type. Dimension column headers have only STRING as the data type. Metric column headers have data types for metric values such as INTEGER, DOUBLE, CURRENCY etc.
      dataType :: (Core.Maybe Core.Text),
      -- | Column name.
      name :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'RealtimeData_ColumnHeadersItem' with the minimum fields required to make a request.
  newRealtimeData_ColumnHeadersItem ::
    RealtimeData_ColumnHeadersItem
  newRealtimeData_ColumnHeadersItem =
    RealtimeData_ColumnHeadersItem
      { columnType = Core.Nothing,
        dataType = Core.Nothing,
        name = Core.Nothing
      }
  
  instance Core.FromJSON RealtimeData_ColumnHeadersItem where
    parseJSON =
      Core.withObject
        "RealtimeData_ColumnHeadersItem"
        ( \o ->
            RealtimeData_ColumnHeadersItem
              Core.<$> (o Core..:? "columnType")
              Core.<*> (o Core..:? "dataType")
              Core.<*> (o Core..:? "name")
        )
  
  instance Core.ToJSON RealtimeData_ColumnHeadersItem where
    toJSON RealtimeData_ColumnHeadersItem {..} =
      Core.object
        ( Core.catMaybes
            [ ("columnType" Core..=) Core.<$> columnType,
              ("dataType" Core..=) Core.<$> dataType,
              ("name" Core..=) Core.<$> name
            ]
        )
  
  -- | Information for the view (profile), for which the real time data was requested.
  --
  -- /See:/ 'newRealtimeData_ProfileInfo' smart constructor.
  data RealtimeData_ProfileInfo = RealtimeData_ProfileInfo
    { -- | Account ID to which this view (profile) belongs.
      accountId :: (Core.Maybe Core.Text),
      -- | Internal ID for the web property to which this view (profile) belongs.
      internalWebPropertyId :: (Core.Maybe Core.Text),
      -- | View (Profile) ID.
      profileId :: (Core.Maybe Core.Text),
      -- | View (Profile) name.
      profileName :: (Core.Maybe Core.Text),
      -- | Table ID for view (profile).
      tableId :: (Core.Maybe Core.Text),
      -- | Web Property ID to which this view (profile) belongs.
      webPropertyId :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'RealtimeData_ProfileInfo' with the minimum fields required to make a request.
  newRealtimeData_ProfileInfo ::
    RealtimeData_ProfileInfo
  newRealtimeData_ProfileInfo =
    RealtimeData_ProfileInfo
      { accountId = Core.Nothing,
        internalWebPropertyId = Core.Nothing,
        profileId = Core.Nothing,
        profileName = Core.Nothing,
        tableId = Core.Nothing,
        webPropertyId = Core.Nothing
      }
  
  instance Core.FromJSON RealtimeData_ProfileInfo where
    parseJSON =
      Core.withObject
        "RealtimeData_ProfileInfo"
        ( \o ->
            RealtimeData_ProfileInfo
              Core.<$> (o Core..:? "accountId")
              Core.<*> (o Core..:? "internalWebPropertyId")
              Core.<*> (o Core..:? "profileId")
              Core.<*> (o Core..:? "profileName")
              Core.<*> (o Core..:? "tableId")
              Core.<*> (o Core..:? "webPropertyId")
        )
  
  instance Core.ToJSON RealtimeData_ProfileInfo where
    toJSON RealtimeData_ProfileInfo {..} =
      Core.object
        ( Core.catMaybes
            [ ("accountId" Core..=) Core.<$> accountId,
              ("internalWebPropertyId" Core..=) Core.<$> internalWebPropertyId,
              ("profileId" Core..=) Core.<$> profileId,
              ("profileName" Core..=) Core.<$> profileName,
              ("tableId" Core..=) Core.<$> tableId,
              ("webPropertyId" Core..=) Core.<$> webPropertyId
            ]
        )
  
  -- | Real time data request query parameters.
  --
  -- /See:/ 'newRealtimeData_Query' smart constructor.
  data RealtimeData_Query = RealtimeData_Query
    { -- | List of real time dimensions.
      dimensions :: (Core.Maybe Core.Text),
      -- | Comma-separated list of dimension or metric filters.
      filters :: (Core.Maybe Core.Text),
      -- | Unique table ID.
      ids :: (Core.Maybe Core.Text),
      -- | Maximum results per page.
      maxResults :: (Core.Maybe Core.Int32),
      -- | List of real time metrics.
      metrics :: (Core.Maybe [Core.Text]),
      -- | List of dimensions or metrics based on which real time data is sorted.
      sort :: (Core.Maybe [Core.Text])
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'RealtimeData_Query' with the minimum fields required to make a request.
  newRealtimeData_Query ::
    RealtimeData_Query
  newRealtimeData_Query =
    RealtimeData_Query
      { dimensions = Core.Nothing,
        filters = Core.Nothing,
        ids = Core.Nothing,
        maxResults = Core.Nothing,
        metrics = Core.Nothing,
        sort = Core.Nothing
      }
  
  instance Core.FromJSON RealtimeData_Query where
    parseJSON =
      Core.withObject
        "RealtimeData_Query"
        ( \o ->
            RealtimeData_Query
              Core.<$> (o Core..:? "dimensions")
              Core.<*> (o Core..:? "filters")
              Core.<*> (o Core..:? "ids")
              Core.<*> (o Core..:? "max-results")
              Core.<*> (o Core..:? "metrics")
              Core.<*> (o Core..:? "sort")
        )
  
  instance Core.ToJSON RealtimeData_Query where
    toJSON RealtimeData_Query {..} =
      Core.object
        ( Core.catMaybes
            [ ("dimensions" Core..=) Core.<$> dimensions,
              ("filters" Core..=) Core.<$> filters,
              ("ids" Core..=) Core.<$> ids,
              ("max-results" Core..=) Core.<$> maxResults,
              ("metrics" Core..=) Core.<$> metrics,
              ("sort" Core..=) Core.<$> sort
            ]
        )
  
  -- | Total values for the requested metrics over all the results, not just the results returned in this response. The order of the metric totals is same as the metric order specified in the request.
  --
  -- /See:/ 'newRealtimeData_TotalsForAllResults' smart constructor.
  newtype RealtimeData_TotalsForAllResults = RealtimeData_TotalsForAllResults
    { -- | Key-value pair for the total value of a metric. Key is the metric name and the value is the total value for that metric.
      additional :: (Core.HashMap Core.Text Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'RealtimeData_TotalsForAllResults' with the minimum fields required to make a request.
  newRealtimeData_TotalsForAllResults ::
    -- |  Key-value pair for the total value of a metric. Key is the metric name and the value is the total value for that metric. See 'additional'.
    Core.HashMap Core.Text Core.Text ->
    RealtimeData_TotalsForAllResults
  newRealtimeData_TotalsForAllResults additional =
    RealtimeData_TotalsForAllResults {additional = additional}
  
  instance Core.FromJSON RealtimeData_TotalsForAllResults where
    parseJSON =
      Core.withObject
        "RealtimeData_TotalsForAllResults"
        ( \o ->
            RealtimeData_TotalsForAllResults Core.<$> (Core.parseJSONObject o)
        )
  
  instance Core.ToJSON RealtimeData_TotalsForAllResults where
    toJSON RealtimeData_TotalsForAllResults {..} =
      Core.toJSON additional
  
  -- | JSON template for an Analytics remarketing audience.
  --
  -- /See:/ 'newRemarketingAudience' smart constructor.
  data RemarketingAudience = RemarketingAudience
    { -- | Account ID to which this remarketing audience belongs.
      accountId :: (Core.Maybe Core.Text),
      -- | The simple audience definition that will cause a user to be added to an audience.
      audienceDefinition :: (Core.Maybe RemarketingAudience_AudienceDefinition),
      -- | The type of audience, either SIMPLE or STATE_BASED.
      audienceType :: (Core.Maybe Core.Text),
      -- | Time this remarketing audience was created.
      created :: (Core.Maybe Core.DateTime),
      -- | The description of this remarketing audience.
      description :: (Core.Maybe Core.Text),
      -- | Remarketing Audience ID.
      id :: (Core.Maybe Core.Text),
      -- | Internal ID for the web property to which this remarketing audience belongs.
      internalWebPropertyId :: (Core.Maybe Core.Text),
      -- | Collection type.
      kind :: Core.Text,
      -- | The linked ad accounts associated with this remarketing audience. A remarketing audience can have only one linkedAdAccount currently.
      linkedAdAccounts :: (Core.Maybe [LinkedForeignAccount]),
      -- | The views (profiles) that this remarketing audience is linked to.
      linkedViews :: (Core.Maybe [Core.Text]),
      -- | The name of this remarketing audience.
      name :: (Core.Maybe Core.Text),
      -- | A state based audience definition that will cause a user to be added or removed from an audience.
      stateBasedAudienceDefinition :: (Core.Maybe RemarketingAudience_StateBasedAudienceDefinition),
      -- | Time this remarketing audience was last modified.
      updated :: (Core.Maybe Core.DateTime),
      -- | Web property ID of the form UA-XXXXX-YY to which this remarketing audience belongs.
      webPropertyId :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'RemarketingAudience' with the minimum fields required to make a request.
  newRemarketingAudience ::
    RemarketingAudience
  newRemarketingAudience =
    RemarketingAudience
      { accountId = Core.Nothing,
        audienceDefinition = Core.Nothing,
        audienceType = Core.Nothing,
        created = Core.Nothing,
        description = Core.Nothing,
        id = Core.Nothing,
        internalWebPropertyId = Core.Nothing,
        kind = "analytics#remarketingAudience",
        linkedAdAccounts = Core.Nothing,
        linkedViews = Core.Nothing,
        name = Core.Nothing,
        stateBasedAudienceDefinition = Core.Nothing,
        updated = Core.Nothing,
        webPropertyId = Core.Nothing
      }
  
  instance Core.FromJSON RemarketingAudience where
    parseJSON =
      Core.withObject
        "RemarketingAudience"
        ( \o ->
            RemarketingAudience
              Core.<$> (o Core..:? "accountId")
              Core.<*> (o Core..:? "audienceDefinition")
              Core.<*> (o Core..:? "audienceType")
              Core.<*> (o Core..:? "created")
              Core.<*> (o Core..:? "description")
              Core.<*> (o Core..:? "id")
              Core.<*> (o Core..:? "internalWebPropertyId")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#remarketingAudience")
              Core.<*> (o Core..:? "linkedAdAccounts")
              Core.<*> (o Core..:? "linkedViews")
              Core.<*> (o Core..:? "name")
              Core.<*> (o Core..:? "stateBasedAudienceDefinition")
              Core.<*> (o Core..:? "updated")
              Core.<*> (o Core..:? "webPropertyId")
        )
  
  instance Core.ToJSON RemarketingAudience where
    toJSON RemarketingAudience {..} =
      Core.object
        ( Core.catMaybes
            [ ("accountId" Core..=) Core.<$> accountId,
              ("audienceDefinition" Core..=) Core.<$> audienceDefinition,
              ("audienceType" Core..=) Core.<$> audienceType,
              ("created" Core..=) Core.<$> created,
              ("description" Core..=) Core.<$> description,
              ("id" Core..=) Core.<$> id,
              ("internalWebPropertyId" Core..=) Core.<$> internalWebPropertyId,
              Core.Just ("kind" Core..= kind),
              ("linkedAdAccounts" Core..=) Core.<$> linkedAdAccounts,
              ("linkedViews" Core..=) Core.<$> linkedViews,
              ("name" Core..=) Core.<$> name,
              ("stateBasedAudienceDefinition" Core..=)
                Core.<$> stateBasedAudienceDefinition,
              ("updated" Core..=) Core.<$> updated,
              ("webPropertyId" Core..=) Core.<$> webPropertyId
            ]
        )
  
  -- | The simple audience definition that will cause a user to be added to an audience.
  --
  -- /See:/ 'newRemarketingAudience_AudienceDefinition' smart constructor.
  newtype RemarketingAudience_AudienceDefinition = RemarketingAudience_AudienceDefinition
    { -- | Defines the conditions to include users to the audience.
      includeConditions :: (Core.Maybe IncludeConditions)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'RemarketingAudience_AudienceDefinition' with the minimum fields required to make a request.
  newRemarketingAudience_AudienceDefinition ::
    RemarketingAudience_AudienceDefinition
  newRemarketingAudience_AudienceDefinition =
    RemarketingAudience_AudienceDefinition
      { includeConditions =
          Core.Nothing
      }
  
  instance Core.FromJSON RemarketingAudience_AudienceDefinition where
    parseJSON =
      Core.withObject
        "RemarketingAudience_AudienceDefinition"
        ( \o ->
            RemarketingAudience_AudienceDefinition
              Core.<$> (o Core..:? "includeConditions")
        )
  
  instance Core.ToJSON RemarketingAudience_AudienceDefinition where
    toJSON RemarketingAudience_AudienceDefinition {..} =
      Core.object
        ( Core.catMaybes
            [("includeConditions" Core..=) Core.<$> includeConditions]
        )
  
  -- | A state based audience definition that will cause a user to be added or removed from an audience.
  --
  -- /See:/ 'newRemarketingAudience_StateBasedAudienceDefinition' smart constructor.
  data RemarketingAudience_StateBasedAudienceDefinition = RemarketingAudience_StateBasedAudienceDefinition
    { -- | Defines the conditions to exclude users from the audience.
      excludeConditions ::
        ( Core.Maybe
            RemarketingAudience_StateBasedAudienceDefinition_ExcludeConditions
        ),
      -- | Defines the conditions to include users to the audience.
      includeConditions :: (Core.Maybe IncludeConditions)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'RemarketingAudience_StateBasedAudienceDefinition' with the minimum fields required to make a request.
  newRemarketingAudience_StateBasedAudienceDefinition ::
    RemarketingAudience_StateBasedAudienceDefinition
  newRemarketingAudience_StateBasedAudienceDefinition =
    RemarketingAudience_StateBasedAudienceDefinition
      { excludeConditions =
          Core.Nothing,
        includeConditions = Core.Nothing
      }
  
  instance
    Core.FromJSON
      RemarketingAudience_StateBasedAudienceDefinition
    where
    parseJSON =
      Core.withObject
        "RemarketingAudience_StateBasedAudienceDefinition"
        ( \o ->
            RemarketingAudience_StateBasedAudienceDefinition
              Core.<$> (o Core..:? "excludeConditions")
              Core.<*> (o Core..:? "includeConditions")
        )
  
  instance
    Core.ToJSON
      RemarketingAudience_StateBasedAudienceDefinition
    where
    toJSON RemarketingAudience_StateBasedAudienceDefinition {..} =
      Core.object
        ( Core.catMaybes
            [ ("excludeConditions" Core..=) Core.<$> excludeConditions,
              ("includeConditions" Core..=) Core.<$> includeConditions
            ]
        )
  
  -- | Defines the conditions to exclude users from the audience.
  --
  -- /See:/ 'newRemarketingAudience_StateBasedAudienceDefinition_ExcludeConditions' smart constructor.
  data RemarketingAudience_StateBasedAudienceDefinition_ExcludeConditions = RemarketingAudience_StateBasedAudienceDefinition_ExcludeConditions
    { -- | Whether to make the exclusion TEMPORARY or PERMANENT.
      exclusionDuration :: (Core.Maybe Core.Text),
      -- | The segment condition that will cause a user to be removed from an audience.
      segment :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'RemarketingAudience_StateBasedAudienceDefinition_ExcludeConditions' with the minimum fields required to make a request.
  newRemarketingAudience_StateBasedAudienceDefinition_ExcludeConditions ::
    RemarketingAudience_StateBasedAudienceDefinition_ExcludeConditions
  newRemarketingAudience_StateBasedAudienceDefinition_ExcludeConditions =
    RemarketingAudience_StateBasedAudienceDefinition_ExcludeConditions
      { exclusionDuration =
          Core.Nothing,
        segment = Core.Nothing
      }
  
  instance
    Core.FromJSON
      RemarketingAudience_StateBasedAudienceDefinition_ExcludeConditions
    where
    parseJSON =
      Core.withObject
        "RemarketingAudience_StateBasedAudienceDefinition_ExcludeConditions"
        ( \o ->
            RemarketingAudience_StateBasedAudienceDefinition_ExcludeConditions
              Core.<$> (o Core..:? "exclusionDuration")
              Core.<*> (o Core..:? "segment")
        )
  
  instance
    Core.ToJSON
      RemarketingAudience_StateBasedAudienceDefinition_ExcludeConditions
    where
    toJSON
      RemarketingAudience_StateBasedAudienceDefinition_ExcludeConditions {..} =
        Core.object
          ( Core.catMaybes
              [ ("exclusionDuration" Core..=) Core.<$> exclusionDuration,
                ("segment" Core..=) Core.<$> segment
              ]
          )
  
  -- | A remarketing audience collection lists Analytics remarketing audiences to which the user has access. Each resource in the collection corresponds to a single Analytics remarketing audience.
  --
  -- /See:/ 'newRemarketingAudiences' smart constructor.
  data RemarketingAudiences = RemarketingAudiences
    { -- | A list of remarketing audiences.
      items :: (Core.Maybe [RemarketingAudience]),
      -- | The maximum number of resources the response can contain, regardless of the actual number of resources returned. Its value ranges from 1 to 1000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.
      itemsPerPage :: (Core.Maybe Core.Int32),
      -- | Collection type.
      kind :: Core.Text,
      -- | Link to next page for this remarketing audience collection.
      nextLink :: (Core.Maybe Core.Text),
      -- | Link to previous page for this view (profile) collection.
      previousLink :: (Core.Maybe Core.Text),
      -- | The starting index of the resources, which is 1 by default or otherwise specified by the start-index query parameter.
      startIndex :: (Core.Maybe Core.Int32),
      -- | The total number of results for the query, regardless of the number of results in the response.
      totalResults :: (Core.Maybe Core.Int32),
      -- | Email ID of the authenticated user
      username :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'RemarketingAudiences' with the minimum fields required to make a request.
  newRemarketingAudiences ::
    RemarketingAudiences
  newRemarketingAudiences =
    RemarketingAudiences
      { items = Core.Nothing,
        itemsPerPage = Core.Nothing,
        kind = "analytics#remarketingAudiences",
        nextLink = Core.Nothing,
        previousLink = Core.Nothing,
        startIndex = Core.Nothing,
        totalResults = Core.Nothing,
        username = Core.Nothing
      }
  
  instance Core.FromJSON RemarketingAudiences where
    parseJSON =
      Core.withObject
        "RemarketingAudiences"
        ( \o ->
            RemarketingAudiences
              Core.<$> (o Core..:? "items")
              Core.<*> (o Core..:? "itemsPerPage")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#remarketingAudiences")
              Core.<*> (o Core..:? "nextLink")
              Core.<*> (o Core..:? "previousLink")
              Core.<*> (o Core..:? "startIndex")
              Core.<*> (o Core..:? "totalResults")
              Core.<*> (o Core..:? "username")
        )
  
  instance Core.ToJSON RemarketingAudiences where
    toJSON RemarketingAudiences {..} =
      Core.object
        ( Core.catMaybes
            [ ("items" Core..=) Core.<$> items,
              ("itemsPerPage" Core..=) Core.<$> itemsPerPage,
              Core.Just ("kind" Core..= kind),
              ("nextLink" Core..=) Core.<$> nextLink,
              ("previousLink" Core..=) Core.<$> previousLink,
              ("startIndex" Core..=) Core.<$> startIndex,
              ("totalResults" Core..=) Core.<$> totalResults,
              ("username" Core..=) Core.<$> username
            ]
        )
  
  -- | JSON template for an Analytics segment.
  --
  -- /See:/ 'newSegment' smart constructor.
  data Segment = Segment
    { -- | Time the segment was created.
      created :: (Core.Maybe Core.DateTime),
      -- | Segment definition.
      definition :: (Core.Maybe Core.Text),
      -- | Segment ID.
      id :: (Core.Maybe Core.Text),
      -- | Resource type for Analytics segment.
      kind :: Core.Text,
      -- | Segment name.
      name :: (Core.Maybe Core.Text),
      -- | Segment ID. Can be used with the \'segment\' parameter in Core Reporting API.
      segmentId :: (Core.Maybe Core.Text),
      -- | Link for this segment.
      selfLink :: (Core.Maybe Core.Text),
      -- | Type for a segment. Possible values are \"BUILT_IN\" or \"CUSTOM\".
      type' :: (Core.Maybe Core.Text),
      -- | Time the segment was last modified.
      updated :: (Core.Maybe Core.DateTime)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Segment' with the minimum fields required to make a request.
  newSegment ::
    Segment
  newSegment =
    Segment
      { created = Core.Nothing,
        definition = Core.Nothing,
        id = Core.Nothing,
        kind = "analytics#segment",
        name = Core.Nothing,
        segmentId = Core.Nothing,
        selfLink = Core.Nothing,
        type' = Core.Nothing,
        updated = Core.Nothing
      }
  
  instance Core.FromJSON Segment where
    parseJSON =
      Core.withObject
        "Segment"
        ( \o ->
            Segment
              Core.<$> (o Core..:? "created")
              Core.<*> (o Core..:? "definition")
              Core.<*> (o Core..:? "id")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#segment")
              Core.<*> (o Core..:? "name")
              Core.<*> (o Core..:? "segmentId")
              Core.<*> (o Core..:? "selfLink")
              Core.<*> (o Core..:? "type")
              Core.<*> (o Core..:? "updated")
        )
  
  instance Core.ToJSON Segment where
    toJSON Segment {..} =
      Core.object
        ( Core.catMaybes
            [ ("created" Core..=) Core.<$> created,
              ("definition" Core..=) Core.<$> definition,
              ("id" Core..=) Core.<$> id,
              Core.Just ("kind" Core..= kind),
              ("name" Core..=) Core.<$> name,
              ("segmentId" Core..=) Core.<$> segmentId,
              ("selfLink" Core..=) Core.<$> selfLink,
              ("type" Core..=) Core.<$> type',
              ("updated" Core..=) Core.<$> updated
            ]
        )
  
  -- | An segment collection lists Analytics segments that the user has access to. Each resource in the collection corresponds to a single Analytics segment.
  --
  -- /See:/ 'newSegments' smart constructor.
  data Segments = Segments
    { -- | A list of segments.
      items :: (Core.Maybe [Segment]),
      -- | The maximum number of resources the response can contain, regardless of the actual number of resources returned. Its value ranges from 1 to 1000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.
      itemsPerPage :: (Core.Maybe Core.Int32),
      -- | Collection type for segments.
      kind :: Core.Text,
      -- | Link to next page for this segment collection.
      nextLink :: (Core.Maybe Core.Text),
      -- | Link to previous page for this segment collection.
      previousLink :: (Core.Maybe Core.Text),
      -- | The starting index of the resources, which is 1 by default or otherwise specified by the start-index query parameter.
      startIndex :: (Core.Maybe Core.Int32),
      -- | The total number of results for the query, regardless of the number of results in the response.
      totalResults :: (Core.Maybe Core.Int32),
      -- | Email ID of the authenticated user
      username :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Segments' with the minimum fields required to make a request.
  newSegments ::
    Segments
  newSegments =
    Segments
      { items = Core.Nothing,
        itemsPerPage = Core.Nothing,
        kind = "analytics#segments",
        nextLink = Core.Nothing,
        previousLink = Core.Nothing,
        startIndex = Core.Nothing,
        totalResults = Core.Nothing,
        username = Core.Nothing
      }
  
  instance Core.FromJSON Segments where
    parseJSON =
      Core.withObject
        "Segments"
        ( \o ->
            Segments
              Core.<$> (o Core..:? "items")
              Core.<*> (o Core..:? "itemsPerPage")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#segments")
              Core.<*> (o Core..:? "nextLink")
              Core.<*> (o Core..:? "previousLink")
              Core.<*> (o Core..:? "startIndex")
              Core.<*> (o Core..:? "totalResults")
              Core.<*> (o Core..:? "username")
        )
  
  instance Core.ToJSON Segments where
    toJSON Segments {..} =
      Core.object
        ( Core.catMaybes
            [ ("items" Core..=) Core.<$> items,
              ("itemsPerPage" Core..=) Core.<$> itemsPerPage,
              Core.Just ("kind" Core..= kind),
              ("nextLink" Core..=) Core.<$> nextLink,
              ("previousLink" Core..=) Core.<$> previousLink,
              ("startIndex" Core..=) Core.<$> startIndex,
              ("totalResults" Core..=) Core.<$> totalResults,
              ("username" Core..=) Core.<$> username
            ]
        )
  
  -- | JSON template for Analytics unsampled report resource.
  --
  -- /See:/ 'newUnsampledReport' smart constructor.
  data UnsampledReport = UnsampledReport
    { -- | Account ID to which this unsampled report belongs.
      accountId :: (Core.Maybe Core.Text),
      -- | Download details for a file stored in Google Cloud Storage.
      cloudStorageDownloadDetails :: (Core.Maybe UnsampledReport_CloudStorageDownloadDetails),
      -- | Time this unsampled report was created.
      created :: (Core.Maybe Core.DateTime),
      -- | The dimensions for the unsampled report.
      dimensions :: (Core.Maybe Core.Text),
      -- | The type of download you need to use for the report data file. Possible values include @GOOGLE_DRIVE@ and @GOOGLE_CLOUD_STORAGE@. If the value is @GOOGLE_DRIVE@, see the @driveDownloadDetails@ field. If the value is @GOOGLE_CLOUD_STORAGE@, see the @cloudStorageDownloadDetails@ field.
      downloadType :: (Core.Maybe Core.Text),
      -- | Download details for a file stored in Google Drive.
      driveDownloadDetails :: (Core.Maybe UnsampledReport_DriveDownloadDetails),
      -- | The end date for the unsampled report.
      endDate :: (Core.Maybe Core.Text),
      -- | The filters for the unsampled report.
      filters :: (Core.Maybe Core.Text),
      -- | Unsampled report ID.
      id :: (Core.Maybe Core.Text),
      -- | Resource type for an Analytics unsampled report.
      kind :: Core.Text,
      -- | The metrics for the unsampled report.
      metrics :: (Core.Maybe Core.Text),
      -- | View (Profile) ID to which this unsampled report belongs.
      profileId :: (Core.Maybe Core.Text),
      -- | The segment for the unsampled report.
      segment :: (Core.Maybe Core.Text),
      -- | Link for this unsampled report.
      selfLink :: (Core.Maybe Core.Text),
      -- | The start date for the unsampled report.
      startDate :: (Core.Maybe Core.Text),
      -- | Status of this unsampled report. Possible values are PENDING, COMPLETED, or FAILED.
      status :: (Core.Maybe Core.Text),
      -- | Title of the unsampled report.
      title :: (Core.Maybe Core.Text),
      -- | Time this unsampled report was last modified.
      updated :: (Core.Maybe Core.DateTime),
      -- | Web property ID to which this unsampled report belongs. The web property ID is of the form UA-XXXXX-YY.
      webPropertyId :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'UnsampledReport' with the minimum fields required to make a request.
  newUnsampledReport ::
    UnsampledReport
  newUnsampledReport =
    UnsampledReport
      { accountId = Core.Nothing,
        cloudStorageDownloadDetails = Core.Nothing,
        created = Core.Nothing,
        dimensions = Core.Nothing,
        downloadType = Core.Nothing,
        driveDownloadDetails = Core.Nothing,
        endDate = Core.Nothing,
        filters = Core.Nothing,
        id = Core.Nothing,
        kind = "analytics#unsampledReport",
        metrics = Core.Nothing,
        profileId = Core.Nothing,
        segment = Core.Nothing,
        selfLink = Core.Nothing,
        startDate = Core.Nothing,
        status = Core.Nothing,
        title = Core.Nothing,
        updated = Core.Nothing,
        webPropertyId = Core.Nothing
      }
  
  instance Core.FromJSON UnsampledReport where
    parseJSON =
      Core.withObject
        "UnsampledReport"
        ( \o ->
            UnsampledReport
              Core.<$> (o Core..:? "accountId")
              Core.<*> (o Core..:? "cloudStorageDownloadDetails")
              Core.<*> (o Core..:? "created")
              Core.<*> (o Core..:? "dimensions")
              Core.<*> (o Core..:? "downloadType")
              Core.<*> (o Core..:? "driveDownloadDetails")
              Core.<*> (o Core..:? "end-date")
              Core.<*> (o Core..:? "filters")
              Core.<*> (o Core..:? "id")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#unsampledReport")
              Core.<*> (o Core..:? "metrics")
              Core.<*> (o Core..:? "profileId")
              Core.<*> (o Core..:? "segment")
              Core.<*> (o Core..:? "selfLink")
              Core.<*> (o Core..:? "start-date")
              Core.<*> (o Core..:? "status")
              Core.<*> (o Core..:? "title")
              Core.<*> (o Core..:? "updated")
              Core.<*> (o Core..:? "webPropertyId")
        )
  
  instance Core.ToJSON UnsampledReport where
    toJSON UnsampledReport {..} =
      Core.object
        ( Core.catMaybes
            [ ("accountId" Core..=) Core.<$> accountId,
              ("cloudStorageDownloadDetails" Core..=)
                Core.<$> cloudStorageDownloadDetails,
              ("created" Core..=) Core.<$> created,
              ("dimensions" Core..=) Core.<$> dimensions,
              ("downloadType" Core..=) Core.<$> downloadType,
              ("driveDownloadDetails" Core..=) Core.<$> driveDownloadDetails,
              ("end-date" Core..=) Core.<$> endDate,
              ("filters" Core..=) Core.<$> filters,
              ("id" Core..=) Core.<$> id,
              Core.Just ("kind" Core..= kind),
              ("metrics" Core..=) Core.<$> metrics,
              ("profileId" Core..=) Core.<$> profileId,
              ("segment" Core..=) Core.<$> segment,
              ("selfLink" Core..=) Core.<$> selfLink,
              ("start-date" Core..=) Core.<$> startDate,
              ("status" Core..=) Core.<$> status,
              ("title" Core..=) Core.<$> title,
              ("updated" Core..=) Core.<$> updated,
              ("webPropertyId" Core..=) Core.<$> webPropertyId
            ]
        )
  
  -- | Download details for a file stored in Google Cloud Storage.
  --
  -- /See:/ 'newUnsampledReport_CloudStorageDownloadDetails' smart constructor.
  data UnsampledReport_CloudStorageDownloadDetails = UnsampledReport_CloudStorageDownloadDetails
    { -- | Id of the bucket the file object is stored in.
      bucketId :: (Core.Maybe Core.Text),
      -- | Id of the file object containing the report data.
      objectId :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'UnsampledReport_CloudStorageDownloadDetails' with the minimum fields required to make a request.
  newUnsampledReport_CloudStorageDownloadDetails ::
    UnsampledReport_CloudStorageDownloadDetails
  newUnsampledReport_CloudStorageDownloadDetails =
    UnsampledReport_CloudStorageDownloadDetails
      { bucketId =
          Core.Nothing,
        objectId = Core.Nothing
      }
  
  instance Core.FromJSON UnsampledReport_CloudStorageDownloadDetails where
    parseJSON =
      Core.withObject
        "UnsampledReport_CloudStorageDownloadDetails"
        ( \o ->
            UnsampledReport_CloudStorageDownloadDetails
              Core.<$> (o Core..:? "bucketId")
              Core.<*> (o Core..:? "objectId")
        )
  
  instance Core.ToJSON UnsampledReport_CloudStorageDownloadDetails where
    toJSON UnsampledReport_CloudStorageDownloadDetails {..} =
      Core.object
        ( Core.catMaybes
            [ ("bucketId" Core..=) Core.<$> bucketId,
              ("objectId" Core..=) Core.<$> objectId
            ]
        )
  
  -- | Download details for a file stored in Google Drive.
  --
  -- /See:/ 'newUnsampledReport_DriveDownloadDetails' smart constructor.
  newtype UnsampledReport_DriveDownloadDetails = UnsampledReport_DriveDownloadDetails
    { -- | Id of the document\/file containing the report data.
      documentId :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'UnsampledReport_DriveDownloadDetails' with the minimum fields required to make a request.
  newUnsampledReport_DriveDownloadDetails ::
    UnsampledReport_DriveDownloadDetails
  newUnsampledReport_DriveDownloadDetails =
    UnsampledReport_DriveDownloadDetails {documentId = Core.Nothing}
  
  instance Core.FromJSON UnsampledReport_DriveDownloadDetails where
    parseJSON =
      Core.withObject
        "UnsampledReport_DriveDownloadDetails"
        ( \o ->
            UnsampledReport_DriveDownloadDetails
              Core.<$> (o Core..:? "documentId")
        )
  
  instance Core.ToJSON UnsampledReport_DriveDownloadDetails where
    toJSON UnsampledReport_DriveDownloadDetails {..} =
      Core.object
        (Core.catMaybes [("documentId" Core..=) Core.<$> documentId])
  
  -- | An unsampled report collection lists Analytics unsampled reports to which the user has access. Each view (profile) can have a set of unsampled reports. Each resource in the unsampled report collection corresponds to a single Analytics unsampled report.
  --
  -- /See:/ 'newUnsampledReports' smart constructor.
  data UnsampledReports = UnsampledReports
    { -- | A list of unsampled reports.
      items :: (Core.Maybe [UnsampledReport]),
      -- | The maximum number of resources the response can contain, regardless of the actual number of resources returned. Its value ranges from 1 to 1000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.
      itemsPerPage :: (Core.Maybe Core.Int32),
      -- | Collection type.
      kind :: Core.Text,
      -- | Link to next page for this unsampled report collection.
      nextLink :: (Core.Maybe Core.Text),
      -- | Link to previous page for this unsampled report collection.
      previousLink :: (Core.Maybe Core.Text),
      -- | The starting index of the resources, which is 1 by default or otherwise specified by the start-index query parameter.
      startIndex :: (Core.Maybe Core.Int32),
      -- | The total number of results for the query, regardless of the number of resources in the result.
      totalResults :: (Core.Maybe Core.Int32),
      -- | Email ID of the authenticated user
      username :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'UnsampledReports' with the minimum fields required to make a request.
  newUnsampledReports ::
    UnsampledReports
  newUnsampledReports =
    UnsampledReports
      { items = Core.Nothing,
        itemsPerPage = Core.Nothing,
        kind = "analytics#unsampledReports",
        nextLink = Core.Nothing,
        previousLink = Core.Nothing,
        startIndex = Core.Nothing,
        totalResults = Core.Nothing,
        username = Core.Nothing
      }
  
  instance Core.FromJSON UnsampledReports where
    parseJSON =
      Core.withObject
        "UnsampledReports"
        ( \o ->
            UnsampledReports
              Core.<$> (o Core..:? "items")
              Core.<*> (o Core..:? "itemsPerPage")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#unsampledReports")
              Core.<*> (o Core..:? "nextLink")
              Core.<*> (o Core..:? "previousLink")
              Core.<*> (o Core..:? "startIndex")
              Core.<*> (o Core..:? "totalResults")
              Core.<*> (o Core..:? "username")
        )
  
  instance Core.ToJSON UnsampledReports where
    toJSON UnsampledReports {..} =
      Core.object
        ( Core.catMaybes
            [ ("items" Core..=) Core.<$> items,
              ("itemsPerPage" Core..=) Core.<$> itemsPerPage,
              Core.Just ("kind" Core..= kind),
              ("nextLink" Core..=) Core.<$> nextLink,
              ("previousLink" Core..=) Core.<$> previousLink,
              ("startIndex" Core..=) Core.<$> startIndex,
              ("totalResults" Core..=) Core.<$> totalResults,
              ("username" Core..=) Core.<$> username
            ]
        )
  
  -- | Metadata returned for an upload operation.
  --
  -- /See:/ 'newUpload' smart constructor.
  data Upload = Upload
    { -- | Account Id to which this upload belongs.
      accountId :: (Core.Maybe Core.Int64),
      -- | Custom data source Id to which this data import belongs.
      customDataSourceId :: (Core.Maybe Core.Text),
      -- | Data import errors collection.
      errors :: (Core.Maybe [Core.Text]),
      -- | A unique ID for this upload.
      id :: (Core.Maybe Core.Text),
      -- | Resource type for Analytics upload.
      kind :: Core.Text,
      -- | Upload status. Possible values: PENDING, COMPLETED, FAILED, DELETING, DELETED.
      status :: (Core.Maybe Core.Text),
      -- | Time this file is uploaded.
      uploadTime :: (Core.Maybe Core.DateTime)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Upload' with the minimum fields required to make a request.
  newUpload ::
    Upload
  newUpload =
    Upload
      { accountId = Core.Nothing,
        customDataSourceId = Core.Nothing,
        errors = Core.Nothing,
        id = Core.Nothing,
        kind = "analytics#upload",
        status = Core.Nothing,
        uploadTime = Core.Nothing
      }
  
  instance Core.FromJSON Upload where
    parseJSON =
      Core.withObject
        "Upload"
        ( \o ->
            Upload
              Core.<$> (o Core..:? "accountId" Core.<&> Core.fmap Core.fromAsText)
              Core.<*> (o Core..:? "customDataSourceId")
              Core.<*> (o Core..:? "errors")
              Core.<*> (o Core..:? "id")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#upload")
              Core.<*> (o Core..:? "status")
              Core.<*> (o Core..:? "uploadTime")
        )
  
  instance Core.ToJSON Upload where
    toJSON Upload {..} =
      Core.object
        ( Core.catMaybes
            [ ("accountId" Core..=) Core.. Core.AsText Core.<$> accountId,
              ("customDataSourceId" Core..=) Core.<$> customDataSourceId,
              ("errors" Core..=) Core.<$> errors,
              ("id" Core..=) Core.<$> id,
              Core.Just ("kind" Core..= kind),
              ("status" Core..=) Core.<$> status,
              ("uploadTime" Core..=) Core.<$> uploadTime
            ]
        )
  
  -- | Upload collection lists Analytics uploads to which the user has access. Each custom data source can have a set of uploads. Each resource in the upload collection corresponds to a single Analytics data upload.
  --
  -- /See:/ 'newUploads' smart constructor.
  data Uploads = Uploads
    { -- | A list of uploads.
      items :: (Core.Maybe [Upload]),
      -- | The maximum number of resources the response can contain, regardless of the actual number of resources returned. Its value ranges from 1 to 1000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.
      itemsPerPage :: (Core.Maybe Core.Int32),
      -- | Collection type.
      kind :: Core.Text,
      -- | Link to next page for this upload collection.
      nextLink :: (Core.Maybe Core.Text),
      -- | Link to previous page for this upload collection.
      previousLink :: (Core.Maybe Core.Text),
      -- | The starting index of the resources, which is 1 by default or otherwise specified by the start-index query parameter.
      startIndex :: (Core.Maybe Core.Int32),
      -- | The total number of results for the query, regardless of the number of resources in the result.
      totalResults :: (Core.Maybe Core.Int32)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Uploads' with the minimum fields required to make a request.
  newUploads ::
    Uploads
  newUploads =
    Uploads
      { items = Core.Nothing,
        itemsPerPage = Core.Nothing,
        kind = "analytics#uploads",
        nextLink = Core.Nothing,
        previousLink = Core.Nothing,
        startIndex = Core.Nothing,
        totalResults = Core.Nothing
      }
  
  instance Core.FromJSON Uploads where
    parseJSON =
      Core.withObject
        "Uploads"
        ( \o ->
            Uploads
              Core.<$> (o Core..:? "items")
              Core.<*> (o Core..:? "itemsPerPage")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#uploads")
              Core.<*> (o Core..:? "nextLink")
              Core.<*> (o Core..:? "previousLink")
              Core.<*> (o Core..:? "startIndex")
              Core.<*> (o Core..:? "totalResults")
        )
  
  instance Core.ToJSON Uploads where
    toJSON Uploads {..} =
      Core.object
        ( Core.catMaybes
            [ ("items" Core..=) Core.<$> items,
              ("itemsPerPage" Core..=) Core.<$> itemsPerPage,
              Core.Just ("kind" Core..= kind),
              ("nextLink" Core..=) Core.<$> nextLink,
              ("previousLink" Core..=) Core.<$> previousLink,
              ("startIndex" Core..=) Core.<$> startIndex,
              ("totalResults" Core..=) Core.<$> totalResults
            ]
        )
  
  -- | JSON template for a user deletion request resource.
  --
  -- /See:/ 'newUserDeletionRequest' smart constructor.
  data UserDeletionRequest = UserDeletionRequest
    { -- | This marks the point in time for which all user data before should be deleted
      deletionRequestTime :: (Core.Maybe Core.DateTime),
      -- | Firebase Project Id
      firebaseProjectId :: (Core.Maybe Core.Text),
      -- | User ID.
      id :: (Core.Maybe UserDeletionRequest_Id),
      -- | Value is \"analytics#userDeletionRequest\".
      kind :: Core.Text,
      -- | Property ID
      propertyId :: (Core.Maybe Core.Text),
      -- | Web property ID of the form UA-XXXXX-YY.
      webPropertyId :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'UserDeletionRequest' with the minimum fields required to make a request.
  newUserDeletionRequest ::
    UserDeletionRequest
  newUserDeletionRequest =
    UserDeletionRequest
      { deletionRequestTime = Core.Nothing,
        firebaseProjectId = Core.Nothing,
        id = Core.Nothing,
        kind = "analytics#userDeletionRequest",
        propertyId = Core.Nothing,
        webPropertyId = Core.Nothing
      }
  
  instance Core.FromJSON UserDeletionRequest where
    parseJSON =
      Core.withObject
        "UserDeletionRequest"
        ( \o ->
            UserDeletionRequest
              Core.<$> (o Core..:? "deletionRequestTime")
              Core.<*> (o Core..:? "firebaseProjectId")
              Core.<*> (o Core..:? "id")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#userDeletionRequest")
              Core.<*> (o Core..:? "propertyId")
              Core.<*> (o Core..:? "webPropertyId")
        )
  
  instance Core.ToJSON UserDeletionRequest where
    toJSON UserDeletionRequest {..} =
      Core.object
        ( Core.catMaybes
            [ ("deletionRequestTime" Core..=) Core.<$> deletionRequestTime,
              ("firebaseProjectId" Core..=) Core.<$> firebaseProjectId,
              ("id" Core..=) Core.<$> id,
              Core.Just ("kind" Core..= kind),
              ("propertyId" Core..=) Core.<$> propertyId,
              ("webPropertyId" Core..=) Core.<$> webPropertyId
            ]
        )
  
  -- | User ID.
  --
  -- /See:/ 'newUserDeletionRequest_Id' smart constructor.
  data UserDeletionRequest_Id = UserDeletionRequest_Id
    { -- | Type of user
      type' :: (Core.Maybe Core.Text),
      -- | The User\'s id
      userId :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'UserDeletionRequest_Id' with the minimum fields required to make a request.
  newUserDeletionRequest_Id ::
    UserDeletionRequest_Id
  newUserDeletionRequest_Id =
    UserDeletionRequest_Id
      { type' = Core.Nothing,
        userId = Core.Nothing
      }
  
  instance Core.FromJSON UserDeletionRequest_Id where
    parseJSON =
      Core.withObject
        "UserDeletionRequest_Id"
        ( \o ->
            UserDeletionRequest_Id
              Core.<$> (o Core..:? "type")
              Core.<*> (o Core..:? "userId")
        )
  
  instance Core.ToJSON UserDeletionRequest_Id where
    toJSON UserDeletionRequest_Id {..} =
      Core.object
        ( Core.catMaybes
            [ ("type" Core..=) Core.<$> type',
              ("userId" Core..=) Core.<$> userId
            ]
        )
  
  -- | JSON template for a user reference.
  --
  -- /See:/ 'newUserRef' smart constructor.
  data UserRef = UserRef
    { -- | Email ID of this user.
      email :: (Core.Maybe Core.Text),
      -- | User ID.
      id :: (Core.Maybe Core.Text),
      kind :: Core.Text
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'UserRef' with the minimum fields required to make a request.
  newUserRef ::
    UserRef
  newUserRef =
    UserRef
      { email = Core.Nothing,
        id = Core.Nothing,
        kind = "analytics#userRef"
      }
  
  instance Core.FromJSON UserRef where
    parseJSON =
      Core.withObject
        "UserRef"
        ( \o ->
            UserRef
              Core.<$> (o Core..:? "email")
              Core.<*> (o Core..:? "id")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#userRef")
        )
  
  instance Core.ToJSON UserRef where
    toJSON UserRef {..} =
      Core.object
        ( Core.catMaybes
            [ ("email" Core..=) Core.<$> email,
              ("id" Core..=) Core.<$> id,
              Core.Just ("kind" Core..= kind)
            ]
        )
  
  -- | JSON template for a web property reference.
  --
  -- /See:/ 'newWebPropertyRef' smart constructor.
  data WebPropertyRef = WebPropertyRef
    { -- | Account ID to which this web property belongs.
      accountId :: (Core.Maybe Core.Text),
      -- | Link for this web property.
      href :: (Core.Maybe Core.Text),
      -- | Web property ID of the form UA-XXXXX-YY.
      id :: (Core.Maybe Core.Text),
      -- | Internal ID for this web property.
      internalWebPropertyId :: (Core.Maybe Core.Text),
      -- | Analytics web property reference.
      kind :: Core.Text,
      -- | Name of this web property.
      name :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'WebPropertyRef' with the minimum fields required to make a request.
  newWebPropertyRef ::
    WebPropertyRef
  newWebPropertyRef =
    WebPropertyRef
      { accountId = Core.Nothing,
        href = Core.Nothing,
        id = Core.Nothing,
        internalWebPropertyId = Core.Nothing,
        kind = "analytics#webPropertyRef",
        name = Core.Nothing
      }
  
  instance Core.FromJSON WebPropertyRef where
    parseJSON =
      Core.withObject
        "WebPropertyRef"
        ( \o ->
            WebPropertyRef
              Core.<$> (o Core..:? "accountId")
              Core.<*> (o Core..:? "href")
              Core.<*> (o Core..:? "id")
              Core.<*> (o Core..:? "internalWebPropertyId")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#webPropertyRef")
              Core.<*> (o Core..:? "name")
        )
  
  instance Core.ToJSON WebPropertyRef where
    toJSON WebPropertyRef {..} =
      Core.object
        ( Core.catMaybes
            [ ("accountId" Core..=) Core.<$> accountId,
              ("href" Core..=) Core.<$> href,
              ("id" Core..=) Core.<$> id,
              ("internalWebPropertyId" Core..=) Core.<$> internalWebPropertyId,
              Core.Just ("kind" Core..= kind),
              ("name" Core..=) Core.<$> name
            ]
        )
  
  -- | JSON template for an Analytics WebPropertySummary. WebPropertySummary returns basic information (i.e., summary) for a web property.
  --
  -- /See:/ 'newWebPropertySummary' smart constructor.
  data WebPropertySummary = WebPropertySummary
    { -- | Web property ID of the form UA-XXXXX-YY.
      id :: (Core.Maybe Core.Text),
      -- | Internal ID for this web property.
      internalWebPropertyId :: (Core.Maybe Core.Text),
      -- | Resource type for Analytics WebPropertySummary.
      kind :: Core.Text,
      -- | Level for this web property. Possible values are STANDARD or PREMIUM.
      level :: (Core.Maybe Core.Text),
      -- | Web property name.
      name :: (Core.Maybe Core.Text),
      -- | List of profiles under this web property.
      profiles :: (Core.Maybe [ProfileSummary]),
      -- | Indicates whether this web property is starred or not.
      starred :: (Core.Maybe Core.Bool),
      -- | Website url for this web property.
      websiteUrl :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'WebPropertySummary' with the minimum fields required to make a request.
  newWebPropertySummary ::
    WebPropertySummary
  newWebPropertySummary =
    WebPropertySummary
      { id = Core.Nothing,
        internalWebPropertyId = Core.Nothing,
        kind = "analytics#webPropertySummary",
        level = Core.Nothing,
        name = Core.Nothing,
        profiles = Core.Nothing,
        starred = Core.Nothing,
        websiteUrl = Core.Nothing
      }
  
  instance Core.FromJSON WebPropertySummary where
    parseJSON =
      Core.withObject
        "WebPropertySummary"
        ( \o ->
            WebPropertySummary
              Core.<$> (o Core..:? "id")
              Core.<*> (o Core..:? "internalWebPropertyId")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#webPropertySummary")
              Core.<*> (o Core..:? "level")
              Core.<*> (o Core..:? "name")
              Core.<*> (o Core..:? "profiles")
              Core.<*> (o Core..:? "starred")
              Core.<*> (o Core..:? "websiteUrl")
        )
  
  instance Core.ToJSON WebPropertySummary where
    toJSON WebPropertySummary {..} =
      Core.object
        ( Core.catMaybes
            [ ("id" Core..=) Core.<$> id,
              ("internalWebPropertyId" Core..=) Core.<$> internalWebPropertyId,
              Core.Just ("kind" Core..= kind),
              ("level" Core..=) Core.<$> level,
              ("name" Core..=) Core.<$> name,
              ("profiles" Core..=) Core.<$> profiles,
              ("starred" Core..=) Core.<$> starred,
              ("websiteUrl" Core..=) Core.<$> websiteUrl
            ]
        )
  
  -- | A web property collection lists Analytics web properties to which the user has access. Each resource in the collection corresponds to a single Analytics web property.
  --
  -- /See:/ 'newWebproperties' smart constructor.
  data Webproperties = Webproperties
    { -- | A list of web properties.
      items :: (Core.Maybe [Webproperty]),
      -- | The maximum number of resources the response can contain, regardless of the actual number of resources returned. Its value ranges from 1 to 1000 with a value of 1000 by default, or otherwise specified by the max-results query parameter.
      itemsPerPage :: (Core.Maybe Core.Int32),
      -- | Collection type.
      kind :: Core.Text,
      -- | Link to next page for this web property collection.
      nextLink :: (Core.Maybe Core.Text),
      -- | Link to previous page for this web property collection.
      previousLink :: (Core.Maybe Core.Text),
      -- | The starting index of the resources, which is 1 by default or otherwise specified by the start-index query parameter.
      startIndex :: (Core.Maybe Core.Int32),
      -- | The total number of results for the query, regardless of the number of results in the response.
      totalResults :: (Core.Maybe Core.Int32),
      -- | Email ID of the authenticated user
      username :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Webproperties' with the minimum fields required to make a request.
  newWebproperties ::
    Webproperties
  newWebproperties =
    Webproperties
      { items = Core.Nothing,
        itemsPerPage = Core.Nothing,
        kind = "analytics#webproperties",
        nextLink = Core.Nothing,
        previousLink = Core.Nothing,
        startIndex = Core.Nothing,
        totalResults = Core.Nothing,
        username = Core.Nothing
      }
  
  instance Core.FromJSON Webproperties where
    parseJSON =
      Core.withObject
        "Webproperties"
        ( \o ->
            Webproperties
              Core.<$> (o Core..:? "items")
              Core.<*> (o Core..:? "itemsPerPage")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#webproperties")
              Core.<*> (o Core..:? "nextLink")
              Core.<*> (o Core..:? "previousLink")
              Core.<*> (o Core..:? "startIndex")
              Core.<*> (o Core..:? "totalResults")
              Core.<*> (o Core..:? "username")
        )
  
  instance Core.ToJSON Webproperties where
    toJSON Webproperties {..} =
      Core.object
        ( Core.catMaybes
            [ ("items" Core..=) Core.<$> items,
              ("itemsPerPage" Core..=) Core.<$> itemsPerPage,
              Core.Just ("kind" Core..= kind),
              ("nextLink" Core..=) Core.<$> nextLink,
              ("previousLink" Core..=) Core.<$> previousLink,
              ("startIndex" Core..=) Core.<$> startIndex,
              ("totalResults" Core..=) Core.<$> totalResults,
              ("username" Core..=) Core.<$> username
            ]
        )
  
  -- | JSON template for an Analytics web property.
  --
  -- /See:/ 'newWebproperty' smart constructor.
  data Webproperty = Webproperty
    { -- | Account ID to which this web property belongs.
      accountId :: (Core.Maybe Core.Text),
      -- | Child link for this web property. Points to the list of views (profiles) for this web property.
      childLink :: (Core.Maybe Webproperty_ChildLink),
      -- | Time this web property was created.
      created :: (Core.Maybe Core.DateTime),
      -- | Set to true to reset the retention period of the user identifier with each new event from that user (thus setting the expiration date to current time plus retention period). Set to false to delete data associated with the user identifier automatically after the rentention period. This property cannot be set on insert.
      dataRetentionResetOnNewActivity :: (Core.Maybe Core.Bool),
      -- | The length of time for which user and event data is retained. This property cannot be set on insert.
      dataRetentionTtl :: (Core.Maybe Core.Text),
      -- | Default view (profile) ID.
      defaultProfileId :: (Core.Maybe Core.Int64),
      -- | Web property ID of the form UA-XXXXX-YY.
      id :: (Core.Maybe Core.Text),
      -- | The industry vertical\/category selected for this web property.
      industryVertical :: (Core.Maybe Core.Text),
      -- | Internal ID for this web property.
      internalWebPropertyId :: (Core.Maybe Core.Text),
      -- | Resource type for Analytics WebProperty.
      kind :: Core.Text,
      -- | Level for this web property. Possible values are STANDARD or PREMIUM.
      level :: (Core.Maybe Core.Text),
      -- | Name of this web property.
      name :: (Core.Maybe Core.Text),
      -- | Parent link for this web property. Points to the account to which this web property belongs.
      parentLink :: (Core.Maybe Webproperty_ParentLink),
      -- | Permissions the user has for this web property.
      permissions :: (Core.Maybe Webproperty_Permissions),
      -- | View (Profile) count for this web property.
      profileCount :: (Core.Maybe Core.Int32),
      -- | Link for this web property.
      selfLink :: (Core.Maybe Core.Text),
      -- | Indicates whether this web property is starred or not.
      starred :: (Core.Maybe Core.Bool),
      -- | Time this web property was last modified.
      updated :: (Core.Maybe Core.DateTime),
      -- | Website url for this web property.
      websiteUrl :: (Core.Maybe Core.Text)
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Webproperty' with the minimum fields required to make a request.
  newWebproperty ::
    Webproperty
  newWebproperty =
    Webproperty
      { accountId = Core.Nothing,
        childLink = Core.Nothing,
        created = Core.Nothing,
        dataRetentionResetOnNewActivity = Core.Nothing,
        dataRetentionTtl = Core.Nothing,
        defaultProfileId = Core.Nothing,
        id = Core.Nothing,
        industryVertical = Core.Nothing,
        internalWebPropertyId = Core.Nothing,
        kind = "analytics#webproperty",
        level = Core.Nothing,
        name = Core.Nothing,
        parentLink = Core.Nothing,
        permissions = Core.Nothing,
        profileCount = Core.Nothing,
        selfLink = Core.Nothing,
        starred = Core.Nothing,
        updated = Core.Nothing,
        websiteUrl = Core.Nothing
      }
  
  instance Core.FromJSON Webproperty where
    parseJSON =
      Core.withObject
        "Webproperty"
        ( \o ->
            Webproperty
              Core.<$> (o Core..:? "accountId")
              Core.<*> (o Core..:? "childLink")
              Core.<*> (o Core..:? "created")
              Core.<*> (o Core..:? "dataRetentionResetOnNewActivity")
              Core.<*> (o Core..:? "dataRetentionTtl")
              Core.<*> (o Core..:? "defaultProfileId" Core.<&> Core.fmap Core.fromAsText)
              Core.<*> (o Core..:? "id")
              Core.<*> (o Core..:? "industryVertical")
              Core.<*> (o Core..:? "internalWebPropertyId")
              Core.<*> (o Core..:? "kind" Core..!= "analytics#webproperty")
              Core.<*> (o Core..:? "level")
              Core.<*> (o Core..:? "name")
              Core.<*> (o Core..:? "parentLink")
              Core.<*> (o Core..:? "permissions")
              Core.<*> (o Core..:? "profileCount")
              Core.<*> (o Core..:? "selfLink")
              Core.<*> (o Core..:? "starred")
              Core.<*> (o Core..:? "updated")
              Core.<*> (o Core..:? "websiteUrl")
        )
  
  instance Core.ToJSON Webproperty where
    toJSON Webproperty {..} =
      Core.object
        ( Core.catMaybes
            [ ("accountId" Core..=) Core.<$> accountId,
              ("childLink" Core..=) Core.<$> childLink,
              ("created" Core..=) Core.<$> created,
              ("dataRetentionResetOnNewActivity" Core..=)
                Core.<$> dataRetentionResetOnNewActivity,
              ("dataRetentionTtl" Core..=) Core.<$> dataRetentionTtl,
              ("defaultProfileId" Core..=)
                Core.. Core.AsText
                Core.<$> defaultProfileId,
              ("id" Core..=) Core.<$> id,
              ("industryVertical" Core..=) Core.<$> industryVertical,
              ("internalWebPropertyId" Core..=) Core.<$> internalWebPropertyId,
              Core.Just ("kind" Core..= kind),
              ("level" Core..=) Core.<$> level,
              ("name" Core..=) Core.<$> name,
              ("parentLink" Core..=) Core.<$> parentLink,
              ("permissions" Core..=) Core.<$> permissions,
              ("profileCount" Core..=) Core.<$> profileCount,
              ("selfLink" Core..=) Core.<$> selfLink,
              ("starred" Core..=) Core.<$> starred,
              ("updated" Core..=) Core.<$> updated,
              ("websiteUrl" Core..=) Core.<$> websiteUrl
            ]
        )
  
  -- | Child link for this web property. Points to the list of views (profiles) for this web property.
  --
  -- /See:/ 'newWebproperty_ChildLink' smart constructor.
  data Webproperty_ChildLink = Webproperty_ChildLink
    { -- | Link to the list of views (profiles) for this web property.
      href :: (Core.Maybe Core.Text),
      -- | Type of the parent link. Its value is \"analytics#profiles\".
      type' :: Core.Text
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Webproperty_ChildLink' with the minimum fields required to make a request.
  newWebproperty_ChildLink ::
    Webproperty_ChildLink
  newWebproperty_ChildLink =
    Webproperty_ChildLink
      { href = Core.Nothing,
        type' = "analytics#profiles"
      }
  
  instance Core.FromJSON Webproperty_ChildLink where
    parseJSON =
      Core.withObject
        "Webproperty_ChildLink"
        ( \o ->
            Webproperty_ChildLink
              Core.<$> (o Core..:? "href")
              Core.<*> (o Core..:? "type" Core..!= "analytics#profiles")
        )
  
  instance Core.ToJSON Webproperty_ChildLink where
    toJSON Webproperty_ChildLink {..} =
      Core.object
        ( Core.catMaybes
            [("href" Core..=) Core.<$> href, Core.Just ("type" Core..= type')]
        )
  
  -- | Parent link for this web property. Points to the account to which this web property belongs.
  --
  -- /See:/ 'newWebproperty_ParentLink' smart constructor.
  data Webproperty_ParentLink = Webproperty_ParentLink
    { -- | Link to the account for this web property.
      href :: (Core.Maybe Core.Text),
      -- | Type of the parent link. Its value is \"analytics#account\".
      type' :: Core.Text
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Webproperty_ParentLink' with the minimum fields required to make a request.
  newWebproperty_ParentLink ::
    Webproperty_ParentLink
  newWebproperty_ParentLink =
    Webproperty_ParentLink
      { href = Core.Nothing,
        type' = "analytics#account"
      }
  
  instance Core.FromJSON Webproperty_ParentLink where
    parseJSON =
      Core.withObject
        "Webproperty_ParentLink"
        ( \o ->
            Webproperty_ParentLink
              Core.<$> (o Core..:? "href")
              Core.<*> (o Core..:? "type" Core..!= "analytics#account")
        )
  
  instance Core.ToJSON Webproperty_ParentLink where
    toJSON Webproperty_ParentLink {..} =
      Core.object
        ( Core.catMaybes
            [("href" Core..=) Core.<$> href, Core.Just ("type" Core..= type')]
        )
  
  -- | Permissions the user has for this web property.
  --
  -- /See:/ 'newWebproperty_Permissions' smart constructor.
  newtype Webproperty_Permissions = Webproperty_Permissions
    { -- | All the permissions that the user has for this web property. These include any implied permissions (e.g., EDIT implies VIEW) or inherited permissions from the parent account.
      effective :: (Core.Maybe [Core.Text])
    }
    deriving (Core.Eq, Core.Show, Core.Generic)
  
  -- | Creates a value of 'Webproperty_Permissions' with the minimum fields required to make a request.
  newWebproperty_Permissions ::
    Webproperty_Permissions
  newWebproperty_Permissions =
    Webproperty_Permissions {effective = Core.Nothing}
  
  instance Core.FromJSON Webproperty_Permissions where
    parseJSON =
      Core.withObject
        "Webproperty_Permissions"
        (\o -> Webproperty_Permissions Core.<$> (o Core..:? "effective"))
  
  instance Core.ToJSON Webproperty_Permissions where
    toJSON Webproperty_Permissions {..} =
      Core.object
        (Core.catMaybes [("effective" Core..=) Core.<$> effective])
  