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

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

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

import Network.Google.Analytics.Types.Sum
import Network.Google.Prelude

-- | JSON template for a user deletion request resource.
--
-- /See:/ 'userDeletionRequest' smart constructor.
data UserDeletionRequest =
  UserDeletionRequest'
    { _udrWebPropertyId :: !(Maybe Text)
    , _udrKind :: !Text
    , _udrPropertyId :: !(Maybe Text)
    , _udrId :: !(Maybe UserDeletionRequestId)
    , _udrFirebaseProjectId :: !(Maybe Text)
    , _udrDeletionRequestTime :: !(Maybe DateTime')
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'UserDeletionRequest' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'udrWebPropertyId'
--
-- * 'udrKind'
--
-- * 'udrPropertyId'
--
-- * 'udrId'
--
-- * 'udrFirebaseProjectId'
--
-- * 'udrDeletionRequestTime'
userDeletionRequest
    :: UserDeletionRequest
userDeletionRequest =
  UserDeletionRequest'
    { _udrWebPropertyId = Nothing
    , _udrKind = "analytics#userDeletionRequest"
    , _udrPropertyId = Nothing
    , _udrId = Nothing
    , _udrFirebaseProjectId = Nothing
    , _udrDeletionRequestTime = Nothing
    }


-- | Web property ID of the form UA-XXXXX-YY.
udrWebPropertyId :: Lens' UserDeletionRequest (Maybe Text)
udrWebPropertyId
  = lens _udrWebPropertyId
      (\ s a -> s{_udrWebPropertyId = a})

-- | Value is \"analytics#userDeletionRequest\".
udrKind :: Lens' UserDeletionRequest Text
udrKind = lens _udrKind (\ s a -> s{_udrKind = a})

-- | Property ID
udrPropertyId :: Lens' UserDeletionRequest (Maybe Text)
udrPropertyId
  = lens _udrPropertyId
      (\ s a -> s{_udrPropertyId = a})

-- | User ID.
udrId :: Lens' UserDeletionRequest (Maybe UserDeletionRequestId)
udrId = lens _udrId (\ s a -> s{_udrId = a})

-- | Firebase Project Id
udrFirebaseProjectId :: Lens' UserDeletionRequest (Maybe Text)
udrFirebaseProjectId
  = lens _udrFirebaseProjectId
      (\ s a -> s{_udrFirebaseProjectId = a})

-- | This marks the point in time for which all user data before should be
-- deleted
udrDeletionRequestTime :: Lens' UserDeletionRequest (Maybe UTCTime)
udrDeletionRequestTime
  = lens _udrDeletionRequestTime
      (\ s a -> s{_udrDeletionRequestTime = a})
      . mapping _DateTime

instance FromJSON UserDeletionRequest where
        parseJSON
          = withObject "UserDeletionRequest"
              (\ o ->
                 UserDeletionRequest' <$>
                   (o .:? "webPropertyId") <*>
                     (o .:? "kind" .!= "analytics#userDeletionRequest")
                     <*> (o .:? "propertyId")
                     <*> (o .:? "id")
                     <*> (o .:? "firebaseProjectId")
                     <*> (o .:? "deletionRequestTime"))

instance ToJSON UserDeletionRequest where
        toJSON UserDeletionRequest'{..}
          = object
              (catMaybes
                 [("webPropertyId" .=) <$> _udrWebPropertyId,
                  Just ("kind" .= _udrKind),
                  ("propertyId" .=) <$> _udrPropertyId,
                  ("id" .=) <$> _udrId,
                  ("firebaseProjectId" .=) <$> _udrFirebaseProjectId,
                  ("deletionRequestTime" .=) <$>
                    _udrDeletionRequestTime])

-- | 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:/ 'unSampledReports' smart constructor.
data UnSampledReports =
  UnSampledReports'
    { _usrNextLink :: !(Maybe Text)
    , _usrItemsPerPage :: !(Maybe (Textual Int32))
    , _usrKind :: !Text
    , _usrUsername :: !(Maybe Text)
    , _usrItems :: !(Maybe [UnSampledReport])
    , _usrTotalResults :: !(Maybe (Textual Int32))
    , _usrStartIndex :: !(Maybe (Textual Int32))
    , _usrPreviousLink :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'UnSampledReports' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'usrNextLink'
--
-- * 'usrItemsPerPage'
--
-- * 'usrKind'
--
-- * 'usrUsername'
--
-- * 'usrItems'
--
-- * 'usrTotalResults'
--
-- * 'usrStartIndex'
--
-- * 'usrPreviousLink'
unSampledReports
    :: UnSampledReports
unSampledReports =
  UnSampledReports'
    { _usrNextLink = Nothing
    , _usrItemsPerPage = Nothing
    , _usrKind = "analytics#unsampledReports"
    , _usrUsername = Nothing
    , _usrItems = Nothing
    , _usrTotalResults = Nothing
    , _usrStartIndex = Nothing
    , _usrPreviousLink = Nothing
    }


-- | Link to next page for this unsampled report collection.
usrNextLink :: Lens' UnSampledReports (Maybe Text)
usrNextLink
  = lens _usrNextLink (\ s a -> s{_usrNextLink = a})

-- | 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.
usrItemsPerPage :: Lens' UnSampledReports (Maybe Int32)
usrItemsPerPage
  = lens _usrItemsPerPage
      (\ s a -> s{_usrItemsPerPage = a})
      . mapping _Coerce

-- | Collection type.
usrKind :: Lens' UnSampledReports Text
usrKind = lens _usrKind (\ s a -> s{_usrKind = a})

-- | Email ID of the authenticated user
usrUsername :: Lens' UnSampledReports (Maybe Text)
usrUsername
  = lens _usrUsername (\ s a -> s{_usrUsername = a})

-- | A list of unsampled reports.
usrItems :: Lens' UnSampledReports [UnSampledReport]
usrItems
  = lens _usrItems (\ s a -> s{_usrItems = a}) .
      _Default
      . _Coerce

-- | The total number of results for the query, regardless of the number of
-- resources in the result.
usrTotalResults :: Lens' UnSampledReports (Maybe Int32)
usrTotalResults
  = lens _usrTotalResults
      (\ s a -> s{_usrTotalResults = a})
      . mapping _Coerce

-- | The starting index of the resources, which is 1 by default or otherwise
-- specified by the start-index query parameter.
usrStartIndex :: Lens' UnSampledReports (Maybe Int32)
usrStartIndex
  = lens _usrStartIndex
      (\ s a -> s{_usrStartIndex = a})
      . mapping _Coerce

-- | Link to previous page for this unsampled report collection.
usrPreviousLink :: Lens' UnSampledReports (Maybe Text)
usrPreviousLink
  = lens _usrPreviousLink
      (\ s a -> s{_usrPreviousLink = a})

instance FromJSON UnSampledReports where
        parseJSON
          = withObject "UnSampledReports"
              (\ o ->
                 UnSampledReports' <$>
                   (o .:? "nextLink") <*> (o .:? "itemsPerPage") <*>
                     (o .:? "kind" .!= "analytics#unsampledReports")
                     <*> (o .:? "username")
                     <*> (o .:? "items" .!= mempty)
                     <*> (o .:? "totalResults")
                     <*> (o .:? "startIndex")
                     <*> (o .:? "previousLink"))

instance ToJSON UnSampledReports where
        toJSON UnSampledReports'{..}
          = object
              (catMaybes
                 [("nextLink" .=) <$> _usrNextLink,
                  ("itemsPerPage" .=) <$> _usrItemsPerPage,
                  Just ("kind" .= _usrKind),
                  ("username" .=) <$> _usrUsername,
                  ("items" .=) <$> _usrItems,
                  ("totalResults" .=) <$> _usrTotalResults,
                  ("startIndex" .=) <$> _usrStartIndex,
                  ("previousLink" .=) <$> _usrPreviousLink])

--
-- /See:/ 'goalURLDestinationDetailsStepsItem' smart constructor.
data GoalURLDestinationDetailsStepsItem =
  GoalURLDestinationDetailsStepsItem'
    { _guddsiURL :: !(Maybe Text)
    , _guddsiName :: !(Maybe Text)
    , _guddsiNumber :: !(Maybe (Textual Int32))
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'GoalURLDestinationDetailsStepsItem' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'guddsiURL'
--
-- * 'guddsiName'
--
-- * 'guddsiNumber'
goalURLDestinationDetailsStepsItem
    :: GoalURLDestinationDetailsStepsItem
goalURLDestinationDetailsStepsItem =
  GoalURLDestinationDetailsStepsItem'
    {_guddsiURL = Nothing, _guddsiName = Nothing, _guddsiNumber = Nothing}


-- | URL for this step.
guddsiURL :: Lens' GoalURLDestinationDetailsStepsItem (Maybe Text)
guddsiURL
  = lens _guddsiURL (\ s a -> s{_guddsiURL = a})

-- | Step name.
guddsiName :: Lens' GoalURLDestinationDetailsStepsItem (Maybe Text)
guddsiName
  = lens _guddsiName (\ s a -> s{_guddsiName = a})

-- | Step number.
guddsiNumber :: Lens' GoalURLDestinationDetailsStepsItem (Maybe Int32)
guddsiNumber
  = lens _guddsiNumber (\ s a -> s{_guddsiNumber = a})
      . mapping _Coerce

instance FromJSON GoalURLDestinationDetailsStepsItem
         where
        parseJSON
          = withObject "GoalURLDestinationDetailsStepsItem"
              (\ o ->
                 GoalURLDestinationDetailsStepsItem' <$>
                   (o .:? "url") <*> (o .:? "name") <*>
                     (o .:? "number"))

instance ToJSON GoalURLDestinationDetailsStepsItem
         where
        toJSON GoalURLDestinationDetailsStepsItem'{..}
          = object
              (catMaybes
                 [("url" .=) <$> _guddsiURL,
                  ("name" .=) <$> _guddsiName,
                  ("number" .=) <$> _guddsiNumber])

-- | Analytics data request query parameters.
--
-- /See:/ 'gaDataQuery' smart constructor.
data GaDataQuery =
  GaDataQuery'
    { _gdqMetrics :: !(Maybe [Text])
    , _gdqSamplingLevel :: !(Maybe Text)
    , _gdqFilters :: !(Maybe Text)
    , _gdqIds :: !(Maybe Text)
    , _gdqEndDate :: !(Maybe Text)
    , _gdqSort :: !(Maybe [Text])
    , _gdqDimensions :: !(Maybe Text)
    , _gdqStartIndex :: !(Maybe (Textual Int32))
    , _gdqMaxResults :: !(Maybe (Textual Int32))
    , _gdqSegment :: !(Maybe Text)
    , _gdqStartDate :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'GaDataQuery' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'gdqMetrics'
--
-- * 'gdqSamplingLevel'
--
-- * 'gdqFilters'
--
-- * 'gdqIds'
--
-- * 'gdqEndDate'
--
-- * 'gdqSort'
--
-- * 'gdqDimensions'
--
-- * 'gdqStartIndex'
--
-- * 'gdqMaxResults'
--
-- * 'gdqSegment'
--
-- * 'gdqStartDate'
gaDataQuery
    :: GaDataQuery
gaDataQuery =
  GaDataQuery'
    { _gdqMetrics = Nothing
    , _gdqSamplingLevel = Nothing
    , _gdqFilters = Nothing
    , _gdqIds = Nothing
    , _gdqEndDate = Nothing
    , _gdqSort = Nothing
    , _gdqDimensions = Nothing
    , _gdqStartIndex = Nothing
    , _gdqMaxResults = Nothing
    , _gdqSegment = Nothing
    , _gdqStartDate = Nothing
    }


-- | List of analytics metrics.
gdqMetrics :: Lens' GaDataQuery [Text]
gdqMetrics
  = lens _gdqMetrics (\ s a -> s{_gdqMetrics = a}) .
      _Default
      . _Coerce

-- | Desired sampling level
gdqSamplingLevel :: Lens' GaDataQuery (Maybe Text)
gdqSamplingLevel
  = lens _gdqSamplingLevel
      (\ s a -> s{_gdqSamplingLevel = a})

-- | Comma-separated list of dimension or metric filters.
gdqFilters :: Lens' GaDataQuery (Maybe Text)
gdqFilters
  = lens _gdqFilters (\ s a -> s{_gdqFilters = a})

-- | Unique table ID.
gdqIds :: Lens' GaDataQuery (Maybe Text)
gdqIds = lens _gdqIds (\ s a -> s{_gdqIds = a})

-- | End date.
gdqEndDate :: Lens' GaDataQuery (Maybe Text)
gdqEndDate
  = lens _gdqEndDate (\ s a -> s{_gdqEndDate = a})

-- | List of dimensions or metrics based on which Analytics data is sorted.
gdqSort :: Lens' GaDataQuery [Text]
gdqSort
  = lens _gdqSort (\ s a -> s{_gdqSort = a}) . _Default
      . _Coerce

-- | List of analytics dimensions.
gdqDimensions :: Lens' GaDataQuery (Maybe Text)
gdqDimensions
  = lens _gdqDimensions
      (\ s a -> s{_gdqDimensions = a})

-- | Start index.
gdqStartIndex :: Lens' GaDataQuery (Maybe Int32)
gdqStartIndex
  = lens _gdqStartIndex
      (\ s a -> s{_gdqStartIndex = a})
      . mapping _Coerce

-- | Maximum results per page.
gdqMaxResults :: Lens' GaDataQuery (Maybe Int32)
gdqMaxResults
  = lens _gdqMaxResults
      (\ s a -> s{_gdqMaxResults = a})
      . mapping _Coerce

-- | Analytics advanced segment.
gdqSegment :: Lens' GaDataQuery (Maybe Text)
gdqSegment
  = lens _gdqSegment (\ s a -> s{_gdqSegment = a})

-- | Start date.
gdqStartDate :: Lens' GaDataQuery (Maybe Text)
gdqStartDate
  = lens _gdqStartDate (\ s a -> s{_gdqStartDate = a})

instance FromJSON GaDataQuery where
        parseJSON
          = withObject "GaDataQuery"
              (\ o ->
                 GaDataQuery' <$>
                   (o .:? "metrics" .!= mempty) <*>
                     (o .:? "samplingLevel")
                     <*> (o .:? "filters")
                     <*> (o .:? "ids")
                     <*> (o .:? "end-date")
                     <*> (o .:? "sort" .!= mempty)
                     <*> (o .:? "dimensions")
                     <*> (o .:? "start-index")
                     <*> (o .:? "max-results")
                     <*> (o .:? "segment")
                     <*> (o .:? "start-date"))

instance ToJSON GaDataQuery where
        toJSON GaDataQuery'{..}
          = object
              (catMaybes
                 [("metrics" .=) <$> _gdqMetrics,
                  ("samplingLevel" .=) <$> _gdqSamplingLevel,
                  ("filters" .=) <$> _gdqFilters,
                  ("ids" .=) <$> _gdqIds,
                  ("end-date" .=) <$> _gdqEndDate,
                  ("sort" .=) <$> _gdqSort,
                  ("dimensions" .=) <$> _gdqDimensions,
                  ("start-index" .=) <$> _gdqStartIndex,
                  ("max-results" .=) <$> _gdqMaxResults,
                  ("segment" .=) <$> _gdqSegment,
                  ("start-date" .=) <$> _gdqStartDate])

-- | 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:/ 'remarketingAudiences' smart constructor.
data RemarketingAudiences =
  RemarketingAudiences'
    { _raNextLink :: !(Maybe Text)
    , _raItemsPerPage :: !(Maybe (Textual Int32))
    , _raKind :: !Text
    , _raUsername :: !(Maybe Text)
    , _raItems :: !(Maybe [RemarketingAudience])
    , _raTotalResults :: !(Maybe (Textual Int32))
    , _raStartIndex :: !(Maybe (Textual Int32))
    , _raPreviousLink :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'RemarketingAudiences' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'raNextLink'
--
-- * 'raItemsPerPage'
--
-- * 'raKind'
--
-- * 'raUsername'
--
-- * 'raItems'
--
-- * 'raTotalResults'
--
-- * 'raStartIndex'
--
-- * 'raPreviousLink'
remarketingAudiences
    :: RemarketingAudiences
remarketingAudiences =
  RemarketingAudiences'
    { _raNextLink = Nothing
    , _raItemsPerPage = Nothing
    , _raKind = "analytics#remarketingAudiences"
    , _raUsername = Nothing
    , _raItems = Nothing
    , _raTotalResults = Nothing
    , _raStartIndex = Nothing
    , _raPreviousLink = Nothing
    }


-- | Link to next page for this remarketing audience collection.
raNextLink :: Lens' RemarketingAudiences (Maybe Text)
raNextLink
  = lens _raNextLink (\ s a -> s{_raNextLink = a})

-- | 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.
raItemsPerPage :: Lens' RemarketingAudiences (Maybe Int32)
raItemsPerPage
  = lens _raItemsPerPage
      (\ s a -> s{_raItemsPerPage = a})
      . mapping _Coerce

-- | Collection type.
raKind :: Lens' RemarketingAudiences Text
raKind = lens _raKind (\ s a -> s{_raKind = a})

-- | Email ID of the authenticated user
raUsername :: Lens' RemarketingAudiences (Maybe Text)
raUsername
  = lens _raUsername (\ s a -> s{_raUsername = a})

-- | A list of remarketing audiences.
raItems :: Lens' RemarketingAudiences [RemarketingAudience]
raItems
  = lens _raItems (\ s a -> s{_raItems = a}) . _Default
      . _Coerce

-- | The total number of results for the query, regardless of the number of
-- results in the response.
raTotalResults :: Lens' RemarketingAudiences (Maybe Int32)
raTotalResults
  = lens _raTotalResults
      (\ s a -> s{_raTotalResults = a})
      . mapping _Coerce

-- | The starting index of the resources, which is 1 by default or otherwise
-- specified by the start-index query parameter.
raStartIndex :: Lens' RemarketingAudiences (Maybe Int32)
raStartIndex
  = lens _raStartIndex (\ s a -> s{_raStartIndex = a})
      . mapping _Coerce

-- | Link to previous page for this view (profile) collection.
raPreviousLink :: Lens' RemarketingAudiences (Maybe Text)
raPreviousLink
  = lens _raPreviousLink
      (\ s a -> s{_raPreviousLink = a})

instance FromJSON RemarketingAudiences where
        parseJSON
          = withObject "RemarketingAudiences"
              (\ o ->
                 RemarketingAudiences' <$>
                   (o .:? "nextLink") <*> (o .:? "itemsPerPage") <*>
                     (o .:? "kind" .!= "analytics#remarketingAudiences")
                     <*> (o .:? "username")
                     <*> (o .:? "items" .!= mempty)
                     <*> (o .:? "totalResults")
                     <*> (o .:? "startIndex")
                     <*> (o .:? "previousLink"))

instance ToJSON RemarketingAudiences where
        toJSON RemarketingAudiences'{..}
          = object
              (catMaybes
                 [("nextLink" .=) <$> _raNextLink,
                  ("itemsPerPage" .=) <$> _raItemsPerPage,
                  Just ("kind" .= _raKind),
                  ("username" .=) <$> _raUsername,
                  ("items" .=) <$> _raItems,
                  ("totalResults" .=) <$> _raTotalResults,
                  ("startIndex" .=) <$> _raStartIndex,
                  ("previousLink" .=) <$> _raPreviousLink])

--
-- /See:/ 'gaDataDataTableRowsItem' smart constructor.
newtype GaDataDataTableRowsItem =
  GaDataDataTableRowsItem'
    { _gddtriC :: Maybe [GaDataDataTableRowsItemCItem]
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'GaDataDataTableRowsItem' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'gddtriC'
gaDataDataTableRowsItem
    :: GaDataDataTableRowsItem
gaDataDataTableRowsItem = GaDataDataTableRowsItem' {_gddtriC = Nothing}


gddtriC :: Lens' GaDataDataTableRowsItem [GaDataDataTableRowsItemCItem]
gddtriC
  = lens _gddtriC (\ s a -> s{_gddtriC = a}) . _Default
      . _Coerce

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

instance ToJSON GaDataDataTableRowsItem where
        toJSON GaDataDataTableRowsItem'{..}
          = object (catMaybes [("c" .=) <$> _gddtriC])

-- | JSON template for Analytics unsampled report resource.
--
-- /See:/ 'unSampledReport' smart constructor.
data UnSampledReport =
  UnSampledReport'
    { _uDownloadType :: !(Maybe Text)
    , _uStatus :: !(Maybe Text)
    , _uMetrics :: !(Maybe Text)
    , _uDriveDownloadDetails :: !(Maybe UnSampledReportDriveDownloadDetails)
    , _uWebPropertyId :: !(Maybe Text)
    , _uKind :: !Text
    , _uCreated :: !(Maybe DateTime')
    , _uFilters :: !(Maybe Text)
    , _uProFileId :: !(Maybe Text)
    , _uEndDate :: !(Maybe Text)
    , _uSelfLink :: !(Maybe Text)
    , _uAccountId :: !(Maybe Text)
    , _uId :: !(Maybe Text)
    , _uUpdated :: !(Maybe DateTime')
    , _uTitle :: !(Maybe Text)
    , _uDimensions :: !(Maybe Text)
    , _uSegment :: !(Maybe Text)
    , _uCloudStorageDownloadDetails :: !(Maybe UnSampledReportCloudStorageDownloadDetails)
    , _uStartDate :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'UnSampledReport' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'uDownloadType'
--
-- * 'uStatus'
--
-- * 'uMetrics'
--
-- * 'uDriveDownloadDetails'
--
-- * 'uWebPropertyId'
--
-- * 'uKind'
--
-- * 'uCreated'
--
-- * 'uFilters'
--
-- * 'uProFileId'
--
-- * 'uEndDate'
--
-- * 'uSelfLink'
--
-- * 'uAccountId'
--
-- * 'uId'
--
-- * 'uUpdated'
--
-- * 'uTitle'
--
-- * 'uDimensions'
--
-- * 'uSegment'
--
-- * 'uCloudStorageDownloadDetails'
--
-- * 'uStartDate'
unSampledReport
    :: UnSampledReport
unSampledReport =
  UnSampledReport'
    { _uDownloadType = Nothing
    , _uStatus = Nothing
    , _uMetrics = Nothing
    , _uDriveDownloadDetails = Nothing
    , _uWebPropertyId = Nothing
    , _uKind = "analytics#unsampledReport"
    , _uCreated = Nothing
    , _uFilters = Nothing
    , _uProFileId = Nothing
    , _uEndDate = Nothing
    , _uSelfLink = Nothing
    , _uAccountId = Nothing
    , _uId = Nothing
    , _uUpdated = Nothing
    , _uTitle = Nothing
    , _uDimensions = Nothing
    , _uSegment = Nothing
    , _uCloudStorageDownloadDetails = Nothing
    , _uStartDate = Nothing
    }


-- | 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.
uDownloadType :: Lens' UnSampledReport (Maybe Text)
uDownloadType
  = lens _uDownloadType
      (\ s a -> s{_uDownloadType = a})

-- | Status of this unsampled report. Possible values are PENDING, COMPLETED,
-- or FAILED.
uStatus :: Lens' UnSampledReport (Maybe Text)
uStatus = lens _uStatus (\ s a -> s{_uStatus = a})

-- | The metrics for the unsampled report.
uMetrics :: Lens' UnSampledReport (Maybe Text)
uMetrics = lens _uMetrics (\ s a -> s{_uMetrics = a})

-- | Download details for a file stored in Google Drive.
uDriveDownloadDetails :: Lens' UnSampledReport (Maybe UnSampledReportDriveDownloadDetails)
uDriveDownloadDetails
  = lens _uDriveDownloadDetails
      (\ s a -> s{_uDriveDownloadDetails = a})

-- | Web property ID to which this unsampled report belongs. The web property
-- ID is of the form UA-XXXXX-YY.
uWebPropertyId :: Lens' UnSampledReport (Maybe Text)
uWebPropertyId
  = lens _uWebPropertyId
      (\ s a -> s{_uWebPropertyId = a})

-- | Resource type for an Analytics unsampled report.
uKind :: Lens' UnSampledReport Text
uKind = lens _uKind (\ s a -> s{_uKind = a})

-- | Time this unsampled report was created.
uCreated :: Lens' UnSampledReport (Maybe UTCTime)
uCreated
  = lens _uCreated (\ s a -> s{_uCreated = a}) .
      mapping _DateTime

-- | The filters for the unsampled report.
uFilters :: Lens' UnSampledReport (Maybe Text)
uFilters = lens _uFilters (\ s a -> s{_uFilters = a})

-- | View (Profile) ID to which this unsampled report belongs.
uProFileId :: Lens' UnSampledReport (Maybe Text)
uProFileId
  = lens _uProFileId (\ s a -> s{_uProFileId = a})

-- | The end date for the unsampled report.
uEndDate :: Lens' UnSampledReport (Maybe Text)
uEndDate = lens _uEndDate (\ s a -> s{_uEndDate = a})

-- | Link for this unsampled report.
uSelfLink :: Lens' UnSampledReport (Maybe Text)
uSelfLink
  = lens _uSelfLink (\ s a -> s{_uSelfLink = a})

-- | Account ID to which this unsampled report belongs.
uAccountId :: Lens' UnSampledReport (Maybe Text)
uAccountId
  = lens _uAccountId (\ s a -> s{_uAccountId = a})

-- | Unsampled report ID.
uId :: Lens' UnSampledReport (Maybe Text)
uId = lens _uId (\ s a -> s{_uId = a})

-- | Time this unsampled report was last modified.
uUpdated :: Lens' UnSampledReport (Maybe UTCTime)
uUpdated
  = lens _uUpdated (\ s a -> s{_uUpdated = a}) .
      mapping _DateTime

-- | Title of the unsampled report.
uTitle :: Lens' UnSampledReport (Maybe Text)
uTitle = lens _uTitle (\ s a -> s{_uTitle = a})

-- | The dimensions for the unsampled report.
uDimensions :: Lens' UnSampledReport (Maybe Text)
uDimensions
  = lens _uDimensions (\ s a -> s{_uDimensions = a})

-- | The segment for the unsampled report.
uSegment :: Lens' UnSampledReport (Maybe Text)
uSegment = lens _uSegment (\ s a -> s{_uSegment = a})

-- | Download details for a file stored in Google Cloud Storage.
uCloudStorageDownloadDetails :: Lens' UnSampledReport (Maybe UnSampledReportCloudStorageDownloadDetails)
uCloudStorageDownloadDetails
  = lens _uCloudStorageDownloadDetails
      (\ s a -> s{_uCloudStorageDownloadDetails = a})

-- | The start date for the unsampled report.
uStartDate :: Lens' UnSampledReport (Maybe Text)
uStartDate
  = lens _uStartDate (\ s a -> s{_uStartDate = a})

instance FromJSON UnSampledReport where
        parseJSON
          = withObject "UnSampledReport"
              (\ o ->
                 UnSampledReport' <$>
                   (o .:? "downloadType") <*> (o .:? "status") <*>
                     (o .:? "metrics")
                     <*> (o .:? "driveDownloadDetails")
                     <*> (o .:? "webPropertyId")
                     <*> (o .:? "kind" .!= "analytics#unsampledReport")
                     <*> (o .:? "created")
                     <*> (o .:? "filters")
                     <*> (o .:? "profileId")
                     <*> (o .:? "end-date")
                     <*> (o .:? "selfLink")
                     <*> (o .:? "accountId")
                     <*> (o .:? "id")
                     <*> (o .:? "updated")
                     <*> (o .:? "title")
                     <*> (o .:? "dimensions")
                     <*> (o .:? "segment")
                     <*> (o .:? "cloudStorageDownloadDetails")
                     <*> (o .:? "start-date"))

instance ToJSON UnSampledReport where
        toJSON UnSampledReport'{..}
          = object
              (catMaybes
                 [("downloadType" .=) <$> _uDownloadType,
                  ("status" .=) <$> _uStatus,
                  ("metrics" .=) <$> _uMetrics,
                  ("driveDownloadDetails" .=) <$>
                    _uDriveDownloadDetails,
                  ("webPropertyId" .=) <$> _uWebPropertyId,
                  Just ("kind" .= _uKind),
                  ("created" .=) <$> _uCreated,
                  ("filters" .=) <$> _uFilters,
                  ("profileId" .=) <$> _uProFileId,
                  ("end-date" .=) <$> _uEndDate,
                  ("selfLink" .=) <$> _uSelfLink,
                  ("accountId" .=) <$> _uAccountId, ("id" .=) <$> _uId,
                  ("updated" .=) <$> _uUpdated,
                  ("title" .=) <$> _uTitle,
                  ("dimensions" .=) <$> _uDimensions,
                  ("segment" .=) <$> _uSegment,
                  ("cloudStorageDownloadDetails" .=) <$>
                    _uCloudStorageDownloadDetails,
                  ("start-date" .=) <$> _uStartDate])

--
-- /See:/ 'mcfDataColumnHeadersItem' smart constructor.
data McfDataColumnHeadersItem =
  McfDataColumnHeadersItem'
    { _mdchiColumnType :: !(Maybe Text)
    , _mdchiName :: !(Maybe Text)
    , _mdchiDataType :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'McfDataColumnHeadersItem' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'mdchiColumnType'
--
-- * 'mdchiName'
--
-- * 'mdchiDataType'
mcfDataColumnHeadersItem
    :: McfDataColumnHeadersItem
mcfDataColumnHeadersItem =
  McfDataColumnHeadersItem'
    {_mdchiColumnType = Nothing, _mdchiName = Nothing, _mdchiDataType = Nothing}


-- | Column Type. Either DIMENSION or METRIC.
mdchiColumnType :: Lens' McfDataColumnHeadersItem (Maybe Text)
mdchiColumnType
  = lens _mdchiColumnType
      (\ s a -> s{_mdchiColumnType = a})

-- | Column name.
mdchiName :: Lens' McfDataColumnHeadersItem (Maybe Text)
mdchiName
  = lens _mdchiName (\ s a -> s{_mdchiName = a})

-- | Data type. Dimension and metric values data types such as INTEGER,
-- DOUBLE, CURRENCY, MCF_SEQUENCE etc.
mdchiDataType :: Lens' McfDataColumnHeadersItem (Maybe Text)
mdchiDataType
  = lens _mdchiDataType
      (\ s a -> s{_mdchiDataType = a})

instance FromJSON McfDataColumnHeadersItem where
        parseJSON
          = withObject "McfDataColumnHeadersItem"
              (\ o ->
                 McfDataColumnHeadersItem' <$>
                   (o .:? "columnType") <*> (o .:? "name") <*>
                     (o .:? "dataType"))

instance ToJSON McfDataColumnHeadersItem where
        toJSON McfDataColumnHeadersItem'{..}
          = object
              (catMaybes
                 [("columnType" .=) <$> _mdchiColumnType,
                  ("name" .=) <$> _mdchiName,
                  ("dataType" .=) <$> _mdchiDataType])

-- | 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:/ 'gaDataTotalsForAllResults' smart constructor.
newtype GaDataTotalsForAllResults =
  GaDataTotalsForAllResults'
    { _gdtfarAddtional :: HashMap Text Text
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'GaDataTotalsForAllResults' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'gdtfarAddtional'
gaDataTotalsForAllResults
    :: HashMap Text Text -- ^ 'gdtfarAddtional'
    -> GaDataTotalsForAllResults
gaDataTotalsForAllResults pGdtfarAddtional_ =
  GaDataTotalsForAllResults' {_gdtfarAddtional = _Coerce # pGdtfarAddtional_}


-- | 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.
gdtfarAddtional :: Lens' GaDataTotalsForAllResults (HashMap Text Text)
gdtfarAddtional
  = lens _gdtfarAddtional
      (\ s a -> s{_gdtfarAddtional = a})
      . _Coerce

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

instance ToJSON GaDataTotalsForAllResults where
        toJSON = toJSON . _gdtfarAddtional

-- | Parent link for this view (profile). Points to the web property to which
-- this view (profile) belongs.
--
-- /See:/ 'proFileParentLink' smart constructor.
data ProFileParentLink =
  ProFileParentLink'
    { _pfplHref :: !(Maybe Text)
    , _pfplType :: !Text
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'ProFileParentLink' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'pfplHref'
--
-- * 'pfplType'
proFileParentLink
    :: ProFileParentLink
proFileParentLink =
  ProFileParentLink' {_pfplHref = Nothing, _pfplType = "analytics#webproperty"}


-- | Link to the web property to which this view (profile) belongs.
pfplHref :: Lens' ProFileParentLink (Maybe Text)
pfplHref = lens _pfplHref (\ s a -> s{_pfplHref = a})

-- | Value is \"analytics#webproperty\".
pfplType :: Lens' ProFileParentLink Text
pfplType = lens _pfplType (\ s a -> s{_pfplType = a})

instance FromJSON ProFileParentLink where
        parseJSON
          = withObject "ProFileParentLink"
              (\ o ->
                 ProFileParentLink' <$>
                   (o .:? "href") <*>
                     (o .:? "type" .!= "analytics#webproperty"))

instance ToJSON ProFileParentLink where
        toJSON ProFileParentLink'{..}
          = object
              (catMaybes
                 [("href" .=) <$> _pfplHref,
                  Just ("type" .= _pfplType)])

-- | JSON template for an Analytics remarketing audience.
--
-- /See:/ 'remarketingAudience' smart constructor.
data RemarketingAudience =
  RemarketingAudience'
    { _rWebPropertyId :: !(Maybe Text)
    , _rKind :: !Text
    , _rCreated :: !(Maybe DateTime')
    , _rLinkedAdAccounts :: !(Maybe [LinkedForeignAccount])
    , _rAudienceDefinition :: !(Maybe RemarketingAudienceAudienceDefinition)
    , _rAudienceType :: !(Maybe Text)
    , _rAccountId :: !(Maybe Text)
    , _rName :: !(Maybe Text)
    , _rStateBasedAudienceDefinition :: !(Maybe RemarketingAudienceStateBasedAudienceDefinition)
    , _rLinkedViews :: !(Maybe [Text])
    , _rInternalWebPropertyId :: !(Maybe Text)
    , _rId :: !(Maybe Text)
    , _rUpdated :: !(Maybe DateTime')
    , _rDescription :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'RemarketingAudience' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'rWebPropertyId'
--
-- * 'rKind'
--
-- * 'rCreated'
--
-- * 'rLinkedAdAccounts'
--
-- * 'rAudienceDefinition'
--
-- * 'rAudienceType'
--
-- * 'rAccountId'
--
-- * 'rName'
--
-- * 'rStateBasedAudienceDefinition'
--
-- * 'rLinkedViews'
--
-- * 'rInternalWebPropertyId'
--
-- * 'rId'
--
-- * 'rUpdated'
--
-- * 'rDescription'
remarketingAudience
    :: RemarketingAudience
remarketingAudience =
  RemarketingAudience'
    { _rWebPropertyId = Nothing
    , _rKind = "analytics#remarketingAudience"
    , _rCreated = Nothing
    , _rLinkedAdAccounts = Nothing
    , _rAudienceDefinition = Nothing
    , _rAudienceType = Nothing
    , _rAccountId = Nothing
    , _rName = Nothing
    , _rStateBasedAudienceDefinition = Nothing
    , _rLinkedViews = Nothing
    , _rInternalWebPropertyId = Nothing
    , _rId = Nothing
    , _rUpdated = Nothing
    , _rDescription = Nothing
    }


-- | Web property ID of the form UA-XXXXX-YY to which this remarketing
-- audience belongs.
rWebPropertyId :: Lens' RemarketingAudience (Maybe Text)
rWebPropertyId
  = lens _rWebPropertyId
      (\ s a -> s{_rWebPropertyId = a})

-- | Collection type.
rKind :: Lens' RemarketingAudience Text
rKind = lens _rKind (\ s a -> s{_rKind = a})

-- | Time this remarketing audience was created.
rCreated :: Lens' RemarketingAudience (Maybe UTCTime)
rCreated
  = lens _rCreated (\ s a -> s{_rCreated = a}) .
      mapping _DateTime

-- | The linked ad accounts associated with this remarketing audience. A
-- remarketing audience can have only one linkedAdAccount currently.
rLinkedAdAccounts :: Lens' RemarketingAudience [LinkedForeignAccount]
rLinkedAdAccounts
  = lens _rLinkedAdAccounts
      (\ s a -> s{_rLinkedAdAccounts = a})
      . _Default
      . _Coerce

-- | The simple audience definition that will cause a user to be added to an
-- audience.
rAudienceDefinition :: Lens' RemarketingAudience (Maybe RemarketingAudienceAudienceDefinition)
rAudienceDefinition
  = lens _rAudienceDefinition
      (\ s a -> s{_rAudienceDefinition = a})

-- | The type of audience, either SIMPLE or STATE_BASED.
rAudienceType :: Lens' RemarketingAudience (Maybe Text)
rAudienceType
  = lens _rAudienceType
      (\ s a -> s{_rAudienceType = a})

-- | Account ID to which this remarketing audience belongs.
rAccountId :: Lens' RemarketingAudience (Maybe Text)
rAccountId
  = lens _rAccountId (\ s a -> s{_rAccountId = a})

-- | The name of this remarketing audience.
rName :: Lens' RemarketingAudience (Maybe Text)
rName = lens _rName (\ s a -> s{_rName = a})

-- | A state based audience definition that will cause a user to be added or
-- removed from an audience.
rStateBasedAudienceDefinition :: Lens' RemarketingAudience (Maybe RemarketingAudienceStateBasedAudienceDefinition)
rStateBasedAudienceDefinition
  = lens _rStateBasedAudienceDefinition
      (\ s a -> s{_rStateBasedAudienceDefinition = a})

-- | The views (profiles) that this remarketing audience is linked to.
rLinkedViews :: Lens' RemarketingAudience [Text]
rLinkedViews
  = lens _rLinkedViews (\ s a -> s{_rLinkedViews = a})
      . _Default
      . _Coerce

-- | Internal ID for the web property to which this remarketing audience
-- belongs.
rInternalWebPropertyId :: Lens' RemarketingAudience (Maybe Text)
rInternalWebPropertyId
  = lens _rInternalWebPropertyId
      (\ s a -> s{_rInternalWebPropertyId = a})

-- | Remarketing Audience ID.
rId :: Lens' RemarketingAudience (Maybe Text)
rId = lens _rId (\ s a -> s{_rId = a})

-- | Time this remarketing audience was last modified.
rUpdated :: Lens' RemarketingAudience (Maybe UTCTime)
rUpdated
  = lens _rUpdated (\ s a -> s{_rUpdated = a}) .
      mapping _DateTime

-- | The description of this remarketing audience.
rDescription :: Lens' RemarketingAudience (Maybe Text)
rDescription
  = lens _rDescription (\ s a -> s{_rDescription = a})

instance FromJSON RemarketingAudience where
        parseJSON
          = withObject "RemarketingAudience"
              (\ o ->
                 RemarketingAudience' <$>
                   (o .:? "webPropertyId") <*>
                     (o .:? "kind" .!= "analytics#remarketingAudience")
                     <*> (o .:? "created")
                     <*> (o .:? "linkedAdAccounts" .!= mempty)
                     <*> (o .:? "audienceDefinition")
                     <*> (o .:? "audienceType")
                     <*> (o .:? "accountId")
                     <*> (o .:? "name")
                     <*> (o .:? "stateBasedAudienceDefinition")
                     <*> (o .:? "linkedViews" .!= mempty)
                     <*> (o .:? "internalWebPropertyId")
                     <*> (o .:? "id")
                     <*> (o .:? "updated")
                     <*> (o .:? "description"))

instance ToJSON RemarketingAudience where
        toJSON RemarketingAudience'{..}
          = object
              (catMaybes
                 [("webPropertyId" .=) <$> _rWebPropertyId,
                  Just ("kind" .= _rKind),
                  ("created" .=) <$> _rCreated,
                  ("linkedAdAccounts" .=) <$> _rLinkedAdAccounts,
                  ("audienceDefinition" .=) <$> _rAudienceDefinition,
                  ("audienceType" .=) <$> _rAudienceType,
                  ("accountId" .=) <$> _rAccountId,
                  ("name" .=) <$> _rName,
                  ("stateBasedAudienceDefinition" .=) <$>
                    _rStateBasedAudienceDefinition,
                  ("linkedViews" .=) <$> _rLinkedViews,
                  ("internalWebPropertyId" .=) <$>
                    _rInternalWebPropertyId,
                  ("id" .=) <$> _rId, ("updated" .=) <$> _rUpdated,
                  ("description" .=) <$> _rDescription])

--
-- /See:/ 'gaDataDataTableRowsItemCItem' smart constructor.
newtype GaDataDataTableRowsItemCItem =
  GaDataDataTableRowsItemCItem'
    { _gddtriciV :: Maybe Text
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'GaDataDataTableRowsItemCItem' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'gddtriciV'
gaDataDataTableRowsItemCItem
    :: GaDataDataTableRowsItemCItem
gaDataDataTableRowsItemCItem =
  GaDataDataTableRowsItemCItem' {_gddtriciV = Nothing}


gddtriciV :: Lens' GaDataDataTableRowsItemCItem (Maybe Text)
gddtriciV
  = lens _gddtriciV (\ s a -> s{_gddtriciV = a})

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

instance ToJSON GaDataDataTableRowsItemCItem where
        toJSON GaDataDataTableRowsItemCItem'{..}
          = object (catMaybes [("v" .=) <$> _gddtriciV])

-- | Permissions the user has for this entity.
--
-- /See:/ 'entityUserLinkPermissions' smart constructor.
data EntityUserLinkPermissions =
  EntityUserLinkPermissions'
    { _eulpLocal :: !(Maybe [Text])
    , _eulpEffective :: !(Maybe [Text])
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'EntityUserLinkPermissions' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'eulpLocal'
--
-- * 'eulpEffective'
entityUserLinkPermissions
    :: EntityUserLinkPermissions
entityUserLinkPermissions =
  EntityUserLinkPermissions' {_eulpLocal = Nothing, _eulpEffective = Nothing}


-- | Permissions that a user has been assigned at this very level. Does not
-- include any implied or inherited permissions. Local permissions are
-- modifiable.
eulpLocal :: Lens' EntityUserLinkPermissions [Text]
eulpLocal
  = lens _eulpLocal (\ s a -> s{_eulpLocal = a}) .
      _Default
      . _Coerce

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

instance FromJSON EntityUserLinkPermissions where
        parseJSON
          = withObject "EntityUserLinkPermissions"
              (\ o ->
                 EntityUserLinkPermissions' <$>
                   (o .:? "local" .!= mempty) <*>
                     (o .:? "effective" .!= mempty))

instance ToJSON EntityUserLinkPermissions where
        toJSON EntityUserLinkPermissions'{..}
          = object
              (catMaybes
                 [("local" .=) <$> _eulpLocal,
                  ("effective" .=) <$> _eulpEffective])

-- | Information for the view (profile), for which the real time data was
-- requested.
--
-- /See:/ 'realtimeDataProFileInfo' smart constructor.
data RealtimeDataProFileInfo =
  RealtimeDataProFileInfo'
    { _rdpfiWebPropertyId :: !(Maybe Text)
    , _rdpfiProFileId :: !(Maybe Text)
    , _rdpfiProFileName :: !(Maybe Text)
    , _rdpfiAccountId :: !(Maybe Text)
    , _rdpfiInternalWebPropertyId :: !(Maybe Text)
    , _rdpfiTableId :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'RealtimeDataProFileInfo' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'rdpfiWebPropertyId'
--
-- * 'rdpfiProFileId'
--
-- * 'rdpfiProFileName'
--
-- * 'rdpfiAccountId'
--
-- * 'rdpfiInternalWebPropertyId'
--
-- * 'rdpfiTableId'
realtimeDataProFileInfo
    :: RealtimeDataProFileInfo
realtimeDataProFileInfo =
  RealtimeDataProFileInfo'
    { _rdpfiWebPropertyId = Nothing
    , _rdpfiProFileId = Nothing
    , _rdpfiProFileName = Nothing
    , _rdpfiAccountId = Nothing
    , _rdpfiInternalWebPropertyId = Nothing
    , _rdpfiTableId = Nothing
    }


-- | Web Property ID to which this view (profile) belongs.
rdpfiWebPropertyId :: Lens' RealtimeDataProFileInfo (Maybe Text)
rdpfiWebPropertyId
  = lens _rdpfiWebPropertyId
      (\ s a -> s{_rdpfiWebPropertyId = a})

-- | View (Profile) ID.
rdpfiProFileId :: Lens' RealtimeDataProFileInfo (Maybe Text)
rdpfiProFileId
  = lens _rdpfiProFileId
      (\ s a -> s{_rdpfiProFileId = a})

-- | View (Profile) name.
rdpfiProFileName :: Lens' RealtimeDataProFileInfo (Maybe Text)
rdpfiProFileName
  = lens _rdpfiProFileName
      (\ s a -> s{_rdpfiProFileName = a})

-- | Account ID to which this view (profile) belongs.
rdpfiAccountId :: Lens' RealtimeDataProFileInfo (Maybe Text)
rdpfiAccountId
  = lens _rdpfiAccountId
      (\ s a -> s{_rdpfiAccountId = a})

-- | Internal ID for the web property to which this view (profile) belongs.
rdpfiInternalWebPropertyId :: Lens' RealtimeDataProFileInfo (Maybe Text)
rdpfiInternalWebPropertyId
  = lens _rdpfiInternalWebPropertyId
      (\ s a -> s{_rdpfiInternalWebPropertyId = a})

-- | Table ID for view (profile).
rdpfiTableId :: Lens' RealtimeDataProFileInfo (Maybe Text)
rdpfiTableId
  = lens _rdpfiTableId (\ s a -> s{_rdpfiTableId = a})

instance FromJSON RealtimeDataProFileInfo where
        parseJSON
          = withObject "RealtimeDataProFileInfo"
              (\ o ->
                 RealtimeDataProFileInfo' <$>
                   (o .:? "webPropertyId") <*> (o .:? "profileId") <*>
                     (o .:? "profileName")
                     <*> (o .:? "accountId")
                     <*> (o .:? "internalWebPropertyId")
                     <*> (o .:? "tableId"))

instance ToJSON RealtimeDataProFileInfo where
        toJSON RealtimeDataProFileInfo'{..}
          = object
              (catMaybes
                 [("webPropertyId" .=) <$> _rdpfiWebPropertyId,
                  ("profileId" .=) <$> _rdpfiProFileId,
                  ("profileName" .=) <$> _rdpfiProFileName,
                  ("accountId" .=) <$> _rdpfiAccountId,
                  ("internalWebPropertyId" .=) <$>
                    _rdpfiInternalWebPropertyId,
                  ("tableId" .=) <$> _rdpfiTableId])

--
-- /See:/ 'mcfDataRowsItemItemConversionPathValueItem' smart constructor.
data McfDataRowsItemItemConversionPathValueItem =
  McfDataRowsItemItemConversionPathValueItem'
    { _mdriicpviInteractionType :: !(Maybe Text)
    , _mdriicpviNodeValue :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'McfDataRowsItemItemConversionPathValueItem' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'mdriicpviInteractionType'
--
-- * 'mdriicpviNodeValue'
mcfDataRowsItemItemConversionPathValueItem
    :: McfDataRowsItemItemConversionPathValueItem
mcfDataRowsItemItemConversionPathValueItem =
  McfDataRowsItemItemConversionPathValueItem'
    {_mdriicpviInteractionType = Nothing, _mdriicpviNodeValue = Nothing}


-- | Type of an interaction on conversion path. Such as CLICK, IMPRESSION
-- etc.
mdriicpviInteractionType :: Lens' McfDataRowsItemItemConversionPathValueItem (Maybe Text)
mdriicpviInteractionType
  = lens _mdriicpviInteractionType
      (\ s a -> s{_mdriicpviInteractionType = a})

-- | Node value of an interaction on conversion path. Such as source, medium
-- etc.
mdriicpviNodeValue :: Lens' McfDataRowsItemItemConversionPathValueItem (Maybe Text)
mdriicpviNodeValue
  = lens _mdriicpviNodeValue
      (\ s a -> s{_mdriicpviNodeValue = a})

instance FromJSON
           McfDataRowsItemItemConversionPathValueItem
         where
        parseJSON
          = withObject
              "McfDataRowsItemItemConversionPathValueItem"
              (\ o ->
                 McfDataRowsItemItemConversionPathValueItem' <$>
                   (o .:? "interactionType") <*> (o .:? "nodeValue"))

instance ToJSON
           McfDataRowsItemItemConversionPathValueItem
         where
        toJSON
          McfDataRowsItemItemConversionPathValueItem'{..}
          = object
              (catMaybes
                 [("interactionType" .=) <$>
                    _mdriicpviInteractionType,
                  ("nodeValue" .=) <$> _mdriicpviNodeValue])

-- | JSON template for an Analytics filter expression.
--
-- /See:/ 'filterExpression' smart constructor.
data FilterExpression =
  FilterExpression'
    { _feFieldIndex :: !(Maybe (Textual Int32))
    , _feField :: !(Maybe Text)
    , _feKind :: !Text
    , _feMatchType :: !(Maybe Text)
    , _feCaseSensitive :: !(Maybe Bool)
    , _feExpressionValue :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'FilterExpression' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'feFieldIndex'
--
-- * 'feField'
--
-- * 'feKind'
--
-- * 'feMatchType'
--
-- * 'feCaseSensitive'
--
-- * 'feExpressionValue'
filterExpression
    :: FilterExpression
filterExpression =
  FilterExpression'
    { _feFieldIndex = Nothing
    , _feField = Nothing
    , _feKind = "analytics#filterExpression"
    , _feMatchType = Nothing
    , _feCaseSensitive = Nothing
    , _feExpressionValue = Nothing
    }


-- | The Index of the custom dimension. Set only if the field is a is
-- CUSTOM_DIMENSION.
feFieldIndex :: Lens' FilterExpression (Maybe Int32)
feFieldIndex
  = lens _feFieldIndex (\ s a -> s{_feFieldIndex = a})
      . mapping _Coerce

-- | 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),
feField :: Lens' FilterExpression (Maybe Text)
feField = lens _feField (\ s a -> s{_feField = a})

-- | Kind value for filter expression
feKind :: Lens' FilterExpression Text
feKind = lens _feKind (\ s a -> s{_feKind = a})

-- | 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.
feMatchType :: Lens' FilterExpression (Maybe Text)
feMatchType
  = lens _feMatchType (\ s a -> s{_feMatchType = a})

-- | Determines if the filter is case sensitive.
feCaseSensitive :: Lens' FilterExpression (Maybe Bool)
feCaseSensitive
  = lens _feCaseSensitive
      (\ s a -> s{_feCaseSensitive = a})

-- | Filter expression value
feExpressionValue :: Lens' FilterExpression (Maybe Text)
feExpressionValue
  = lens _feExpressionValue
      (\ s a -> s{_feExpressionValue = a})

instance FromJSON FilterExpression where
        parseJSON
          = withObject "FilterExpression"
              (\ o ->
                 FilterExpression' <$>
                   (o .:? "fieldIndex") <*> (o .:? "field") <*>
                     (o .:? "kind" .!= "analytics#filterExpression")
                     <*> (o .:? "matchType")
                     <*> (o .:? "caseSensitive")
                     <*> (o .:? "expressionValue"))

instance ToJSON FilterExpression where
        toJSON FilterExpression'{..}
          = object
              (catMaybes
                 [("fieldIndex" .=) <$> _feFieldIndex,
                  ("field" .=) <$> _feField, Just ("kind" .= _feKind),
                  ("matchType" .=) <$> _feMatchType,
                  ("caseSensitive" .=) <$> _feCaseSensitive,
                  ("expressionValue" .=) <$> _feExpressionValue])

-- | JSON template for a linked view (profile).
--
-- /See:/ 'proFileRef' smart constructor.
data ProFileRef =
  ProFileRef'
    { _pfrWebPropertyId :: !(Maybe Text)
    , _pfrKind :: !Text
    , _pfrHref :: !(Maybe Text)
    , _pfrAccountId :: !(Maybe Text)
    , _pfrName :: !(Maybe Text)
    , _pfrInternalWebPropertyId :: !(Maybe Text)
    , _pfrId :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'ProFileRef' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'pfrWebPropertyId'
--
-- * 'pfrKind'
--
-- * 'pfrHref'
--
-- * 'pfrAccountId'
--
-- * 'pfrName'
--
-- * 'pfrInternalWebPropertyId'
--
-- * 'pfrId'
proFileRef
    :: ProFileRef
proFileRef =
  ProFileRef'
    { _pfrWebPropertyId = Nothing
    , _pfrKind = "analytics#profileRef"
    , _pfrHref = Nothing
    , _pfrAccountId = Nothing
    , _pfrName = Nothing
    , _pfrInternalWebPropertyId = Nothing
    , _pfrId = Nothing
    }


-- | Web property ID of the form UA-XXXXX-YY to which this view (profile)
-- belongs.
pfrWebPropertyId :: Lens' ProFileRef (Maybe Text)
pfrWebPropertyId
  = lens _pfrWebPropertyId
      (\ s a -> s{_pfrWebPropertyId = a})

-- | Analytics view (profile) reference.
pfrKind :: Lens' ProFileRef Text
pfrKind = lens _pfrKind (\ s a -> s{_pfrKind = a})

-- | Link for this view (profile).
pfrHref :: Lens' ProFileRef (Maybe Text)
pfrHref = lens _pfrHref (\ s a -> s{_pfrHref = a})

-- | Account ID to which this view (profile) belongs.
pfrAccountId :: Lens' ProFileRef (Maybe Text)
pfrAccountId
  = lens _pfrAccountId (\ s a -> s{_pfrAccountId = a})

-- | Name of this view (profile).
pfrName :: Lens' ProFileRef (Maybe Text)
pfrName = lens _pfrName (\ s a -> s{_pfrName = a})

-- | Internal ID for the web property to which this view (profile) belongs.
pfrInternalWebPropertyId :: Lens' ProFileRef (Maybe Text)
pfrInternalWebPropertyId
  = lens _pfrInternalWebPropertyId
      (\ s a -> s{_pfrInternalWebPropertyId = a})

-- | View (Profile) ID.
pfrId :: Lens' ProFileRef (Maybe Text)
pfrId = lens _pfrId (\ s a -> s{_pfrId = a})

instance FromJSON ProFileRef where
        parseJSON
          = withObject "ProFileRef"
              (\ o ->
                 ProFileRef' <$>
                   (o .:? "webPropertyId") <*>
                     (o .:? "kind" .!= "analytics#profileRef")
                     <*> (o .:? "href")
                     <*> (o .:? "accountId")
                     <*> (o .:? "name")
                     <*> (o .:? "internalWebPropertyId")
                     <*> (o .:? "id"))

instance ToJSON ProFileRef where
        toJSON ProFileRef'{..}
          = object
              (catMaybes
                 [("webPropertyId" .=) <$> _pfrWebPropertyId,
                  Just ("kind" .= _pfrKind), ("href" .=) <$> _pfrHref,
                  ("accountId" .=) <$> _pfrAccountId,
                  ("name" .=) <$> _pfrName,
                  ("internalWebPropertyId" .=) <$>
                    _pfrInternalWebPropertyId,
                  ("id" .=) <$> _pfrId])

-- | 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:/ 'accounts' smart constructor.
data Accounts =
  Accounts'
    { _aNextLink :: !(Maybe Text)
    , _aItemsPerPage :: !(Maybe (Textual Int32))
    , _aKind :: !Text
    , _aUsername :: !(Maybe Text)
    , _aItems :: !(Maybe [Account])
    , _aTotalResults :: !(Maybe (Textual Int32))
    , _aStartIndex :: !(Maybe (Textual Int32))
    , _aPreviousLink :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'Accounts' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'aNextLink'
--
-- * 'aItemsPerPage'
--
-- * 'aKind'
--
-- * 'aUsername'
--
-- * 'aItems'
--
-- * 'aTotalResults'
--
-- * 'aStartIndex'
--
-- * 'aPreviousLink'
accounts
    :: Accounts
accounts =
  Accounts'
    { _aNextLink = Nothing
    , _aItemsPerPage = Nothing
    , _aKind = "analytics#accounts"
    , _aUsername = Nothing
    , _aItems = Nothing
    , _aTotalResults = Nothing
    , _aStartIndex = Nothing
    , _aPreviousLink = Nothing
    }


-- | Next link for this account collection.
aNextLink :: Lens' Accounts (Maybe Text)
aNextLink
  = lens _aNextLink (\ s a -> s{_aNextLink = a})

-- | 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.
aItemsPerPage :: Lens' Accounts (Maybe Int32)
aItemsPerPage
  = lens _aItemsPerPage
      (\ s a -> s{_aItemsPerPage = a})
      . mapping _Coerce

-- | Collection type.
aKind :: Lens' Accounts Text
aKind = lens _aKind (\ s a -> s{_aKind = a})

-- | Email ID of the authenticated user
aUsername :: Lens' Accounts (Maybe Text)
aUsername
  = lens _aUsername (\ s a -> s{_aUsername = a})

-- | A list of accounts.
aItems :: Lens' Accounts [Account]
aItems
  = lens _aItems (\ s a -> s{_aItems = a}) . _Default .
      _Coerce

-- | The total number of results for the query, regardless of the number of
-- results in the response.
aTotalResults :: Lens' Accounts (Maybe Int32)
aTotalResults
  = lens _aTotalResults
      (\ s a -> s{_aTotalResults = a})
      . mapping _Coerce

-- | The starting index of the entries, which is 1 by default or otherwise
-- specified by the start-index query parameter.
aStartIndex :: Lens' Accounts (Maybe Int32)
aStartIndex
  = lens _aStartIndex (\ s a -> s{_aStartIndex = a}) .
      mapping _Coerce

-- | Previous link for this account collection.
aPreviousLink :: Lens' Accounts (Maybe Text)
aPreviousLink
  = lens _aPreviousLink
      (\ s a -> s{_aPreviousLink = a})

instance FromJSON Accounts where
        parseJSON
          = withObject "Accounts"
              (\ o ->
                 Accounts' <$>
                   (o .:? "nextLink") <*> (o .:? "itemsPerPage") <*>
                     (o .:? "kind" .!= "analytics#accounts")
                     <*> (o .:? "username")
                     <*> (o .:? "items" .!= mempty)
                     <*> (o .:? "totalResults")
                     <*> (o .:? "startIndex")
                     <*> (o .:? "previousLink"))

instance ToJSON Accounts where
        toJSON Accounts'{..}
          = object
              (catMaybes
                 [("nextLink" .=) <$> _aNextLink,
                  ("itemsPerPage" .=) <$> _aItemsPerPage,
                  Just ("kind" .= _aKind),
                  ("username" .=) <$> _aUsername,
                  ("items" .=) <$> _aItems,
                  ("totalResults" .=) <$> _aTotalResults,
                  ("startIndex" .=) <$> _aStartIndex,
                  ("previousLink" .=) <$> _aPreviousLink])

-- | 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:/ 'experiments' smart constructor.
data Experiments =
  Experiments'
    { _eNextLink :: !(Maybe Text)
    , _eItemsPerPage :: !(Maybe (Textual Int32))
    , _eKind :: !Text
    , _eUsername :: !(Maybe Text)
    , _eItems :: !(Maybe [Experiment])
    , _eTotalResults :: !(Maybe (Textual Int32))
    , _eStartIndex :: !(Maybe (Textual Int32))
    , _ePreviousLink :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'Experiments' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'eNextLink'
--
-- * 'eItemsPerPage'
--
-- * 'eKind'
--
-- * 'eUsername'
--
-- * 'eItems'
--
-- * 'eTotalResults'
--
-- * 'eStartIndex'
--
-- * 'ePreviousLink'
experiments
    :: Experiments
experiments =
  Experiments'
    { _eNextLink = Nothing
    , _eItemsPerPage = Nothing
    , _eKind = "analytics#experiments"
    , _eUsername = Nothing
    , _eItems = Nothing
    , _eTotalResults = Nothing
    , _eStartIndex = Nothing
    , _ePreviousLink = Nothing
    }


-- | Link to next page for this experiment collection.
eNextLink :: Lens' Experiments (Maybe Text)
eNextLink
  = lens _eNextLink (\ s a -> s{_eNextLink = a})

-- | 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.
eItemsPerPage :: Lens' Experiments (Maybe Int32)
eItemsPerPage
  = lens _eItemsPerPage
      (\ s a -> s{_eItemsPerPage = a})
      . mapping _Coerce

-- | Collection type.
eKind :: Lens' Experiments Text
eKind = lens _eKind (\ s a -> s{_eKind = a})

-- | Email ID of the authenticated user
eUsername :: Lens' Experiments (Maybe Text)
eUsername
  = lens _eUsername (\ s a -> s{_eUsername = a})

-- | A list of experiments.
eItems :: Lens' Experiments [Experiment]
eItems
  = lens _eItems (\ s a -> s{_eItems = a}) . _Default .
      _Coerce

-- | The total number of results for the query, regardless of the number of
-- resources in the result.
eTotalResults :: Lens' Experiments (Maybe Int32)
eTotalResults
  = lens _eTotalResults
      (\ s a -> s{_eTotalResults = a})
      . mapping _Coerce

-- | The starting index of the resources, which is 1 by default or otherwise
-- specified by the start-index query parameter.
eStartIndex :: Lens' Experiments (Maybe Int32)
eStartIndex
  = lens _eStartIndex (\ s a -> s{_eStartIndex = a}) .
      mapping _Coerce

-- | Link to previous page for this experiment collection.
ePreviousLink :: Lens' Experiments (Maybe Text)
ePreviousLink
  = lens _ePreviousLink
      (\ s a -> s{_ePreviousLink = a})

instance FromJSON Experiments where
        parseJSON
          = withObject "Experiments"
              (\ o ->
                 Experiments' <$>
                   (o .:? "nextLink") <*> (o .:? "itemsPerPage") <*>
                     (o .:? "kind" .!= "analytics#experiments")
                     <*> (o .:? "username")
                     <*> (o .:? "items" .!= mempty)
                     <*> (o .:? "totalResults")
                     <*> (o .:? "startIndex")
                     <*> (o .:? "previousLink"))

instance ToJSON Experiments where
        toJSON Experiments'{..}
          = object
              (catMaybes
                 [("nextLink" .=) <$> _eNextLink,
                  ("itemsPerPage" .=) <$> _eItemsPerPage,
                  Just ("kind" .= _eKind),
                  ("username" .=) <$> _eUsername,
                  ("items" .=) <$> _eItems,
                  ("totalResults" .=) <$> _eTotalResults,
                  ("startIndex" .=) <$> _eStartIndex,
                  ("previousLink" .=) <$> _ePreviousLink])

-- | Parent link for an experiment. Points to the view (profile) to which
-- this experiment belongs.
--
-- /See:/ 'experimentParentLink' smart constructor.
data ExperimentParentLink =
  ExperimentParentLink'
    { _eplHref :: !(Maybe Text)
    , _eplType :: !Text
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'ExperimentParentLink' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'eplHref'
--
-- * 'eplType'
experimentParentLink
    :: ExperimentParentLink
experimentParentLink =
  ExperimentParentLink' {_eplHref = Nothing, _eplType = "analytics#profile"}


-- | Link to the view (profile) to which this experiment belongs. This field
-- is read-only.
eplHref :: Lens' ExperimentParentLink (Maybe Text)
eplHref = lens _eplHref (\ s a -> s{_eplHref = a})

-- | Value is \"analytics#profile\". This field is read-only.
eplType :: Lens' ExperimentParentLink Text
eplType = lens _eplType (\ s a -> s{_eplType = a})

instance FromJSON ExperimentParentLink where
        parseJSON
          = withObject "ExperimentParentLink"
              (\ o ->
                 ExperimentParentLink' <$>
                   (o .:? "href") <*>
                     (o .:? "type" .!= "analytics#profile"))

instance ToJSON ExperimentParentLink where
        toJSON ExperimentParentLink'{..}
          = object
              (catMaybes
                 [("href" .=) <$> _eplHref,
                  Just ("type" .= _eplType)])

-- | Download details for a file stored in Google Drive.
--
-- /See:/ 'unSampledReportDriveDownloadDetails' smart constructor.
newtype UnSampledReportDriveDownloadDetails =
  UnSampledReportDriveDownloadDetails'
    { _usrdddDocumentId :: Maybe Text
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'UnSampledReportDriveDownloadDetails' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'usrdddDocumentId'
unSampledReportDriveDownloadDetails
    :: UnSampledReportDriveDownloadDetails
unSampledReportDriveDownloadDetails =
  UnSampledReportDriveDownloadDetails' {_usrdddDocumentId = Nothing}


-- | Id of the document\/file containing the report data.
usrdddDocumentId :: Lens' UnSampledReportDriveDownloadDetails (Maybe Text)
usrdddDocumentId
  = lens _usrdddDocumentId
      (\ s a -> s{_usrdddDocumentId = a})

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

instance ToJSON UnSampledReportDriveDownloadDetails
         where
        toJSON UnSampledReportDriveDownloadDetails'{..}
          = object
              (catMaybes [("documentId" .=) <$> _usrdddDocumentId])

-- | Information for the view (profile), for which the Analytics data was
-- requested.
--
-- /See:/ 'mcfDataProFileInfo' smart constructor.
data McfDataProFileInfo =
  McfDataProFileInfo'
    { _mdpfiWebPropertyId :: !(Maybe Text)
    , _mdpfiProFileId :: !(Maybe Text)
    , _mdpfiProFileName :: !(Maybe Text)
    , _mdpfiAccountId :: !(Maybe Text)
    , _mdpfiInternalWebPropertyId :: !(Maybe Text)
    , _mdpfiTableId :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'McfDataProFileInfo' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'mdpfiWebPropertyId'
--
-- * 'mdpfiProFileId'
--
-- * 'mdpfiProFileName'
--
-- * 'mdpfiAccountId'
--
-- * 'mdpfiInternalWebPropertyId'
--
-- * 'mdpfiTableId'
mcfDataProFileInfo
    :: McfDataProFileInfo
mcfDataProFileInfo =
  McfDataProFileInfo'
    { _mdpfiWebPropertyId = Nothing
    , _mdpfiProFileId = Nothing
    , _mdpfiProFileName = Nothing
    , _mdpfiAccountId = Nothing
    , _mdpfiInternalWebPropertyId = Nothing
    , _mdpfiTableId = Nothing
    }


-- | Web Property ID to which this view (profile) belongs.
mdpfiWebPropertyId :: Lens' McfDataProFileInfo (Maybe Text)
mdpfiWebPropertyId
  = lens _mdpfiWebPropertyId
      (\ s a -> s{_mdpfiWebPropertyId = a})

-- | View (Profile) ID.
mdpfiProFileId :: Lens' McfDataProFileInfo (Maybe Text)
mdpfiProFileId
  = lens _mdpfiProFileId
      (\ s a -> s{_mdpfiProFileId = a})

-- | View (Profile) name.
mdpfiProFileName :: Lens' McfDataProFileInfo (Maybe Text)
mdpfiProFileName
  = lens _mdpfiProFileName
      (\ s a -> s{_mdpfiProFileName = a})

-- | Account ID to which this view (profile) belongs.
mdpfiAccountId :: Lens' McfDataProFileInfo (Maybe Text)
mdpfiAccountId
  = lens _mdpfiAccountId
      (\ s a -> s{_mdpfiAccountId = a})

-- | Internal ID for the web property to which this view (profile) belongs.
mdpfiInternalWebPropertyId :: Lens' McfDataProFileInfo (Maybe Text)
mdpfiInternalWebPropertyId
  = lens _mdpfiInternalWebPropertyId
      (\ s a -> s{_mdpfiInternalWebPropertyId = a})

-- | Table ID for view (profile).
mdpfiTableId :: Lens' McfDataProFileInfo (Maybe Text)
mdpfiTableId
  = lens _mdpfiTableId (\ s a -> s{_mdpfiTableId = a})

instance FromJSON McfDataProFileInfo where
        parseJSON
          = withObject "McfDataProFileInfo"
              (\ o ->
                 McfDataProFileInfo' <$>
                   (o .:? "webPropertyId") <*> (o .:? "profileId") <*>
                     (o .:? "profileName")
                     <*> (o .:? "accountId")
                     <*> (o .:? "internalWebPropertyId")
                     <*> (o .:? "tableId"))

instance ToJSON McfDataProFileInfo where
        toJSON McfDataProFileInfo'{..}
          = object
              (catMaybes
                 [("webPropertyId" .=) <$> _mdpfiWebPropertyId,
                  ("profileId" .=) <$> _mdpfiProFileId,
                  ("profileName" .=) <$> _mdpfiProFileName,
                  ("accountId" .=) <$> _mdpfiAccountId,
                  ("internalWebPropertyId" .=) <$>
                    _mdpfiInternalWebPropertyId,
                  ("tableId" .=) <$> _mdpfiTableId])

-- | 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:/ 'customDataSources' smart constructor.
data CustomDataSources =
  CustomDataSources'
    { _cdsNextLink :: !(Maybe Text)
    , _cdsItemsPerPage :: !(Maybe (Textual Int32))
    , _cdsKind :: !Text
    , _cdsUsername :: !(Maybe Text)
    , _cdsItems :: !(Maybe [CustomDataSource])
    , _cdsTotalResults :: !(Maybe (Textual Int32))
    , _cdsStartIndex :: !(Maybe (Textual Int32))
    , _cdsPreviousLink :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'CustomDataSources' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'cdsNextLink'
--
-- * 'cdsItemsPerPage'
--
-- * 'cdsKind'
--
-- * 'cdsUsername'
--
-- * 'cdsItems'
--
-- * 'cdsTotalResults'
--
-- * 'cdsStartIndex'
--
-- * 'cdsPreviousLink'
customDataSources
    :: CustomDataSources
customDataSources =
  CustomDataSources'
    { _cdsNextLink = Nothing
    , _cdsItemsPerPage = Nothing
    , _cdsKind = "analytics#customDataSources"
    , _cdsUsername = Nothing
    , _cdsItems = Nothing
    , _cdsTotalResults = Nothing
    , _cdsStartIndex = Nothing
    , _cdsPreviousLink = Nothing
    }


-- | Link to next page for this custom data source collection.
cdsNextLink :: Lens' CustomDataSources (Maybe Text)
cdsNextLink
  = lens _cdsNextLink (\ s a -> s{_cdsNextLink = a})

-- | 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.
cdsItemsPerPage :: Lens' CustomDataSources (Maybe Int32)
cdsItemsPerPage
  = lens _cdsItemsPerPage
      (\ s a -> s{_cdsItemsPerPage = a})
      . mapping _Coerce

-- | Collection type.
cdsKind :: Lens' CustomDataSources Text
cdsKind = lens _cdsKind (\ s a -> s{_cdsKind = a})

-- | Email ID of the authenticated user
cdsUsername :: Lens' CustomDataSources (Maybe Text)
cdsUsername
  = lens _cdsUsername (\ s a -> s{_cdsUsername = a})

-- | Collection of custom data sources.
cdsItems :: Lens' CustomDataSources [CustomDataSource]
cdsItems
  = lens _cdsItems (\ s a -> s{_cdsItems = a}) .
      _Default
      . _Coerce

-- | The total number of results for the query, regardless of the number of
-- results in the response.
cdsTotalResults :: Lens' CustomDataSources (Maybe Int32)
cdsTotalResults
  = lens _cdsTotalResults
      (\ s a -> s{_cdsTotalResults = a})
      . mapping _Coerce

-- | The starting index of the resources, which is 1 by default or otherwise
-- specified by the start-index query parameter.
cdsStartIndex :: Lens' CustomDataSources (Maybe Int32)
cdsStartIndex
  = lens _cdsStartIndex
      (\ s a -> s{_cdsStartIndex = a})
      . mapping _Coerce

-- | Link to previous page for this custom data source collection.
cdsPreviousLink :: Lens' CustomDataSources (Maybe Text)
cdsPreviousLink
  = lens _cdsPreviousLink
      (\ s a -> s{_cdsPreviousLink = a})

instance FromJSON CustomDataSources where
        parseJSON
          = withObject "CustomDataSources"
              (\ o ->
                 CustomDataSources' <$>
                   (o .:? "nextLink") <*> (o .:? "itemsPerPage") <*>
                     (o .:? "kind" .!= "analytics#customDataSources")
                     <*> (o .:? "username")
                     <*> (o .:? "items" .!= mempty)
                     <*> (o .:? "totalResults")
                     <*> (o .:? "startIndex")
                     <*> (o .:? "previousLink"))

instance ToJSON CustomDataSources where
        toJSON CustomDataSources'{..}
          = object
              (catMaybes
                 [("nextLink" .=) <$> _cdsNextLink,
                  ("itemsPerPage" .=) <$> _cdsItemsPerPage,
                  Just ("kind" .= _cdsKind),
                  ("username" .=) <$> _cdsUsername,
                  ("items" .=) <$> _cdsItems,
                  ("totalResults" .=) <$> _cdsTotalResults,
                  ("startIndex" .=) <$> _cdsStartIndex,
                  ("previousLink" .=) <$> _cdsPreviousLink])

-- | Child link for this web property. Points to the list of views (profiles)
-- for this web property.
--
-- /See:/ 'webPropertyChildLink' smart constructor.
data WebPropertyChildLink =
  WebPropertyChildLink'
    { _wpclHref :: !(Maybe Text)
    , _wpclType :: !Text
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'WebPropertyChildLink' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'wpclHref'
--
-- * 'wpclType'
webPropertyChildLink
    :: WebPropertyChildLink
webPropertyChildLink =
  WebPropertyChildLink' {_wpclHref = Nothing, _wpclType = "analytics#profiles"}


-- | Link to the list of views (profiles) for this web property.
wpclHref :: Lens' WebPropertyChildLink (Maybe Text)
wpclHref = lens _wpclHref (\ s a -> s{_wpclHref = a})

-- | Type of the parent link. Its value is \"analytics#profiles\".
wpclType :: Lens' WebPropertyChildLink Text
wpclType = lens _wpclType (\ s a -> s{_wpclType = a})

instance FromJSON WebPropertyChildLink where
        parseJSON
          = withObject "WebPropertyChildLink"
              (\ o ->
                 WebPropertyChildLink' <$>
                   (o .:? "href") <*>
                     (o .:? "type" .!= "analytics#profiles"))

instance ToJSON WebPropertyChildLink where
        toJSON WebPropertyChildLink'{..}
          = object
              (catMaybes
                 [("href" .=) <$> _wpclHref,
                  Just ("type" .= _wpclType)])

-- | JSON template for a hash Client Id response resource.
--
-- /See:/ 'hashClientIdResponse' smart constructor.
data HashClientIdResponse =
  HashClientIdResponse'
    { _hcirClientId :: !(Maybe Text)
    , _hcirWebPropertyId :: !(Maybe Text)
    , _hcirKind :: !Text
    , _hcirHashedClientId :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'HashClientIdResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'hcirClientId'
--
-- * 'hcirWebPropertyId'
--
-- * 'hcirKind'
--
-- * 'hcirHashedClientId'
hashClientIdResponse
    :: HashClientIdResponse
hashClientIdResponse =
  HashClientIdResponse'
    { _hcirClientId = Nothing
    , _hcirWebPropertyId = Nothing
    , _hcirKind = "analytics#hashClientIdResponse"
    , _hcirHashedClientId = Nothing
    }


hcirClientId :: Lens' HashClientIdResponse (Maybe Text)
hcirClientId
  = lens _hcirClientId (\ s a -> s{_hcirClientId = a})

hcirWebPropertyId :: Lens' HashClientIdResponse (Maybe Text)
hcirWebPropertyId
  = lens _hcirWebPropertyId
      (\ s a -> s{_hcirWebPropertyId = a})

hcirKind :: Lens' HashClientIdResponse Text
hcirKind = lens _hcirKind (\ s a -> s{_hcirKind = a})

hcirHashedClientId :: Lens' HashClientIdResponse (Maybe Text)
hcirHashedClientId
  = lens _hcirHashedClientId
      (\ s a -> s{_hcirHashedClientId = a})

instance FromJSON HashClientIdResponse where
        parseJSON
          = withObject "HashClientIdResponse"
              (\ o ->
                 HashClientIdResponse' <$>
                   (o .:? "clientId") <*> (o .:? "webPropertyId") <*>
                     (o .:? "kind" .!= "analytics#hashClientIdResponse")
                     <*> (o .:? "hashedClientId"))

instance ToJSON HashClientIdResponse where
        toJSON HashClientIdResponse'{..}
          = object
              (catMaybes
                 [("clientId" .=) <$> _hcirClientId,
                  ("webPropertyId" .=) <$> _hcirWebPropertyId,
                  Just ("kind" .= _hcirKind),
                  ("hashedClientId" .=) <$> _hcirHashedClientId])

-- | Multi-Channel Funnels data for a given view (profile).
--
-- /See:/ 'mcfData' smart constructor.
data McfData =
  McfData'
    { _mdNextLink :: !(Maybe Text)
    , _mdSampleSpace :: !(Maybe (Textual Int64))
    , _mdItemsPerPage :: !(Maybe (Textual Int32))
    , _mdProFileInfo :: !(Maybe McfDataProFileInfo)
    , _mdKind :: !Text
    , _mdSampleSize :: !(Maybe (Textual Int64))
    , _mdRows :: !(Maybe [[McfDataRowsItemItem]])
    , _mdSelfLink :: !(Maybe Text)
    , _mdQuery :: !(Maybe McfDataQuery)
    , _mdColumnHeaders :: !(Maybe [McfDataColumnHeadersItem])
    , _mdId :: !(Maybe Text)
    , _mdTotalResults :: !(Maybe (Textual Int32))
    , _mdContainsSampledData :: !(Maybe Bool)
    , _mdTotalsForAllResults :: !(Maybe McfDataTotalsForAllResults)
    , _mdPreviousLink :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'McfData' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'mdNextLink'
--
-- * 'mdSampleSpace'
--
-- * 'mdItemsPerPage'
--
-- * 'mdProFileInfo'
--
-- * 'mdKind'
--
-- * 'mdSampleSize'
--
-- * 'mdRows'
--
-- * 'mdSelfLink'
--
-- * 'mdQuery'
--
-- * 'mdColumnHeaders'
--
-- * 'mdId'
--
-- * 'mdTotalResults'
--
-- * 'mdContainsSampledData'
--
-- * 'mdTotalsForAllResults'
--
-- * 'mdPreviousLink'
mcfData
    :: McfData
mcfData =
  McfData'
    { _mdNextLink = Nothing
    , _mdSampleSpace = Nothing
    , _mdItemsPerPage = Nothing
    , _mdProFileInfo = Nothing
    , _mdKind = "analytics#mcfData"
    , _mdSampleSize = Nothing
    , _mdRows = Nothing
    , _mdSelfLink = Nothing
    , _mdQuery = Nothing
    , _mdColumnHeaders = Nothing
    , _mdId = Nothing
    , _mdTotalResults = Nothing
    , _mdContainsSampledData = Nothing
    , _mdTotalsForAllResults = Nothing
    , _mdPreviousLink = Nothing
    }


-- | Link to next page for this Analytics data query.
mdNextLink :: Lens' McfData (Maybe Text)
mdNextLink
  = lens _mdNextLink (\ s a -> s{_mdNextLink = a})

-- | Total size of the sample space from which the samples were selected.
mdSampleSpace :: Lens' McfData (Maybe Int64)
mdSampleSpace
  = lens _mdSampleSpace
      (\ s a -> s{_mdSampleSpace = a})
      . mapping _Coerce

-- | 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.
mdItemsPerPage :: Lens' McfData (Maybe Int32)
mdItemsPerPage
  = lens _mdItemsPerPage
      (\ s a -> s{_mdItemsPerPage = a})
      . mapping _Coerce

-- | Information for the view (profile), for which the Analytics data was
-- requested.
mdProFileInfo :: Lens' McfData (Maybe McfDataProFileInfo)
mdProFileInfo
  = lens _mdProFileInfo
      (\ s a -> s{_mdProFileInfo = a})

-- | Resource type.
mdKind :: Lens' McfData Text
mdKind = lens _mdKind (\ s a -> s{_mdKind = a})

-- | The number of samples used to calculate the result.
mdSampleSize :: Lens' McfData (Maybe Int64)
mdSampleSize
  = lens _mdSampleSize (\ s a -> s{_mdSampleSize = a})
      . mapping _Coerce

-- | 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.
mdRows :: Lens' McfData [[McfDataRowsItemItem]]
mdRows
  = lens _mdRows (\ s a -> s{_mdRows = a}) . _Default .
      _Coerce

-- | Link to this page.
mdSelfLink :: Lens' McfData (Maybe Text)
mdSelfLink
  = lens _mdSelfLink (\ s a -> s{_mdSelfLink = a})

-- | Analytics data request query parameters.
mdQuery :: Lens' McfData (Maybe McfDataQuery)
mdQuery = lens _mdQuery (\ s a -> s{_mdQuery = a})

-- | Column headers that list dimension names followed by the metric names.
-- The order of dimensions and metrics is same as specified in the request.
mdColumnHeaders :: Lens' McfData [McfDataColumnHeadersItem]
mdColumnHeaders
  = lens _mdColumnHeaders
      (\ s a -> s{_mdColumnHeaders = a})
      . _Default
      . _Coerce

-- | Unique ID for this data response.
mdId :: Lens' McfData (Maybe Text)
mdId = lens _mdId (\ s a -> s{_mdId = a})

-- | The total number of rows for the query, regardless of the number of rows
-- in the response.
mdTotalResults :: Lens' McfData (Maybe Int32)
mdTotalResults
  = lens _mdTotalResults
      (\ s a -> s{_mdTotalResults = a})
      . mapping _Coerce

-- | Determines if the Analytics data contains sampled data.
mdContainsSampledData :: Lens' McfData (Maybe Bool)
mdContainsSampledData
  = lens _mdContainsSampledData
      (\ s a -> s{_mdContainsSampledData = a})

-- | 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.
mdTotalsForAllResults :: Lens' McfData (Maybe McfDataTotalsForAllResults)
mdTotalsForAllResults
  = lens _mdTotalsForAllResults
      (\ s a -> s{_mdTotalsForAllResults = a})

-- | Link to previous page for this Analytics data query.
mdPreviousLink :: Lens' McfData (Maybe Text)
mdPreviousLink
  = lens _mdPreviousLink
      (\ s a -> s{_mdPreviousLink = a})

instance FromJSON McfData where
        parseJSON
          = withObject "McfData"
              (\ o ->
                 McfData' <$>
                   (o .:? "nextLink") <*> (o .:? "sampleSpace") <*>
                     (o .:? "itemsPerPage")
                     <*> (o .:? "profileInfo")
                     <*> (o .:? "kind" .!= "analytics#mcfData")
                     <*> (o .:? "sampleSize")
                     <*> (o .:? "rows" .!= mempty)
                     <*> (o .:? "selfLink")
                     <*> (o .:? "query")
                     <*> (o .:? "columnHeaders" .!= mempty)
                     <*> (o .:? "id")
                     <*> (o .:? "totalResults")
                     <*> (o .:? "containsSampledData")
                     <*> (o .:? "totalsForAllResults")
                     <*> (o .:? "previousLink"))

instance ToJSON McfData where
        toJSON McfData'{..}
          = object
              (catMaybes
                 [("nextLink" .=) <$> _mdNextLink,
                  ("sampleSpace" .=) <$> _mdSampleSpace,
                  ("itemsPerPage" .=) <$> _mdItemsPerPage,
                  ("profileInfo" .=) <$> _mdProFileInfo,
                  Just ("kind" .= _mdKind),
                  ("sampleSize" .=) <$> _mdSampleSize,
                  ("rows" .=) <$> _mdRows,
                  ("selfLink" .=) <$> _mdSelfLink,
                  ("query" .=) <$> _mdQuery,
                  ("columnHeaders" .=) <$> _mdColumnHeaders,
                  ("id" .=) <$> _mdId,
                  ("totalResults" .=) <$> _mdTotalResults,
                  ("containsSampledData" .=) <$>
                    _mdContainsSampledData,
                  ("totalsForAllResults" .=) <$>
                    _mdTotalsForAllResults,
                  ("previousLink" .=) <$> _mdPreviousLink])

-- | JSON template for a user reference.
--
-- /See:/ 'userRef' smart constructor.
data UserRef =
  UserRef'
    { _urEmail :: !(Maybe Text)
    , _urKind :: !Text
    , _urId :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'UserRef' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'urEmail'
--
-- * 'urKind'
--
-- * 'urId'
userRef
    :: UserRef
userRef =
  UserRef' {_urEmail = Nothing, _urKind = "analytics#userRef", _urId = Nothing}


-- | Email ID of this user.
urEmail :: Lens' UserRef (Maybe Text)
urEmail = lens _urEmail (\ s a -> s{_urEmail = a})

urKind :: Lens' UserRef Text
urKind = lens _urKind (\ s a -> s{_urKind = a})

-- | User ID.
urId :: Lens' UserRef (Maybe Text)
urId = lens _urId (\ s a -> s{_urId = a})

instance FromJSON UserRef where
        parseJSON
          = withObject "UserRef"
              (\ o ->
                 UserRef' <$>
                   (o .:? "email") <*>
                     (o .:? "kind" .!= "analytics#userRef")
                     <*> (o .:? "id"))

instance ToJSON UserRef where
        toJSON UserRef'{..}
          = object
              (catMaybes
                 [("email" .=) <$> _urEmail, Just ("kind" .= _urKind),
                  ("id" .=) <$> _urId])

-- | Details for the goal of the type VISIT_NUM_PAGES.
--
-- /See:/ 'goalVisitNumPagesDetails' smart constructor.
data GoalVisitNumPagesDetails =
  GoalVisitNumPagesDetails'
    { _gvnpdComparisonValue :: !(Maybe (Textual Int64))
    , _gvnpdComparisonType :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'GoalVisitNumPagesDetails' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'gvnpdComparisonValue'
--
-- * 'gvnpdComparisonType'
goalVisitNumPagesDetails
    :: GoalVisitNumPagesDetails
goalVisitNumPagesDetails =
  GoalVisitNumPagesDetails'
    {_gvnpdComparisonValue = Nothing, _gvnpdComparisonType = Nothing}


-- | Value used for this comparison.
gvnpdComparisonValue :: Lens' GoalVisitNumPagesDetails (Maybe Int64)
gvnpdComparisonValue
  = lens _gvnpdComparisonValue
      (\ s a -> s{_gvnpdComparisonValue = a})
      . mapping _Coerce

-- | Type of comparison. Possible values are LESS_THAN, GREATER_THAN, or
-- EQUAL.
gvnpdComparisonType :: Lens' GoalVisitNumPagesDetails (Maybe Text)
gvnpdComparisonType
  = lens _gvnpdComparisonType
      (\ s a -> s{_gvnpdComparisonType = a})

instance FromJSON GoalVisitNumPagesDetails where
        parseJSON
          = withObject "GoalVisitNumPagesDetails"
              (\ o ->
                 GoalVisitNumPagesDetails' <$>
                   (o .:? "comparisonValue") <*>
                     (o .:? "comparisonType"))

instance ToJSON GoalVisitNumPagesDetails where
        toJSON GoalVisitNumPagesDetails'{..}
          = object
              (catMaybes
                 [("comparisonValue" .=) <$> _gvnpdComparisonValue,
                  ("comparisonType" .=) <$> _gvnpdComparisonType])

--
-- /See:/ 'realtimeDataColumnHeadersItem' smart constructor.
data RealtimeDataColumnHeadersItem =
  RealtimeDataColumnHeadersItem'
    { _rdchiColumnType :: !(Maybe Text)
    , _rdchiName :: !(Maybe Text)
    , _rdchiDataType :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'RealtimeDataColumnHeadersItem' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'rdchiColumnType'
--
-- * 'rdchiName'
--
-- * 'rdchiDataType'
realtimeDataColumnHeadersItem
    :: RealtimeDataColumnHeadersItem
realtimeDataColumnHeadersItem =
  RealtimeDataColumnHeadersItem'
    {_rdchiColumnType = Nothing, _rdchiName = Nothing, _rdchiDataType = Nothing}


-- | Column Type. Either DIMENSION or METRIC.
rdchiColumnType :: Lens' RealtimeDataColumnHeadersItem (Maybe Text)
rdchiColumnType
  = lens _rdchiColumnType
      (\ s a -> s{_rdchiColumnType = a})

-- | Column name.
rdchiName :: Lens' RealtimeDataColumnHeadersItem (Maybe Text)
rdchiName
  = lens _rdchiName (\ s a -> s{_rdchiName = a})

-- | 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.
rdchiDataType :: Lens' RealtimeDataColumnHeadersItem (Maybe Text)
rdchiDataType
  = lens _rdchiDataType
      (\ s a -> s{_rdchiDataType = a})

instance FromJSON RealtimeDataColumnHeadersItem where
        parseJSON
          = withObject "RealtimeDataColumnHeadersItem"
              (\ o ->
                 RealtimeDataColumnHeadersItem' <$>
                   (o .:? "columnType") <*> (o .:? "name") <*>
                     (o .:? "dataType"))

instance ToJSON RealtimeDataColumnHeadersItem where
        toJSON RealtimeDataColumnHeadersItem'{..}
          = object
              (catMaybes
                 [("columnType" .=) <$> _rdchiColumnType,
                  ("name" .=) <$> _rdchiName,
                  ("dataType" .=) <$> _rdchiDataType])

-- | JSON template for a linked account.
--
-- /See:/ 'accountRef' smart constructor.
data AccountRef =
  AccountRef'
    { _arKind :: !Text
    , _arHref :: !(Maybe Text)
    , _arName :: !(Maybe Text)
    , _arId :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'AccountRef' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'arKind'
--
-- * 'arHref'
--
-- * 'arName'
--
-- * 'arId'
accountRef
    :: AccountRef
accountRef =
  AccountRef'
    { _arKind = "analytics#accountRef"
    , _arHref = Nothing
    , _arName = Nothing
    , _arId = Nothing
    }


-- | Analytics account reference.
arKind :: Lens' AccountRef Text
arKind = lens _arKind (\ s a -> s{_arKind = a})

-- | Link for this account.
arHref :: Lens' AccountRef (Maybe Text)
arHref = lens _arHref (\ s a -> s{_arHref = a})

-- | Account name.
arName :: Lens' AccountRef (Maybe Text)
arName = lens _arName (\ s a -> s{_arName = a})

-- | Account ID.
arId :: Lens' AccountRef (Maybe Text)
arId = lens _arId (\ s a -> s{_arId = a})

instance FromJSON AccountRef where
        parseJSON
          = withObject "AccountRef"
              (\ o ->
                 AccountRef' <$>
                   (o .:? "kind" .!= "analytics#accountRef") <*>
                     (o .:? "href")
                     <*> (o .:? "name")
                     <*> (o .:? "id"))

instance ToJSON AccountRef where
        toJSON AccountRef'{..}
          = object
              (catMaybes
                 [Just ("kind" .= _arKind), ("href" .=) <$> _arHref,
                  ("name" .=) <$> _arName, ("id" .=) <$> _arId])

-- | 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:/ 'entityAdWordsLinks' smart constructor.
data EntityAdWordsLinks =
  EntityAdWordsLinks'
    { _eawlNextLink :: !(Maybe Text)
    , _eawlItemsPerPage :: !(Maybe (Textual Int32))
    , _eawlKind :: !Text
    , _eawlItems :: !(Maybe [EntityAdWordsLink])
    , _eawlTotalResults :: !(Maybe (Textual Int32))
    , _eawlStartIndex :: !(Maybe (Textual Int32))
    , _eawlPreviousLink :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'EntityAdWordsLinks' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'eawlNextLink'
--
-- * 'eawlItemsPerPage'
--
-- * 'eawlKind'
--
-- * 'eawlItems'
--
-- * 'eawlTotalResults'
--
-- * 'eawlStartIndex'
--
-- * 'eawlPreviousLink'
entityAdWordsLinks
    :: EntityAdWordsLinks
entityAdWordsLinks =
  EntityAdWordsLinks'
    { _eawlNextLink = Nothing
    , _eawlItemsPerPage = Nothing
    , _eawlKind = "analytics#entityAdWordsLinks"
    , _eawlItems = Nothing
    , _eawlTotalResults = Nothing
    , _eawlStartIndex = Nothing
    , _eawlPreviousLink = Nothing
    }


-- | Next link for this Google Ads link collection.
eawlNextLink :: Lens' EntityAdWordsLinks (Maybe Text)
eawlNextLink
  = lens _eawlNextLink (\ s a -> s{_eawlNextLink = a})

-- | 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.
eawlItemsPerPage :: Lens' EntityAdWordsLinks (Maybe Int32)
eawlItemsPerPage
  = lens _eawlItemsPerPage
      (\ s a -> s{_eawlItemsPerPage = a})
      . mapping _Coerce

-- | Collection type.
eawlKind :: Lens' EntityAdWordsLinks Text
eawlKind = lens _eawlKind (\ s a -> s{_eawlKind = a})

-- | A list of entity Google Ads links.
eawlItems :: Lens' EntityAdWordsLinks [EntityAdWordsLink]
eawlItems
  = lens _eawlItems (\ s a -> s{_eawlItems = a}) .
      _Default
      . _Coerce

-- | The total number of results for the query, regardless of the number of
-- results in the response.
eawlTotalResults :: Lens' EntityAdWordsLinks (Maybe Int32)
eawlTotalResults
  = lens _eawlTotalResults
      (\ s a -> s{_eawlTotalResults = a})
      . mapping _Coerce

-- | The starting index of the entries, which is 1 by default or otherwise
-- specified by the start-index query parameter.
eawlStartIndex :: Lens' EntityAdWordsLinks (Maybe Int32)
eawlStartIndex
  = lens _eawlStartIndex
      (\ s a -> s{_eawlStartIndex = a})
      . mapping _Coerce

-- | Previous link for this Google Ads link collection.
eawlPreviousLink :: Lens' EntityAdWordsLinks (Maybe Text)
eawlPreviousLink
  = lens _eawlPreviousLink
      (\ s a -> s{_eawlPreviousLink = a})

instance FromJSON EntityAdWordsLinks where
        parseJSON
          = withObject "EntityAdWordsLinks"
              (\ o ->
                 EntityAdWordsLinks' <$>
                   (o .:? "nextLink") <*> (o .:? "itemsPerPage") <*>
                     (o .:? "kind" .!= "analytics#entityAdWordsLinks")
                     <*> (o .:? "items" .!= mempty)
                     <*> (o .:? "totalResults")
                     <*> (o .:? "startIndex")
                     <*> (o .:? "previousLink"))

instance ToJSON EntityAdWordsLinks where
        toJSON EntityAdWordsLinks'{..}
          = object
              (catMaybes
                 [("nextLink" .=) <$> _eawlNextLink,
                  ("itemsPerPage" .=) <$> _eawlItemsPerPage,
                  Just ("kind" .= _eawlKind),
                  ("items" .=) <$> _eawlItems,
                  ("totalResults" .=) <$> _eawlTotalResults,
                  ("startIndex" .=) <$> _eawlStartIndex,
                  ("previousLink" .=) <$> _eawlPreviousLink])

-- | 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:/ 'proFiles' smart constructor.
data ProFiles =
  ProFiles'
    { _pfNextLink :: !(Maybe Text)
    , _pfItemsPerPage :: !(Maybe (Textual Int32))
    , _pfKind :: !Text
    , _pfUsername :: !(Maybe Text)
    , _pfItems :: !(Maybe [ProFile])
    , _pfTotalResults :: !(Maybe (Textual Int32))
    , _pfStartIndex :: !(Maybe (Textual Int32))
    , _pfPreviousLink :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'ProFiles' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'pfNextLink'
--
-- * 'pfItemsPerPage'
--
-- * 'pfKind'
--
-- * 'pfUsername'
--
-- * 'pfItems'
--
-- * 'pfTotalResults'
--
-- * 'pfStartIndex'
--
-- * 'pfPreviousLink'
proFiles
    :: ProFiles
proFiles =
  ProFiles'
    { _pfNextLink = Nothing
    , _pfItemsPerPage = Nothing
    , _pfKind = "analytics#profiles"
    , _pfUsername = Nothing
    , _pfItems = Nothing
    , _pfTotalResults = Nothing
    , _pfStartIndex = Nothing
    , _pfPreviousLink = Nothing
    }


-- | Link to next page for this view (profile) collection.
pfNextLink :: Lens' ProFiles (Maybe Text)
pfNextLink
  = lens _pfNextLink (\ s a -> s{_pfNextLink = a})

-- | 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.
pfItemsPerPage :: Lens' ProFiles (Maybe Int32)
pfItemsPerPage
  = lens _pfItemsPerPage
      (\ s a -> s{_pfItemsPerPage = a})
      . mapping _Coerce

-- | Collection type.
pfKind :: Lens' ProFiles Text
pfKind = lens _pfKind (\ s a -> s{_pfKind = a})

-- | Email ID of the authenticated user
pfUsername :: Lens' ProFiles (Maybe Text)
pfUsername
  = lens _pfUsername (\ s a -> s{_pfUsername = a})

-- | A list of views (profiles).
pfItems :: Lens' ProFiles [ProFile]
pfItems
  = lens _pfItems (\ s a -> s{_pfItems = a}) . _Default
      . _Coerce

-- | The total number of results for the query, regardless of the number of
-- results in the response.
pfTotalResults :: Lens' ProFiles (Maybe Int32)
pfTotalResults
  = lens _pfTotalResults
      (\ s a -> s{_pfTotalResults = a})
      . mapping _Coerce

-- | The starting index of the resources, which is 1 by default or otherwise
-- specified by the start-index query parameter.
pfStartIndex :: Lens' ProFiles (Maybe Int32)
pfStartIndex
  = lens _pfStartIndex (\ s a -> s{_pfStartIndex = a})
      . mapping _Coerce

-- | Link to previous page for this view (profile) collection.
pfPreviousLink :: Lens' ProFiles (Maybe Text)
pfPreviousLink
  = lens _pfPreviousLink
      (\ s a -> s{_pfPreviousLink = a})

instance FromJSON ProFiles where
        parseJSON
          = withObject "ProFiles"
              (\ o ->
                 ProFiles' <$>
                   (o .:? "nextLink") <*> (o .:? "itemsPerPage") <*>
                     (o .:? "kind" .!= "analytics#profiles")
                     <*> (o .:? "username")
                     <*> (o .:? "items" .!= mempty)
                     <*> (o .:? "totalResults")
                     <*> (o .:? "startIndex")
                     <*> (o .:? "previousLink"))

instance ToJSON ProFiles where
        toJSON ProFiles'{..}
          = object
              (catMaybes
                 [("nextLink" .=) <$> _pfNextLink,
                  ("itemsPerPage" .=) <$> _pfItemsPerPage,
                  Just ("kind" .= _pfKind),
                  ("username" .=) <$> _pfUsername,
                  ("items" .=) <$> _pfItems,
                  ("totalResults" .=) <$> _pfTotalResults,
                  ("startIndex" .=) <$> _pfStartIndex,
                  ("previousLink" .=) <$> _pfPreviousLink])

-- | Request template for the delete upload data request.
--
-- /See:/ 'analyticsDataimportDeleteUploadDataRequest' smart constructor.
newtype AnalyticsDataimportDeleteUploadDataRequest =
  AnalyticsDataimportDeleteUploadDataRequest'
    { _addudrCustomDataImportUids :: Maybe [Text]
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'AnalyticsDataimportDeleteUploadDataRequest' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'addudrCustomDataImportUids'
analyticsDataimportDeleteUploadDataRequest
    :: AnalyticsDataimportDeleteUploadDataRequest
analyticsDataimportDeleteUploadDataRequest =
  AnalyticsDataimportDeleteUploadDataRequest'
    {_addudrCustomDataImportUids = Nothing}


-- | A list of upload UIDs.
addudrCustomDataImportUids :: Lens' AnalyticsDataimportDeleteUploadDataRequest [Text]
addudrCustomDataImportUids
  = lens _addudrCustomDataImportUids
      (\ s a -> s{_addudrCustomDataImportUids = a})
      . _Default
      . _Coerce

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

instance ToJSON
           AnalyticsDataimportDeleteUploadDataRequest
         where
        toJSON
          AnalyticsDataimportDeleteUploadDataRequest'{..}
          = object
              (catMaybes
                 [("customDataImportUids" .=) <$>
                    _addudrCustomDataImportUids])

-- | JSON template for Analytics Entity Google Ads Link.
--
-- /See:/ 'entityAdWordsLink' smart constructor.
data EntityAdWordsLink =
  EntityAdWordsLink'
    { _entAdWordsAccounts :: !(Maybe [AdWordsAccount])
    , _entProFileIds :: !(Maybe [Text])
    , _entKind :: !Text
    , _entSelfLink :: !(Maybe Text)
    , _entName :: !(Maybe Text)
    , _entId :: !(Maybe Text)
    , _entEntity :: !(Maybe EntityAdWordsLinkEntity)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'EntityAdWordsLink' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'entAdWordsAccounts'
--
-- * 'entProFileIds'
--
-- * 'entKind'
--
-- * 'entSelfLink'
--
-- * 'entName'
--
-- * 'entId'
--
-- * 'entEntity'
entityAdWordsLink
    :: EntityAdWordsLink
entityAdWordsLink =
  EntityAdWordsLink'
    { _entAdWordsAccounts = Nothing
    , _entProFileIds = Nothing
    , _entKind = "analytics#entityAdWordsLink"
    , _entSelfLink = Nothing
    , _entName = Nothing
    , _entId = Nothing
    , _entEntity = Nothing
    }


-- | 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.
entAdWordsAccounts :: Lens' EntityAdWordsLink [AdWordsAccount]
entAdWordsAccounts
  = lens _entAdWordsAccounts
      (\ s a -> s{_entAdWordsAccounts = a})
      . _Default
      . _Coerce

-- | IDs of linked Views (Profiles) represented as strings.
entProFileIds :: Lens' EntityAdWordsLink [Text]
entProFileIds
  = lens _entProFileIds
      (\ s a -> s{_entProFileIds = a})
      . _Default
      . _Coerce

-- | Resource type for entity Google Ads link.
entKind :: Lens' EntityAdWordsLink Text
entKind = lens _entKind (\ s a -> s{_entKind = a})

-- | URL link for this Google Analytics - Google Ads link.
entSelfLink :: Lens' EntityAdWordsLink (Maybe Text)
entSelfLink
  = lens _entSelfLink (\ s a -> s{_entSelfLink = a})

-- | Name of the link. This field is required when creating a Google Ads
-- link.
entName :: Lens' EntityAdWordsLink (Maybe Text)
entName = lens _entName (\ s a -> s{_entName = a})

-- | Entity Google Ads link ID
entId :: Lens' EntityAdWordsLink (Maybe Text)
entId = lens _entId (\ s a -> s{_entId = a})

-- | Web property being linked.
entEntity :: Lens' EntityAdWordsLink (Maybe EntityAdWordsLinkEntity)
entEntity
  = lens _entEntity (\ s a -> s{_entEntity = a})

instance FromJSON EntityAdWordsLink where
        parseJSON
          = withObject "EntityAdWordsLink"
              (\ o ->
                 EntityAdWordsLink' <$>
                   (o .:? "adWordsAccounts" .!= mempty) <*>
                     (o .:? "profileIds" .!= mempty)
                     <*> (o .:? "kind" .!= "analytics#entityAdWordsLink")
                     <*> (o .:? "selfLink")
                     <*> (o .:? "name")
                     <*> (o .:? "id")
                     <*> (o .:? "entity"))

instance ToJSON EntityAdWordsLink where
        toJSON EntityAdWordsLink'{..}
          = object
              (catMaybes
                 [("adWordsAccounts" .=) <$> _entAdWordsAccounts,
                  ("profileIds" .=) <$> _entProFileIds,
                  Just ("kind" .= _entKind),
                  ("selfLink" .=) <$> _entSelfLink,
                  ("name" .=) <$> _entName, ("id" .=) <$> _entId,
                  ("entity" .=) <$> _entEntity])

-- | Details for the filter of the type SEARCH_AND_REPLACE.
--
-- /See:/ 'filterSearchAndReplaceDetails' smart constructor.
data FilterSearchAndReplaceDetails =
  FilterSearchAndReplaceDetails'
    { _fsardFieldIndex :: !(Maybe (Textual Int32))
    , _fsardField :: !(Maybe Text)
    , _fsardSearchString :: !(Maybe Text)
    , _fsardReplaceString :: !(Maybe Text)
    , _fsardCaseSensitive :: !(Maybe Bool)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'FilterSearchAndReplaceDetails' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'fsardFieldIndex'
--
-- * 'fsardField'
--
-- * 'fsardSearchString'
--
-- * 'fsardReplaceString'
--
-- * 'fsardCaseSensitive'
filterSearchAndReplaceDetails
    :: FilterSearchAndReplaceDetails
filterSearchAndReplaceDetails =
  FilterSearchAndReplaceDetails'
    { _fsardFieldIndex = Nothing
    , _fsardField = Nothing
    , _fsardSearchString = Nothing
    , _fsardReplaceString = Nothing
    , _fsardCaseSensitive = Nothing
    }


-- | The Index of the custom dimension. Required if field is a
-- CUSTOM_DIMENSION.
fsardFieldIndex :: Lens' FilterSearchAndReplaceDetails (Maybe Int32)
fsardFieldIndex
  = lens _fsardFieldIndex
      (\ s a -> s{_fsardFieldIndex = a})
      . mapping _Coerce

-- | Field to use in the filter.
fsardField :: Lens' FilterSearchAndReplaceDetails (Maybe Text)
fsardField
  = lens _fsardField (\ s a -> s{_fsardField = a})

-- | Term to search.
fsardSearchString :: Lens' FilterSearchAndReplaceDetails (Maybe Text)
fsardSearchString
  = lens _fsardSearchString
      (\ s a -> s{_fsardSearchString = a})

-- | Term to replace the search term with.
fsardReplaceString :: Lens' FilterSearchAndReplaceDetails (Maybe Text)
fsardReplaceString
  = lens _fsardReplaceString
      (\ s a -> s{_fsardReplaceString = a})

-- | Determines if the filter is case sensitive.
fsardCaseSensitive :: Lens' FilterSearchAndReplaceDetails (Maybe Bool)
fsardCaseSensitive
  = lens _fsardCaseSensitive
      (\ s a -> s{_fsardCaseSensitive = a})

instance FromJSON FilterSearchAndReplaceDetails where
        parseJSON
          = withObject "FilterSearchAndReplaceDetails"
              (\ o ->
                 FilterSearchAndReplaceDetails' <$>
                   (o .:? "fieldIndex") <*> (o .:? "field") <*>
                     (o .:? "searchString")
                     <*> (o .:? "replaceString")
                     <*> (o .:? "caseSensitive"))

instance ToJSON FilterSearchAndReplaceDetails where
        toJSON FilterSearchAndReplaceDetails'{..}
          = object
              (catMaybes
                 [("fieldIndex" .=) <$> _fsardFieldIndex,
                  ("field" .=) <$> _fsardField,
                  ("searchString" .=) <$> _fsardSearchString,
                  ("replaceString" .=) <$> _fsardReplaceString,
                  ("caseSensitive" .=) <$> _fsardCaseSensitive])

-- | Permissions the user has for this view (profile).
--
-- /See:/ 'proFilePermissions' smart constructor.
newtype ProFilePermissions =
  ProFilePermissions'
    { _pfpEffective :: Maybe [Text]
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'ProFilePermissions' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'pfpEffective'
proFilePermissions
    :: ProFilePermissions
proFilePermissions = ProFilePermissions' {_pfpEffective = Nothing}


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

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

instance ToJSON ProFilePermissions where
        toJSON ProFilePermissions'{..}
          = object
              (catMaybes [("effective" .=) <$> _pfpEffective])

-- | JSON template for an Analytics view (profile).
--
-- /See:/ 'proFile' smart constructor.
data ProFile =
  ProFile'
    { _pParentLink :: !(Maybe ProFileParentLink)
    , _pECommerceTracking :: !(Maybe Bool)
    , _pSiteSearchCategoryParameters :: !(Maybe Text)
    , _pWebPropertyId :: !(Maybe Text)
    , _pChildLink :: !(Maybe ProFileChildLink)
    , _pSiteSearchQueryParameters :: !(Maybe Text)
    , _pKind :: !Text
    , _pDefaultPage :: !(Maybe Text)
    , _pCreated :: !(Maybe DateTime')
    , _pSelfLink :: !(Maybe Text)
    , _pAccountId :: !(Maybe Text)
    , _pBotFilteringEnabled :: !(Maybe Bool)
    , _pName :: !(Maybe Text)
    , _pCurrency :: !(Maybe Text)
    , _pStarred :: !(Maybe Bool)
    , _pInternalWebPropertyId :: !(Maybe Text)
    , _pId :: !(Maybe Text)
    , _pUpdated :: !(Maybe DateTime')
    , _pPermissions :: !(Maybe ProFilePermissions)
    , _pWebsiteURL :: !(Maybe Text)
    , _pType :: !(Maybe Text)
    , _pStripSiteSearchCategoryParameters :: !(Maybe Bool)
    , _pTimezone :: !(Maybe Text)
    , _pExcludeQueryParameters :: !(Maybe Text)
    , _pEnhancedECommerceTracking :: !(Maybe Bool)
    , _pStripSiteSearchQueryParameters :: !(Maybe Bool)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'ProFile' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'pParentLink'
--
-- * 'pECommerceTracking'
--
-- * 'pSiteSearchCategoryParameters'
--
-- * 'pWebPropertyId'
--
-- * 'pChildLink'
--
-- * 'pSiteSearchQueryParameters'
--
-- * 'pKind'
--
-- * 'pDefaultPage'
--
-- * 'pCreated'
--
-- * 'pSelfLink'
--
-- * 'pAccountId'
--
-- * 'pBotFilteringEnabled'
--
-- * 'pName'
--
-- * 'pCurrency'
--
-- * 'pStarred'
--
-- * 'pInternalWebPropertyId'
--
-- * 'pId'
--
-- * 'pUpdated'
--
-- * 'pPermissions'
--
-- * 'pWebsiteURL'
--
-- * 'pType'
--
-- * 'pStripSiteSearchCategoryParameters'
--
-- * 'pTimezone'
--
-- * 'pExcludeQueryParameters'
--
-- * 'pEnhancedECommerceTracking'
--
-- * 'pStripSiteSearchQueryParameters'
proFile
    :: ProFile
proFile =
  ProFile'
    { _pParentLink = Nothing
    , _pECommerceTracking = Nothing
    , _pSiteSearchCategoryParameters = Nothing
    , _pWebPropertyId = Nothing
    , _pChildLink = Nothing
    , _pSiteSearchQueryParameters = Nothing
    , _pKind = "analytics#profile"
    , _pDefaultPage = Nothing
    , _pCreated = Nothing
    , _pSelfLink = Nothing
    , _pAccountId = Nothing
    , _pBotFilteringEnabled = Nothing
    , _pName = Nothing
    , _pCurrency = Nothing
    , _pStarred = Nothing
    , _pInternalWebPropertyId = Nothing
    , _pId = Nothing
    , _pUpdated = Nothing
    , _pPermissions = Nothing
    , _pWebsiteURL = Nothing
    , _pType = Nothing
    , _pStripSiteSearchCategoryParameters = Nothing
    , _pTimezone = Nothing
    , _pExcludeQueryParameters = Nothing
    , _pEnhancedECommerceTracking = Nothing
    , _pStripSiteSearchQueryParameters = Nothing
    }


-- | Parent link for this view (profile). Points to the web property to which
-- this view (profile) belongs.
pParentLink :: Lens' ProFile (Maybe ProFileParentLink)
pParentLink
  = lens _pParentLink (\ s a -> s{_pParentLink = a})

-- | Indicates whether ecommerce tracking is enabled for this view (profile).
pECommerceTracking :: Lens' ProFile (Maybe Bool)
pECommerceTracking
  = lens _pECommerceTracking
      (\ s a -> s{_pECommerceTracking = a})

-- | Site search category parameters for this view (profile).
pSiteSearchCategoryParameters :: Lens' ProFile (Maybe Text)
pSiteSearchCategoryParameters
  = lens _pSiteSearchCategoryParameters
      (\ s a -> s{_pSiteSearchCategoryParameters = a})

-- | Web property ID of the form UA-XXXXX-YY to which this view (profile)
-- belongs.
pWebPropertyId :: Lens' ProFile (Maybe Text)
pWebPropertyId
  = lens _pWebPropertyId
      (\ s a -> s{_pWebPropertyId = a})

-- | Child link for this view (profile). Points to the list of goals for this
-- view (profile).
pChildLink :: Lens' ProFile (Maybe ProFileChildLink)
pChildLink
  = lens _pChildLink (\ s a -> s{_pChildLink = a})

-- | The site search query parameters for this view (profile).
pSiteSearchQueryParameters :: Lens' ProFile (Maybe Text)
pSiteSearchQueryParameters
  = lens _pSiteSearchQueryParameters
      (\ s a -> s{_pSiteSearchQueryParameters = a})

-- | Resource type for Analytics view (profile).
pKind :: Lens' ProFile Text
pKind = lens _pKind (\ s a -> s{_pKind = a})

-- | Default page for this view (profile).
pDefaultPage :: Lens' ProFile (Maybe Text)
pDefaultPage
  = lens _pDefaultPage (\ s a -> s{_pDefaultPage = a})

-- | Time this view (profile) was created.
pCreated :: Lens' ProFile (Maybe UTCTime)
pCreated
  = lens _pCreated (\ s a -> s{_pCreated = a}) .
      mapping _DateTime

-- | Link for this view (profile).
pSelfLink :: Lens' ProFile (Maybe Text)
pSelfLink
  = lens _pSelfLink (\ s a -> s{_pSelfLink = a})

-- | Account ID to which this view (profile) belongs.
pAccountId :: Lens' ProFile (Maybe Text)
pAccountId
  = lens _pAccountId (\ s a -> s{_pAccountId = a})

-- | Indicates whether bot filtering is enabled for this view (profile).
pBotFilteringEnabled :: Lens' ProFile (Maybe Bool)
pBotFilteringEnabled
  = lens _pBotFilteringEnabled
      (\ s a -> s{_pBotFilteringEnabled = a})

-- | Name of this view (profile).
pName :: Lens' ProFile (Maybe Text)
pName = lens _pName (\ s a -> s{_pName = a})

-- | 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
pCurrency :: Lens' ProFile (Maybe Text)
pCurrency
  = lens _pCurrency (\ s a -> s{_pCurrency = a})

-- | Indicates whether this view (profile) is starred or not.
pStarred :: Lens' ProFile (Maybe Bool)
pStarred = lens _pStarred (\ s a -> s{_pStarred = a})

-- | Internal ID for the web property to which this view (profile) belongs.
pInternalWebPropertyId :: Lens' ProFile (Maybe Text)
pInternalWebPropertyId
  = lens _pInternalWebPropertyId
      (\ s a -> s{_pInternalWebPropertyId = a})

-- | View (Profile) ID.
pId :: Lens' ProFile (Maybe Text)
pId = lens _pId (\ s a -> s{_pId = a})

-- | Time this view (profile) was last modified.
pUpdated :: Lens' ProFile (Maybe UTCTime)
pUpdated
  = lens _pUpdated (\ s a -> s{_pUpdated = a}) .
      mapping _DateTime

-- | Permissions the user has for this view (profile).
pPermissions :: Lens' ProFile (Maybe ProFilePermissions)
pPermissions
  = lens _pPermissions (\ s a -> s{_pPermissions = a})

-- | Website URL for this view (profile).
pWebsiteURL :: Lens' ProFile (Maybe Text)
pWebsiteURL
  = lens _pWebsiteURL (\ s a -> s{_pWebsiteURL = a})

-- | View (Profile) type. Supported types: WEB or APP.
pType :: Lens' ProFile (Maybe Text)
pType = lens _pType (\ s a -> s{_pType = a})

-- | Whether or not Analytics will strip search category parameters from the
-- URLs in your reports.
pStripSiteSearchCategoryParameters :: Lens' ProFile (Maybe Bool)
pStripSiteSearchCategoryParameters
  = lens _pStripSiteSearchCategoryParameters
      (\ s a -> s{_pStripSiteSearchCategoryParameters = a})

-- | Time zone for which this view (profile) has been configured. Time zones
-- are identified by strings from the TZ database.
pTimezone :: Lens' ProFile (Maybe Text)
pTimezone
  = lens _pTimezone (\ s a -> s{_pTimezone = a})

-- | The query parameters that are excluded from this view (profile).
pExcludeQueryParameters :: Lens' ProFile (Maybe Text)
pExcludeQueryParameters
  = lens _pExcludeQueryParameters
      (\ s a -> s{_pExcludeQueryParameters = a})

-- | Indicates whether enhanced ecommerce tracking is enabled for this view
-- (profile). This property can only be enabled if ecommerce tracking is
-- enabled.
pEnhancedECommerceTracking :: Lens' ProFile (Maybe Bool)
pEnhancedECommerceTracking
  = lens _pEnhancedECommerceTracking
      (\ s a -> s{_pEnhancedECommerceTracking = a})

-- | Whether or not Analytics will strip search query parameters from the
-- URLs in your reports.
pStripSiteSearchQueryParameters :: Lens' ProFile (Maybe Bool)
pStripSiteSearchQueryParameters
  = lens _pStripSiteSearchQueryParameters
      (\ s a -> s{_pStripSiteSearchQueryParameters = a})

instance FromJSON ProFile where
        parseJSON
          = withObject "ProFile"
              (\ o ->
                 ProFile' <$>
                   (o .:? "parentLink") <*> (o .:? "eCommerceTracking")
                     <*> (o .:? "siteSearchCategoryParameters")
                     <*> (o .:? "webPropertyId")
                     <*> (o .:? "childLink")
                     <*> (o .:? "siteSearchQueryParameters")
                     <*> (o .:? "kind" .!= "analytics#profile")
                     <*> (o .:? "defaultPage")
                     <*> (o .:? "created")
                     <*> (o .:? "selfLink")
                     <*> (o .:? "accountId")
                     <*> (o .:? "botFilteringEnabled")
                     <*> (o .:? "name")
                     <*> (o .:? "currency")
                     <*> (o .:? "starred")
                     <*> (o .:? "internalWebPropertyId")
                     <*> (o .:? "id")
                     <*> (o .:? "updated")
                     <*> (o .:? "permissions")
                     <*> (o .:? "websiteUrl")
                     <*> (o .:? "type")
                     <*> (o .:? "stripSiteSearchCategoryParameters")
                     <*> (o .:? "timezone")
                     <*> (o .:? "excludeQueryParameters")
                     <*> (o .:? "enhancedECommerceTracking")
                     <*> (o .:? "stripSiteSearchQueryParameters"))

instance ToJSON ProFile where
        toJSON ProFile'{..}
          = object
              (catMaybes
                 [("parentLink" .=) <$> _pParentLink,
                  ("eCommerceTracking" .=) <$> _pECommerceTracking,
                  ("siteSearchCategoryParameters" .=) <$>
                    _pSiteSearchCategoryParameters,
                  ("webPropertyId" .=) <$> _pWebPropertyId,
                  ("childLink" .=) <$> _pChildLink,
                  ("siteSearchQueryParameters" .=) <$>
                    _pSiteSearchQueryParameters,
                  Just ("kind" .= _pKind),
                  ("defaultPage" .=) <$> _pDefaultPage,
                  ("created" .=) <$> _pCreated,
                  ("selfLink" .=) <$> _pSelfLink,
                  ("accountId" .=) <$> _pAccountId,
                  ("botFilteringEnabled" .=) <$> _pBotFilteringEnabled,
                  ("name" .=) <$> _pName,
                  ("currency" .=) <$> _pCurrency,
                  ("starred" .=) <$> _pStarred,
                  ("internalWebPropertyId" .=) <$>
                    _pInternalWebPropertyId,
                  ("id" .=) <$> _pId, ("updated" .=) <$> _pUpdated,
                  ("permissions" .=) <$> _pPermissions,
                  ("websiteUrl" .=) <$> _pWebsiteURL,
                  ("type" .=) <$> _pType,
                  ("stripSiteSearchCategoryParameters" .=) <$>
                    _pStripSiteSearchCategoryParameters,
                  ("timezone" .=) <$> _pTimezone,
                  ("excludeQueryParameters" .=) <$>
                    _pExcludeQueryParameters,
                  ("enhancedECommerceTracking" .=) <$>
                    _pEnhancedECommerceTracking,
                  ("stripSiteSearchQueryParameters" .=) <$>
                    _pStripSiteSearchQueryParameters])

-- | 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:/ 'accountSummaries' smart constructor.
data AccountSummaries =
  AccountSummaries'
    { _asNextLink :: !(Maybe Text)
    , _asItemsPerPage :: !(Maybe (Textual Int32))
    , _asKind :: !Text
    , _asUsername :: !(Maybe Text)
    , _asItems :: !(Maybe [AccountSummary])
    , _asTotalResults :: !(Maybe (Textual Int32))
    , _asStartIndex :: !(Maybe (Textual Int32))
    , _asPreviousLink :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'AccountSummaries' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'asNextLink'
--
-- * 'asItemsPerPage'
--
-- * 'asKind'
--
-- * 'asUsername'
--
-- * 'asItems'
--
-- * 'asTotalResults'
--
-- * 'asStartIndex'
--
-- * 'asPreviousLink'
accountSummaries
    :: AccountSummaries
accountSummaries =
  AccountSummaries'
    { _asNextLink = Nothing
    , _asItemsPerPage = Nothing
    , _asKind = "analytics#accountSummaries"
    , _asUsername = Nothing
    , _asItems = Nothing
    , _asTotalResults = Nothing
    , _asStartIndex = Nothing
    , _asPreviousLink = Nothing
    }


-- | Link to next page for this AccountSummary collection.
asNextLink :: Lens' AccountSummaries (Maybe Text)
asNextLink
  = lens _asNextLink (\ s a -> s{_asNextLink = a})

-- | 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.
asItemsPerPage :: Lens' AccountSummaries (Maybe Int32)
asItemsPerPage
  = lens _asItemsPerPage
      (\ s a -> s{_asItemsPerPage = a})
      . mapping _Coerce

-- | Collection type.
asKind :: Lens' AccountSummaries Text
asKind = lens _asKind (\ s a -> s{_asKind = a})

-- | Email ID of the authenticated user
asUsername :: Lens' AccountSummaries (Maybe Text)
asUsername
  = lens _asUsername (\ s a -> s{_asUsername = a})

-- | A list of AccountSummaries.
asItems :: Lens' AccountSummaries [AccountSummary]
asItems
  = lens _asItems (\ s a -> s{_asItems = a}) . _Default
      . _Coerce

-- | The total number of results for the query, regardless of the number of
-- results in the response.
asTotalResults :: Lens' AccountSummaries (Maybe Int32)
asTotalResults
  = lens _asTotalResults
      (\ s a -> s{_asTotalResults = a})
      . mapping _Coerce

-- | The starting index of the resources, which is 1 by default or otherwise
-- specified by the start-index query parameter.
asStartIndex :: Lens' AccountSummaries (Maybe Int32)
asStartIndex
  = lens _asStartIndex (\ s a -> s{_asStartIndex = a})
      . mapping _Coerce

-- | Link to previous page for this AccountSummary collection.
asPreviousLink :: Lens' AccountSummaries (Maybe Text)
asPreviousLink
  = lens _asPreviousLink
      (\ s a -> s{_asPreviousLink = a})

instance FromJSON AccountSummaries where
        parseJSON
          = withObject "AccountSummaries"
              (\ o ->
                 AccountSummaries' <$>
                   (o .:? "nextLink") <*> (o .:? "itemsPerPage") <*>
                     (o .:? "kind" .!= "analytics#accountSummaries")
                     <*> (o .:? "username")
                     <*> (o .:? "items" .!= mempty)
                     <*> (o .:? "totalResults")
                     <*> (o .:? "startIndex")
                     <*> (o .:? "previousLink"))

instance ToJSON AccountSummaries where
        toJSON AccountSummaries'{..}
          = object
              (catMaybes
                 [("nextLink" .=) <$> _asNextLink,
                  ("itemsPerPage" .=) <$> _asItemsPerPage,
                  Just ("kind" .= _asKind),
                  ("username" .=) <$> _asUsername,
                  ("items" .=) <$> _asItems,
                  ("totalResults" .=) <$> _asTotalResults,
                  ("startIndex" .=) <$> _asStartIndex,
                  ("previousLink" .=) <$> _asPreviousLink])

-- | Details for the goal of the type EVENT.
--
-- /See:/ 'goalEventDetails' smart constructor.
data GoalEventDetails =
  GoalEventDetails'
    { _gedUseEventValue :: !(Maybe Bool)
    , _gedEventConditions :: !(Maybe [GoalEventDetailsEventConditionsItem])
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'GoalEventDetails' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'gedUseEventValue'
--
-- * 'gedEventConditions'
goalEventDetails
    :: GoalEventDetails
goalEventDetails =
  GoalEventDetails' {_gedUseEventValue = Nothing, _gedEventConditions = Nothing}


-- | Determines if the event value should be used as the value for this goal.
gedUseEventValue :: Lens' GoalEventDetails (Maybe Bool)
gedUseEventValue
  = lens _gedUseEventValue
      (\ s a -> s{_gedUseEventValue = a})

-- | List of event conditions.
gedEventConditions :: Lens' GoalEventDetails [GoalEventDetailsEventConditionsItem]
gedEventConditions
  = lens _gedEventConditions
      (\ s a -> s{_gedEventConditions = a})
      . _Default
      . _Coerce

instance FromJSON GoalEventDetails where
        parseJSON
          = withObject "GoalEventDetails"
              (\ o ->
                 GoalEventDetails' <$>
                   (o .:? "useEventValue") <*>
                     (o .:? "eventConditions" .!= mempty))

instance ToJSON GoalEventDetails where
        toJSON GoalEventDetails'{..}
          = object
              (catMaybes
                 [("useEventValue" .=) <$> _gedUseEventValue,
                  ("eventConditions" .=) <$> _gedEventConditions])

-- | JSON template for an Analytics WebPropertySummary. WebPropertySummary
-- returns basic information (i.e., summary) for a web property.
--
-- /See:/ 'webPropertySummary' smart constructor.
data WebPropertySummary =
  WebPropertySummary'
    { _wpsKind :: !Text
    , _wpsProFiles :: !(Maybe [ProFileSummary])
    , _wpsName :: !(Maybe Text)
    , _wpsStarred :: !(Maybe Bool)
    , _wpsInternalWebPropertyId :: !(Maybe Text)
    , _wpsId :: !(Maybe Text)
    , _wpsWebsiteURL :: !(Maybe Text)
    , _wpsLevel :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'WebPropertySummary' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'wpsKind'
--
-- * 'wpsProFiles'
--
-- * 'wpsName'
--
-- * 'wpsStarred'
--
-- * 'wpsInternalWebPropertyId'
--
-- * 'wpsId'
--
-- * 'wpsWebsiteURL'
--
-- * 'wpsLevel'
webPropertySummary
    :: WebPropertySummary
webPropertySummary =
  WebPropertySummary'
    { _wpsKind = "analytics#webPropertySummary"
    , _wpsProFiles = Nothing
    , _wpsName = Nothing
    , _wpsStarred = Nothing
    , _wpsInternalWebPropertyId = Nothing
    , _wpsId = Nothing
    , _wpsWebsiteURL = Nothing
    , _wpsLevel = Nothing
    }


-- | Resource type for Analytics WebPropertySummary.
wpsKind :: Lens' WebPropertySummary Text
wpsKind = lens _wpsKind (\ s a -> s{_wpsKind = a})

-- | List of profiles under this web property.
wpsProFiles :: Lens' WebPropertySummary [ProFileSummary]
wpsProFiles
  = lens _wpsProFiles (\ s a -> s{_wpsProFiles = a}) .
      _Default
      . _Coerce

-- | Web property name.
wpsName :: Lens' WebPropertySummary (Maybe Text)
wpsName = lens _wpsName (\ s a -> s{_wpsName = a})

-- | Indicates whether this web property is starred or not.
wpsStarred :: Lens' WebPropertySummary (Maybe Bool)
wpsStarred
  = lens _wpsStarred (\ s a -> s{_wpsStarred = a})

-- | Internal ID for this web property.
wpsInternalWebPropertyId :: Lens' WebPropertySummary (Maybe Text)
wpsInternalWebPropertyId
  = lens _wpsInternalWebPropertyId
      (\ s a -> s{_wpsInternalWebPropertyId = a})

-- | Web property ID of the form UA-XXXXX-YY.
wpsId :: Lens' WebPropertySummary (Maybe Text)
wpsId = lens _wpsId (\ s a -> s{_wpsId = a})

-- | Website url for this web property.
wpsWebsiteURL :: Lens' WebPropertySummary (Maybe Text)
wpsWebsiteURL
  = lens _wpsWebsiteURL
      (\ s a -> s{_wpsWebsiteURL = a})

-- | Level for this web property. Possible values are STANDARD or PREMIUM.
wpsLevel :: Lens' WebPropertySummary (Maybe Text)
wpsLevel = lens _wpsLevel (\ s a -> s{_wpsLevel = a})

instance FromJSON WebPropertySummary where
        parseJSON
          = withObject "WebPropertySummary"
              (\ o ->
                 WebPropertySummary' <$>
                   (o .:? "kind" .!= "analytics#webPropertySummary") <*>
                     (o .:? "profiles" .!= mempty)
                     <*> (o .:? "name")
                     <*> (o .:? "starred")
                     <*> (o .:? "internalWebPropertyId")
                     <*> (o .:? "id")
                     <*> (o .:? "websiteUrl")
                     <*> (o .:? "level"))

instance ToJSON WebPropertySummary where
        toJSON WebPropertySummary'{..}
          = object
              (catMaybes
                 [Just ("kind" .= _wpsKind),
                  ("profiles" .=) <$> _wpsProFiles,
                  ("name" .=) <$> _wpsName,
                  ("starred" .=) <$> _wpsStarred,
                  ("internalWebPropertyId" .=) <$>
                    _wpsInternalWebPropertyId,
                  ("id" .=) <$> _wpsId,
                  ("websiteUrl" .=) <$> _wpsWebsiteURL,
                  ("level" .=) <$> _wpsLevel])

-- | A filter collection lists filters created by users in an Analytics
-- account. Each resource in the collection corresponds to a filter.
--
-- /See:/ 'filters' smart constructor.
data Filters =
  Filters'
    { _fNextLink :: !(Maybe Text)
    , _fItemsPerPage :: !(Maybe (Textual Int32))
    , _fKind :: !Text
    , _fUsername :: !(Maybe Text)
    , _fItems :: !(Maybe [Filter])
    , _fTotalResults :: !(Maybe (Textual Int32))
    , _fStartIndex :: !(Maybe (Textual Int32))
    , _fPreviousLink :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'Filters' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'fNextLink'
--
-- * 'fItemsPerPage'
--
-- * 'fKind'
--
-- * 'fUsername'
--
-- * 'fItems'
--
-- * 'fTotalResults'
--
-- * 'fStartIndex'
--
-- * 'fPreviousLink'
filters
    :: Filters
filters =
  Filters'
    { _fNextLink = Nothing
    , _fItemsPerPage = Nothing
    , _fKind = "analytics#filters"
    , _fUsername = Nothing
    , _fItems = Nothing
    , _fTotalResults = Nothing
    , _fStartIndex = Nothing
    , _fPreviousLink = Nothing
    }


-- | Link to next page for this filter collection.
fNextLink :: Lens' Filters (Maybe Text)
fNextLink
  = lens _fNextLink (\ s a -> s{_fNextLink = a})

-- | 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.
fItemsPerPage :: Lens' Filters (Maybe Int32)
fItemsPerPage
  = lens _fItemsPerPage
      (\ s a -> s{_fItemsPerPage = a})
      . mapping _Coerce

-- | Collection type.
fKind :: Lens' Filters Text
fKind = lens _fKind (\ s a -> s{_fKind = a})

-- | Email ID of the authenticated user
fUsername :: Lens' Filters (Maybe Text)
fUsername
  = lens _fUsername (\ s a -> s{_fUsername = a})

-- | A list of filters.
fItems :: Lens' Filters [Filter]
fItems
  = lens _fItems (\ s a -> s{_fItems = a}) . _Default .
      _Coerce

-- | The total number of results for the query, regardless of the number of
-- results in the response.
fTotalResults :: Lens' Filters (Maybe Int32)
fTotalResults
  = lens _fTotalResults
      (\ s a -> s{_fTotalResults = a})
      . mapping _Coerce

-- | The starting index of the resources, which is 1 by default or otherwise
-- specified by the start-index query parameter.
fStartIndex :: Lens' Filters (Maybe Int32)
fStartIndex
  = lens _fStartIndex (\ s a -> s{_fStartIndex = a}) .
      mapping _Coerce

-- | Link to previous page for this filter collection.
fPreviousLink :: Lens' Filters (Maybe Text)
fPreviousLink
  = lens _fPreviousLink
      (\ s a -> s{_fPreviousLink = a})

instance FromJSON Filters where
        parseJSON
          = withObject "Filters"
              (\ o ->
                 Filters' <$>
                   (o .:? "nextLink") <*> (o .:? "itemsPerPage") <*>
                     (o .:? "kind" .!= "analytics#filters")
                     <*> (o .:? "username")
                     <*> (o .:? "items" .!= mempty)
                     <*> (o .:? "totalResults")
                     <*> (o .:? "startIndex")
                     <*> (o .:? "previousLink"))

instance ToJSON Filters where
        toJSON Filters'{..}
          = object
              (catMaybes
                 [("nextLink" .=) <$> _fNextLink,
                  ("itemsPerPage" .=) <$> _fItemsPerPage,
                  Just ("kind" .= _fKind),
                  ("username" .=) <$> _fUsername,
                  ("items" .=) <$> _fItems,
                  ("totalResults" .=) <$> _fTotalResults,
                  ("startIndex" .=) <$> _fStartIndex,
                  ("previousLink" .=) <$> _fPreviousLink])

-- | Analytics data for a given view (profile).
--
-- /See:/ 'gaData' smart constructor.
data GaData =
  GaData'
    { _gdNextLink :: !(Maybe Text)
    , _gdSampleSpace :: !(Maybe (Textual Int64))
    , _gdItemsPerPage :: !(Maybe (Textual Int32))
    , _gdProFileInfo :: !(Maybe GaDataProFileInfo)
    , _gdKind :: !Text
    , _gdSampleSize :: !(Maybe (Textual Int64))
    , _gdRows :: !(Maybe [[Text]])
    , _gdSelfLink :: !(Maybe Text)
    , _gdQuery :: !(Maybe GaDataQuery)
    , _gdColumnHeaders :: !(Maybe [GaDataColumnHeadersItem])
    , _gdId :: !(Maybe Text)
    , _gdTotalResults :: !(Maybe (Textual Int32))
    , _gdDataLastRefreshed :: !(Maybe (Textual Int64))
    , _gdDataTable :: !(Maybe GaDataDataTable)
    , _gdContainsSampledData :: !(Maybe Bool)
    , _gdTotalsForAllResults :: !(Maybe GaDataTotalsForAllResults)
    , _gdPreviousLink :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'GaData' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'gdNextLink'
--
-- * 'gdSampleSpace'
--
-- * 'gdItemsPerPage'
--
-- * 'gdProFileInfo'
--
-- * 'gdKind'
--
-- * 'gdSampleSize'
--
-- * 'gdRows'
--
-- * 'gdSelfLink'
--
-- * 'gdQuery'
--
-- * 'gdColumnHeaders'
--
-- * 'gdId'
--
-- * 'gdTotalResults'
--
-- * 'gdDataLastRefreshed'
--
-- * 'gdDataTable'
--
-- * 'gdContainsSampledData'
--
-- * 'gdTotalsForAllResults'
--
-- * 'gdPreviousLink'
gaData
    :: GaData
gaData =
  GaData'
    { _gdNextLink = Nothing
    , _gdSampleSpace = Nothing
    , _gdItemsPerPage = Nothing
    , _gdProFileInfo = Nothing
    , _gdKind = "analytics#gaData"
    , _gdSampleSize = Nothing
    , _gdRows = Nothing
    , _gdSelfLink = Nothing
    , _gdQuery = Nothing
    , _gdColumnHeaders = Nothing
    , _gdId = Nothing
    , _gdTotalResults = Nothing
    , _gdDataLastRefreshed = Nothing
    , _gdDataTable = Nothing
    , _gdContainsSampledData = Nothing
    , _gdTotalsForAllResults = Nothing
    , _gdPreviousLink = Nothing
    }


-- | Link to next page for this Analytics data query.
gdNextLink :: Lens' GaData (Maybe Text)
gdNextLink
  = lens _gdNextLink (\ s a -> s{_gdNextLink = a})

-- | Total size of the sample space from which the samples were selected.
gdSampleSpace :: Lens' GaData (Maybe Int64)
gdSampleSpace
  = lens _gdSampleSpace
      (\ s a -> s{_gdSampleSpace = a})
      . mapping _Coerce

-- | 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.
gdItemsPerPage :: Lens' GaData (Maybe Int32)
gdItemsPerPage
  = lens _gdItemsPerPage
      (\ s a -> s{_gdItemsPerPage = a})
      . mapping _Coerce

-- | Information for the view (profile), for which the Analytics data was
-- requested.
gdProFileInfo :: Lens' GaData (Maybe GaDataProFileInfo)
gdProFileInfo
  = lens _gdProFileInfo
      (\ s a -> s{_gdProFileInfo = a})

-- | Resource type.
gdKind :: Lens' GaData Text
gdKind = lens _gdKind (\ s a -> s{_gdKind = a})

-- | The number of samples used to calculate the result.
gdSampleSize :: Lens' GaData (Maybe Int64)
gdSampleSize
  = lens _gdSampleSize (\ s a -> s{_gdSampleSize = a})
      . mapping _Coerce

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

-- | Link to this page.
gdSelfLink :: Lens' GaData (Maybe Text)
gdSelfLink
  = lens _gdSelfLink (\ s a -> s{_gdSelfLink = a})

-- | Analytics data request query parameters.
gdQuery :: Lens' GaData (Maybe GaDataQuery)
gdQuery = lens _gdQuery (\ s a -> s{_gdQuery = a})

-- | Column headers that list dimension names followed by the metric names.
-- The order of dimensions and metrics is same as specified in the request.
gdColumnHeaders :: Lens' GaData [GaDataColumnHeadersItem]
gdColumnHeaders
  = lens _gdColumnHeaders
      (\ s a -> s{_gdColumnHeaders = a})
      . _Default
      . _Coerce

-- | Unique ID for this data response.
gdId :: Lens' GaData (Maybe Text)
gdId = lens _gdId (\ s a -> s{_gdId = a})

-- | The total number of rows for the query, regardless of the number of rows
-- in the response.
gdTotalResults :: Lens' GaData (Maybe Int32)
gdTotalResults
  = lens _gdTotalResults
      (\ s a -> s{_gdTotalResults = a})
      . mapping _Coerce

-- | The last refreshed time in seconds for Analytics data.
gdDataLastRefreshed :: Lens' GaData (Maybe Int64)
gdDataLastRefreshed
  = lens _gdDataLastRefreshed
      (\ s a -> s{_gdDataLastRefreshed = a})
      . mapping _Coerce

gdDataTable :: Lens' GaData (Maybe GaDataDataTable)
gdDataTable
  = lens _gdDataTable (\ s a -> s{_gdDataTable = a})

-- | Determines if Analytics data contains samples.
gdContainsSampledData :: Lens' GaData (Maybe Bool)
gdContainsSampledData
  = lens _gdContainsSampledData
      (\ s a -> s{_gdContainsSampledData = a})

-- | 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.
gdTotalsForAllResults :: Lens' GaData (Maybe GaDataTotalsForAllResults)
gdTotalsForAllResults
  = lens _gdTotalsForAllResults
      (\ s a -> s{_gdTotalsForAllResults = a})

-- | Link to previous page for this Analytics data query.
gdPreviousLink :: Lens' GaData (Maybe Text)
gdPreviousLink
  = lens _gdPreviousLink
      (\ s a -> s{_gdPreviousLink = a})

instance FromJSON GaData where
        parseJSON
          = withObject "GaData"
              (\ o ->
                 GaData' <$>
                   (o .:? "nextLink") <*> (o .:? "sampleSpace") <*>
                     (o .:? "itemsPerPage")
                     <*> (o .:? "profileInfo")
                     <*> (o .:? "kind" .!= "analytics#gaData")
                     <*> (o .:? "sampleSize")
                     <*> (o .:? "rows" .!= mempty)
                     <*> (o .:? "selfLink")
                     <*> (o .:? "query")
                     <*> (o .:? "columnHeaders" .!= mempty)
                     <*> (o .:? "id")
                     <*> (o .:? "totalResults")
                     <*> (o .:? "dataLastRefreshed")
                     <*> (o .:? "dataTable")
                     <*> (o .:? "containsSampledData")
                     <*> (o .:? "totalsForAllResults")
                     <*> (o .:? "previousLink"))

instance ToJSON GaData where
        toJSON GaData'{..}
          = object
              (catMaybes
                 [("nextLink" .=) <$> _gdNextLink,
                  ("sampleSpace" .=) <$> _gdSampleSpace,
                  ("itemsPerPage" .=) <$> _gdItemsPerPage,
                  ("profileInfo" .=) <$> _gdProFileInfo,
                  Just ("kind" .= _gdKind),
                  ("sampleSize" .=) <$> _gdSampleSize,
                  ("rows" .=) <$> _gdRows,
                  ("selfLink" .=) <$> _gdSelfLink,
                  ("query" .=) <$> _gdQuery,
                  ("columnHeaders" .=) <$> _gdColumnHeaders,
                  ("id" .=) <$> _gdId,
                  ("totalResults" .=) <$> _gdTotalResults,
                  ("dataLastRefreshed" .=) <$> _gdDataLastRefreshed,
                  ("dataTable" .=) <$> _gdDataTable,
                  ("containsSampledData" .=) <$>
                    _gdContainsSampledData,
                  ("totalsForAllResults" .=) <$>
                    _gdTotalsForAllResults,
                  ("previousLink" .=) <$> _gdPreviousLink])

-- | 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:/ 'realtimeDataTotalsForAllResults' smart constructor.
newtype RealtimeDataTotalsForAllResults =
  RealtimeDataTotalsForAllResults'
    { _rdtfarAddtional :: HashMap Text Text
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'RealtimeDataTotalsForAllResults' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'rdtfarAddtional'
realtimeDataTotalsForAllResults
    :: HashMap Text Text -- ^ 'rdtfarAddtional'
    -> RealtimeDataTotalsForAllResults
realtimeDataTotalsForAllResults pRdtfarAddtional_ =
  RealtimeDataTotalsForAllResults'
    {_rdtfarAddtional = _Coerce # pRdtfarAddtional_}


-- | 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.
rdtfarAddtional :: Lens' RealtimeDataTotalsForAllResults (HashMap Text Text)
rdtfarAddtional
  = lens _rdtfarAddtional
      (\ s a -> s{_rdtfarAddtional = a})
      . _Coerce

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

instance ToJSON RealtimeDataTotalsForAllResults where
        toJSON = toJSON . _rdtfarAddtional

-- | JSON template for an Analytics custom data source.
--
-- /See:/ 'customDataSource' smart constructor.
data CustomDataSource =
  CustomDataSource'
    { _cParentLink :: !(Maybe CustomDataSourceParentLink)
    , _cWebPropertyId :: !(Maybe Text)
    , _cChildLink :: !(Maybe CustomDataSourceChildLink)
    , _cKind :: !Text
    , _cCreated :: !(Maybe DateTime')
    , _cUploadType :: !(Maybe Text)
    , _cSchema :: !(Maybe [Text])
    , _cImportBehavior :: !(Maybe Text)
    , _cSelfLink :: !(Maybe Text)
    , _cAccountId :: !(Maybe Text)
    , _cName :: !(Maybe Text)
    , _cId :: !(Maybe Text)
    , _cUpdated :: !(Maybe DateTime')
    , _cType :: !(Maybe Text)
    , _cDescription :: !(Maybe Text)
    , _cProFilesLinked :: !(Maybe [Text])
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'CustomDataSource' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'cParentLink'
--
-- * 'cWebPropertyId'
--
-- * 'cChildLink'
--
-- * 'cKind'
--
-- * 'cCreated'
--
-- * 'cUploadType'
--
-- * 'cSchema'
--
-- * 'cImportBehavior'
--
-- * 'cSelfLink'
--
-- * 'cAccountId'
--
-- * 'cName'
--
-- * 'cId'
--
-- * 'cUpdated'
--
-- * 'cType'
--
-- * 'cDescription'
--
-- * 'cProFilesLinked'
customDataSource
    :: CustomDataSource
customDataSource =
  CustomDataSource'
    { _cParentLink = Nothing
    , _cWebPropertyId = Nothing
    , _cChildLink = Nothing
    , _cKind = "analytics#customDataSource"
    , _cCreated = Nothing
    , _cUploadType = Nothing
    , _cSchema = Nothing
    , _cImportBehavior = Nothing
    , _cSelfLink = Nothing
    , _cAccountId = Nothing
    , _cName = Nothing
    , _cId = Nothing
    , _cUpdated = Nothing
    , _cType = Nothing
    , _cDescription = Nothing
    , _cProFilesLinked = Nothing
    }


-- | Parent link for this custom data source. Points to the web property to
-- which this custom data source belongs.
cParentLink :: Lens' CustomDataSource (Maybe CustomDataSourceParentLink)
cParentLink
  = lens _cParentLink (\ s a -> s{_cParentLink = a})

-- | Web property ID of the form UA-XXXXX-YY to which this custom data source
-- belongs.
cWebPropertyId :: Lens' CustomDataSource (Maybe Text)
cWebPropertyId
  = lens _cWebPropertyId
      (\ s a -> s{_cWebPropertyId = a})

cChildLink :: Lens' CustomDataSource (Maybe CustomDataSourceChildLink)
cChildLink
  = lens _cChildLink (\ s a -> s{_cChildLink = a})

-- | Resource type for Analytics custom data source.
cKind :: Lens' CustomDataSource Text
cKind = lens _cKind (\ s a -> s{_cKind = a})

-- | Time this custom data source was created.
cCreated :: Lens' CustomDataSource (Maybe UTCTime)
cCreated
  = lens _cCreated (\ s a -> s{_cCreated = a}) .
      mapping _DateTime

-- | Upload type of the custom data source.
cUploadType :: Lens' CustomDataSource (Maybe Text)
cUploadType
  = lens _cUploadType (\ s a -> s{_cUploadType = a})

-- | Collection of schema headers of the custom data source.
cSchema :: Lens' CustomDataSource [Text]
cSchema
  = lens _cSchema (\ s a -> s{_cSchema = a}) . _Default
      . _Coerce

cImportBehavior :: Lens' CustomDataSource (Maybe Text)
cImportBehavior
  = lens _cImportBehavior
      (\ s a -> s{_cImportBehavior = a})

-- | Link for this Analytics custom data source.
cSelfLink :: Lens' CustomDataSource (Maybe Text)
cSelfLink
  = lens _cSelfLink (\ s a -> s{_cSelfLink = a})

-- | Account ID to which this custom data source belongs.
cAccountId :: Lens' CustomDataSource (Maybe Text)
cAccountId
  = lens _cAccountId (\ s a -> s{_cAccountId = a})

-- | Name of this custom data source.
cName :: Lens' CustomDataSource (Maybe Text)
cName = lens _cName (\ s a -> s{_cName = a})

-- | Custom data source ID.
cId :: Lens' CustomDataSource (Maybe Text)
cId = lens _cId (\ s a -> s{_cId = a})

-- | Time this custom data source was last modified.
cUpdated :: Lens' CustomDataSource (Maybe UTCTime)
cUpdated
  = lens _cUpdated (\ s a -> s{_cUpdated = a}) .
      mapping _DateTime

-- | Type of the custom data source.
cType :: Lens' CustomDataSource (Maybe Text)
cType = lens _cType (\ s a -> s{_cType = a})

-- | Description of custom data source.
cDescription :: Lens' CustomDataSource (Maybe Text)
cDescription
  = lens _cDescription (\ s a -> s{_cDescription = a})

-- | IDs of views (profiles) linked to the custom data source.
cProFilesLinked :: Lens' CustomDataSource [Text]
cProFilesLinked
  = lens _cProFilesLinked
      (\ s a -> s{_cProFilesLinked = a})
      . _Default
      . _Coerce

instance FromJSON CustomDataSource where
        parseJSON
          = withObject "CustomDataSource"
              (\ o ->
                 CustomDataSource' <$>
                   (o .:? "parentLink") <*> (o .:? "webPropertyId") <*>
                     (o .:? "childLink")
                     <*> (o .:? "kind" .!= "analytics#customDataSource")
                     <*> (o .:? "created")
                     <*> (o .:? "uploadType")
                     <*> (o .:? "schema" .!= mempty)
                     <*> (o .:? "importBehavior")
                     <*> (o .:? "selfLink")
                     <*> (o .:? "accountId")
                     <*> (o .:? "name")
                     <*> (o .:? "id")
                     <*> (o .:? "updated")
                     <*> (o .:? "type")
                     <*> (o .:? "description")
                     <*> (o .:? "profilesLinked" .!= mempty))

instance ToJSON CustomDataSource where
        toJSON CustomDataSource'{..}
          = object
              (catMaybes
                 [("parentLink" .=) <$> _cParentLink,
                  ("webPropertyId" .=) <$> _cWebPropertyId,
                  ("childLink" .=) <$> _cChildLink,
                  Just ("kind" .= _cKind),
                  ("created" .=) <$> _cCreated,
                  ("uploadType" .=) <$> _cUploadType,
                  ("schema" .=) <$> _cSchema,
                  ("importBehavior" .=) <$> _cImportBehavior,
                  ("selfLink" .=) <$> _cSelfLink,
                  ("accountId" .=) <$> _cAccountId,
                  ("name" .=) <$> _cName, ("id" .=) <$> _cId,
                  ("updated" .=) <$> _cUpdated, ("type" .=) <$> _cType,
                  ("description" .=) <$> _cDescription,
                  ("profilesLinked" .=) <$> _cProFilesLinked])

-- | 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:/ 'accountTreeRequest' smart constructor.
data AccountTreeRequest =
  AccountTreeRequest'
    { _atrWebPropertyName :: !(Maybe Text)
    , _atrKind :: !Text
    , _atrAccountName :: !(Maybe Text)
    , _atrProFileName :: !(Maybe Text)
    , _atrWebsiteURL :: !(Maybe Text)
    , _atrTimezone :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'AccountTreeRequest' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'atrWebPropertyName'
--
-- * 'atrKind'
--
-- * 'atrAccountName'
--
-- * 'atrProFileName'
--
-- * 'atrWebsiteURL'
--
-- * 'atrTimezone'
accountTreeRequest
    :: AccountTreeRequest
accountTreeRequest =
  AccountTreeRequest'
    { _atrWebPropertyName = Nothing
    , _atrKind = "analytics#accountTreeRequest"
    , _atrAccountName = Nothing
    , _atrProFileName = Nothing
    , _atrWebsiteURL = Nothing
    , _atrTimezone = Nothing
    }


atrWebPropertyName :: Lens' AccountTreeRequest (Maybe Text)
atrWebPropertyName
  = lens _atrWebPropertyName
      (\ s a -> s{_atrWebPropertyName = a})

-- | Resource type for account ticket.
atrKind :: Lens' AccountTreeRequest Text
atrKind = lens _atrKind (\ s a -> s{_atrKind = a})

atrAccountName :: Lens' AccountTreeRequest (Maybe Text)
atrAccountName
  = lens _atrAccountName
      (\ s a -> s{_atrAccountName = a})

atrProFileName :: Lens' AccountTreeRequest (Maybe Text)
atrProFileName
  = lens _atrProFileName
      (\ s a -> s{_atrProFileName = a})

atrWebsiteURL :: Lens' AccountTreeRequest (Maybe Text)
atrWebsiteURL
  = lens _atrWebsiteURL
      (\ s a -> s{_atrWebsiteURL = a})

atrTimezone :: Lens' AccountTreeRequest (Maybe Text)
atrTimezone
  = lens _atrTimezone (\ s a -> s{_atrTimezone = a})

instance FromJSON AccountTreeRequest where
        parseJSON
          = withObject "AccountTreeRequest"
              (\ o ->
                 AccountTreeRequest' <$>
                   (o .:? "webpropertyName") <*>
                     (o .:? "kind" .!= "analytics#accountTreeRequest")
                     <*> (o .:? "accountName")
                     <*> (o .:? "profileName")
                     <*> (o .:? "websiteUrl")
                     <*> (o .:? "timezone"))

instance ToJSON AccountTreeRequest where
        toJSON AccountTreeRequest'{..}
          = object
              (catMaybes
                 [("webpropertyName" .=) <$> _atrWebPropertyName,
                  Just ("kind" .= _atrKind),
                  ("accountName" .=) <$> _atrAccountName,
                  ("profileName" .=) <$> _atrProFileName,
                  ("websiteUrl" .=) <$> _atrWebsiteURL,
                  ("timezone" .=) <$> _atrTimezone])

-- | JSON template for a web property reference.
--
-- /See:/ 'webPropertyRef' smart constructor.
data WebPropertyRef =
  WebPropertyRef'
    { _wprKind :: !Text
    , _wprHref :: !(Maybe Text)
    , _wprAccountId :: !(Maybe Text)
    , _wprName :: !(Maybe Text)
    , _wprInternalWebPropertyId :: !(Maybe Text)
    , _wprId :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'WebPropertyRef' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'wprKind'
--
-- * 'wprHref'
--
-- * 'wprAccountId'
--
-- * 'wprName'
--
-- * 'wprInternalWebPropertyId'
--
-- * 'wprId'
webPropertyRef
    :: WebPropertyRef
webPropertyRef =
  WebPropertyRef'
    { _wprKind = "analytics#webPropertyRef"
    , _wprHref = Nothing
    , _wprAccountId = Nothing
    , _wprName = Nothing
    , _wprInternalWebPropertyId = Nothing
    , _wprId = Nothing
    }


-- | Analytics web property reference.
wprKind :: Lens' WebPropertyRef Text
wprKind = lens _wprKind (\ s a -> s{_wprKind = a})

-- | Link for this web property.
wprHref :: Lens' WebPropertyRef (Maybe Text)
wprHref = lens _wprHref (\ s a -> s{_wprHref = a})

-- | Account ID to which this web property belongs.
wprAccountId :: Lens' WebPropertyRef (Maybe Text)
wprAccountId
  = lens _wprAccountId (\ s a -> s{_wprAccountId = a})

-- | Name of this web property.
wprName :: Lens' WebPropertyRef (Maybe Text)
wprName = lens _wprName (\ s a -> s{_wprName = a})

-- | Internal ID for this web property.
wprInternalWebPropertyId :: Lens' WebPropertyRef (Maybe Text)
wprInternalWebPropertyId
  = lens _wprInternalWebPropertyId
      (\ s a -> s{_wprInternalWebPropertyId = a})

-- | Web property ID of the form UA-XXXXX-YY.
wprId :: Lens' WebPropertyRef (Maybe Text)
wprId = lens _wprId (\ s a -> s{_wprId = a})

instance FromJSON WebPropertyRef where
        parseJSON
          = withObject "WebPropertyRef"
              (\ o ->
                 WebPropertyRef' <$>
                   (o .:? "kind" .!= "analytics#webPropertyRef") <*>
                     (o .:? "href")
                     <*> (o .:? "accountId")
                     <*> (o .:? "name")
                     <*> (o .:? "internalWebPropertyId")
                     <*> (o .:? "id"))

instance ToJSON WebPropertyRef where
        toJSON WebPropertyRef'{..}
          = object
              (catMaybes
                 [Just ("kind" .= _wprKind), ("href" .=) <$> _wprHref,
                  ("accountId" .=) <$> _wprAccountId,
                  ("name" .=) <$> _wprName,
                  ("internalWebPropertyId" .=) <$>
                    _wprInternalWebPropertyId,
                  ("id" .=) <$> _wprId])

-- | JSON template for an Analytics Remarketing Audience Foreign Link.
--
-- /See:/ 'linkedForeignAccount' smart constructor.
data LinkedForeignAccount =
  LinkedForeignAccount'
    { _lfaStatus :: !(Maybe Text)
    , _lfaWebPropertyId :: !(Maybe Text)
    , _lfaKind :: !Text
    , _lfaEligibleForSearch :: !(Maybe Bool)
    , _lfaAccountId :: !(Maybe Text)
    , _lfaRemarketingAudienceId :: !(Maybe Text)
    , _lfaLinkedAccountId :: !(Maybe Text)
    , _lfaInternalWebPropertyId :: !(Maybe Text)
    , _lfaId :: !(Maybe Text)
    , _lfaType :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'LinkedForeignAccount' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'lfaStatus'
--
-- * 'lfaWebPropertyId'
--
-- * 'lfaKind'
--
-- * 'lfaEligibleForSearch'
--
-- * 'lfaAccountId'
--
-- * 'lfaRemarketingAudienceId'
--
-- * 'lfaLinkedAccountId'
--
-- * 'lfaInternalWebPropertyId'
--
-- * 'lfaId'
--
-- * 'lfaType'
linkedForeignAccount
    :: LinkedForeignAccount
linkedForeignAccount =
  LinkedForeignAccount'
    { _lfaStatus = Nothing
    , _lfaWebPropertyId = Nothing
    , _lfaKind = "analytics#linkedForeignAccount"
    , _lfaEligibleForSearch = Nothing
    , _lfaAccountId = Nothing
    , _lfaRemarketingAudienceId = Nothing
    , _lfaLinkedAccountId = Nothing
    , _lfaInternalWebPropertyId = Nothing
    , _lfaId = Nothing
    , _lfaType = Nothing
    }


-- | The status of this foreign account link.
lfaStatus :: Lens' LinkedForeignAccount (Maybe Text)
lfaStatus
  = lens _lfaStatus (\ s a -> s{_lfaStatus = a})

-- | Web property ID of the form UA-XXXXX-YY to which this linked foreign
-- account belongs.
lfaWebPropertyId :: Lens' LinkedForeignAccount (Maybe Text)
lfaWebPropertyId
  = lens _lfaWebPropertyId
      (\ s a -> s{_lfaWebPropertyId = a})

-- | Resource type for linked foreign account.
lfaKind :: Lens' LinkedForeignAccount Text
lfaKind = lens _lfaKind (\ s a -> s{_lfaKind = a})

-- | Boolean indicating whether this is eligible for search.
lfaEligibleForSearch :: Lens' LinkedForeignAccount (Maybe Bool)
lfaEligibleForSearch
  = lens _lfaEligibleForSearch
      (\ s a -> s{_lfaEligibleForSearch = a})

-- | Account ID to which this linked foreign account belongs.
lfaAccountId :: Lens' LinkedForeignAccount (Maybe Text)
lfaAccountId
  = lens _lfaAccountId (\ s a -> s{_lfaAccountId = a})

-- | Remarketing audience ID to which this linked foreign account belongs.
lfaRemarketingAudienceId :: Lens' LinkedForeignAccount (Maybe Text)
lfaRemarketingAudienceId
  = lens _lfaRemarketingAudienceId
      (\ s a -> s{_lfaRemarketingAudienceId = a})

-- | The foreign account ID. For example the an Google Ads
-- \`linkedAccountId\` has the following format XXX-XXX-XXXX.
lfaLinkedAccountId :: Lens' LinkedForeignAccount (Maybe Text)
lfaLinkedAccountId
  = lens _lfaLinkedAccountId
      (\ s a -> s{_lfaLinkedAccountId = a})

-- | Internal ID for the web property to which this linked foreign account
-- belongs.
lfaInternalWebPropertyId :: Lens' LinkedForeignAccount (Maybe Text)
lfaInternalWebPropertyId
  = lens _lfaInternalWebPropertyId
      (\ s a -> s{_lfaInternalWebPropertyId = a})

-- | Entity ad account link ID.
lfaId :: Lens' LinkedForeignAccount (Maybe Text)
lfaId = lens _lfaId (\ s a -> s{_lfaId = a})

-- | The type of the foreign account. For example, \`ADWORDS_LINKS\`,
-- \`DBM_LINKS\`, \`MCC_LINKS\` or \`OPTIMIZE\`.
lfaType :: Lens' LinkedForeignAccount (Maybe Text)
lfaType = lens _lfaType (\ s a -> s{_lfaType = a})

instance FromJSON LinkedForeignAccount where
        parseJSON
          = withObject "LinkedForeignAccount"
              (\ o ->
                 LinkedForeignAccount' <$>
                   (o .:? "status") <*> (o .:? "webPropertyId") <*>
                     (o .:? "kind" .!= "analytics#linkedForeignAccount")
                     <*> (o .:? "eligibleForSearch")
                     <*> (o .:? "accountId")
                     <*> (o .:? "remarketingAudienceId")
                     <*> (o .:? "linkedAccountId")
                     <*> (o .:? "internalWebPropertyId")
                     <*> (o .:? "id")
                     <*> (o .:? "type"))

instance ToJSON LinkedForeignAccount where
        toJSON LinkedForeignAccount'{..}
          = object
              (catMaybes
                 [("status" .=) <$> _lfaStatus,
                  ("webPropertyId" .=) <$> _lfaWebPropertyId,
                  Just ("kind" .= _lfaKind),
                  ("eligibleForSearch" .=) <$> _lfaEligibleForSearch,
                  ("accountId" .=) <$> _lfaAccountId,
                  ("remarketingAudienceId" .=) <$>
                    _lfaRemarketingAudienceId,
                  ("linkedAccountId" .=) <$> _lfaLinkedAccountId,
                  ("internalWebPropertyId" .=) <$>
                    _lfaInternalWebPropertyId,
                  ("id" .=) <$> _lfaId, ("type" .=) <$> _lfaType])

-- | 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:/ 'goals' smart constructor.
data Goals =
  Goals'
    { _gNextLink :: !(Maybe Text)
    , _gItemsPerPage :: !(Maybe (Textual Int32))
    , _gKind :: !Text
    , _gUsername :: !(Maybe Text)
    , _gItems :: !(Maybe [Goal])
    , _gTotalResults :: !(Maybe (Textual Int32))
    , _gStartIndex :: !(Maybe (Textual Int32))
    , _gPreviousLink :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'Goals' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'gNextLink'
--
-- * 'gItemsPerPage'
--
-- * 'gKind'
--
-- * 'gUsername'
--
-- * 'gItems'
--
-- * 'gTotalResults'
--
-- * 'gStartIndex'
--
-- * 'gPreviousLink'
goals
    :: Goals
goals =
  Goals'
    { _gNextLink = Nothing
    , _gItemsPerPage = Nothing
    , _gKind = "analytics#goals"
    , _gUsername = Nothing
    , _gItems = Nothing
    , _gTotalResults = Nothing
    , _gStartIndex = Nothing
    , _gPreviousLink = Nothing
    }


-- | Link to next page for this goal collection.
gNextLink :: Lens' Goals (Maybe Text)
gNextLink
  = lens _gNextLink (\ s a -> s{_gNextLink = a})

-- | 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.
gItemsPerPage :: Lens' Goals (Maybe Int32)
gItemsPerPage
  = lens _gItemsPerPage
      (\ s a -> s{_gItemsPerPage = a})
      . mapping _Coerce

-- | Collection type.
gKind :: Lens' Goals Text
gKind = lens _gKind (\ s a -> s{_gKind = a})

-- | Email ID of the authenticated user
gUsername :: Lens' Goals (Maybe Text)
gUsername
  = lens _gUsername (\ s a -> s{_gUsername = a})

-- | A list of goals.
gItems :: Lens' Goals [Goal]
gItems
  = lens _gItems (\ s a -> s{_gItems = a}) . _Default .
      _Coerce

-- | The total number of results for the query, regardless of the number of
-- resources in the result.
gTotalResults :: Lens' Goals (Maybe Int32)
gTotalResults
  = lens _gTotalResults
      (\ s a -> s{_gTotalResults = a})
      . mapping _Coerce

-- | The starting index of the resources, which is 1 by default or otherwise
-- specified by the start-index query parameter.
gStartIndex :: Lens' Goals (Maybe Int32)
gStartIndex
  = lens _gStartIndex (\ s a -> s{_gStartIndex = a}) .
      mapping _Coerce

-- | Link to previous page for this goal collection.
gPreviousLink :: Lens' Goals (Maybe Text)
gPreviousLink
  = lens _gPreviousLink
      (\ s a -> s{_gPreviousLink = a})

instance FromJSON Goals where
        parseJSON
          = withObject "Goals"
              (\ o ->
                 Goals' <$>
                   (o .:? "nextLink") <*> (o .:? "itemsPerPage") <*>
                     (o .:? "kind" .!= "analytics#goals")
                     <*> (o .:? "username")
                     <*> (o .:? "items" .!= mempty)
                     <*> (o .:? "totalResults")
                     <*> (o .:? "startIndex")
                     <*> (o .:? "previousLink"))

instance ToJSON Goals where
        toJSON Goals'{..}
          = object
              (catMaybes
                 [("nextLink" .=) <$> _gNextLink,
                  ("itemsPerPage" .=) <$> _gItemsPerPage,
                  Just ("kind" .= _gKind),
                  ("username" .=) <$> _gUsername,
                  ("items" .=) <$> _gItems,
                  ("totalResults" .=) <$> _gTotalResults,
                  ("startIndex" .=) <$> _gStartIndex,
                  ("previousLink" .=) <$> _gPreviousLink])

-- | A union object representing a dimension or metric value. Only one of
-- \"primitiveValue\" or \"conversionPathValue\" attribute will be
-- populated.
--
-- /See:/ 'mcfDataRowsItemItem' smart constructor.
data McfDataRowsItemItem =
  McfDataRowsItemItem'
    { _mdriiPrimitiveValue :: !(Maybe Text)
    , _mdriiConversionPathValue :: !(Maybe [McfDataRowsItemItemConversionPathValueItem])
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'McfDataRowsItemItem' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'mdriiPrimitiveValue'
--
-- * 'mdriiConversionPathValue'
mcfDataRowsItemItem
    :: McfDataRowsItemItem
mcfDataRowsItemItem =
  McfDataRowsItemItem'
    {_mdriiPrimitiveValue = Nothing, _mdriiConversionPathValue = Nothing}


-- | A primitive dimension value. A primitive metric value.
mdriiPrimitiveValue :: Lens' McfDataRowsItemItem (Maybe Text)
mdriiPrimitiveValue
  = lens _mdriiPrimitiveValue
      (\ s a -> s{_mdriiPrimitiveValue = a})

-- | A conversion path dimension value, containing a list of interactions
-- with their attributes.
mdriiConversionPathValue :: Lens' McfDataRowsItemItem [McfDataRowsItemItemConversionPathValueItem]
mdriiConversionPathValue
  = lens _mdriiConversionPathValue
      (\ s a -> s{_mdriiConversionPathValue = a})
      . _Default
      . _Coerce

instance FromJSON McfDataRowsItemItem where
        parseJSON
          = withObject "McfDataRowsItemItem"
              (\ o ->
                 McfDataRowsItemItem' <$>
                   (o .:? "primitiveValue") <*>
                     (o .:? "conversionPathValue" .!= mempty))

instance ToJSON McfDataRowsItemItem where
        toJSON McfDataRowsItemItem'{..}
          = object
              (catMaybes
                 [("primitiveValue" .=) <$> _mdriiPrimitiveValue,
                  ("conversionPathValue" .=) <$>
                    _mdriiConversionPathValue])

-- | Permissions the user has for this account.
--
-- /See:/ 'accountPermissions' smart constructor.
newtype AccountPermissions =
  AccountPermissions'
    { _apEffective :: Maybe [Text]
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'AccountPermissions' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'apEffective'
accountPermissions
    :: AccountPermissions
accountPermissions = AccountPermissions' {_apEffective = Nothing}


-- | All the permissions that the user has for this account. These include
-- any implied permissions (e.g., EDIT implies VIEW).
apEffective :: Lens' AccountPermissions [Text]
apEffective
  = lens _apEffective (\ s a -> s{_apEffective = a}) .
      _Default
      . _Coerce

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

instance ToJSON AccountPermissions where
        toJSON AccountPermissions'{..}
          = object
              (catMaybes [("effective" .=) <$> _apEffective])

-- | Entity for this link. It can be an account, a web property, or a view
-- (profile).
--
-- /See:/ 'entityUserLinkEntity' smart constructor.
data EntityUserLinkEntity =
  EntityUserLinkEntity'
    { _euleProFileRef :: !(Maybe ProFileRef)
    , _euleAccountRef :: !(Maybe AccountRef)
    , _euleWebPropertyRef :: !(Maybe WebPropertyRef)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'EntityUserLinkEntity' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'euleProFileRef'
--
-- * 'euleAccountRef'
--
-- * 'euleWebPropertyRef'
entityUserLinkEntity
    :: EntityUserLinkEntity
entityUserLinkEntity =
  EntityUserLinkEntity'
    { _euleProFileRef = Nothing
    , _euleAccountRef = Nothing
    , _euleWebPropertyRef = Nothing
    }


-- | View (Profile) for this link.
euleProFileRef :: Lens' EntityUserLinkEntity (Maybe ProFileRef)
euleProFileRef
  = lens _euleProFileRef
      (\ s a -> s{_euleProFileRef = a})

-- | Account for this link.
euleAccountRef :: Lens' EntityUserLinkEntity (Maybe AccountRef)
euleAccountRef
  = lens _euleAccountRef
      (\ s a -> s{_euleAccountRef = a})

-- | Web property for this link.
euleWebPropertyRef :: Lens' EntityUserLinkEntity (Maybe WebPropertyRef)
euleWebPropertyRef
  = lens _euleWebPropertyRef
      (\ s a -> s{_euleWebPropertyRef = a})

instance FromJSON EntityUserLinkEntity where
        parseJSON
          = withObject "EntityUserLinkEntity"
              (\ o ->
                 EntityUserLinkEntity' <$>
                   (o .:? "profileRef") <*> (o .:? "accountRef") <*>
                     (o .:? "webPropertyRef"))

instance ToJSON EntityUserLinkEntity where
        toJSON EntityUserLinkEntity'{..}
          = object
              (catMaybes
                 [("profileRef" .=) <$> _euleProFileRef,
                  ("accountRef" .=) <$> _euleAccountRef,
                  ("webPropertyRef" .=) <$> _euleWebPropertyRef])

-- | JSON template for Analytics account entry.
--
-- /See:/ 'account' smart constructor.
data Account =
  Account'
    { _accChildLink :: !(Maybe AccountChildLink)
    , _accKind :: !Text
    , _accCreated :: !(Maybe DateTime')
    , _accSelfLink :: !(Maybe Text)
    , _accName :: !(Maybe Text)
    , _accStarred :: !(Maybe Bool)
    , _accId :: !(Maybe Text)
    , _accUpdated :: !(Maybe DateTime')
    , _accPermissions :: !(Maybe AccountPermissions)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'Account' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'accChildLink'
--
-- * 'accKind'
--
-- * 'accCreated'
--
-- * 'accSelfLink'
--
-- * 'accName'
--
-- * 'accStarred'
--
-- * 'accId'
--
-- * 'accUpdated'
--
-- * 'accPermissions'
account
    :: Account
account =
  Account'
    { _accChildLink = Nothing
    , _accKind = "analytics#account"
    , _accCreated = Nothing
    , _accSelfLink = Nothing
    , _accName = Nothing
    , _accStarred = Nothing
    , _accId = Nothing
    , _accUpdated = Nothing
    , _accPermissions = Nothing
    }


-- | Child link for an account entry. Points to the list of web properties
-- for this account.
accChildLink :: Lens' Account (Maybe AccountChildLink)
accChildLink
  = lens _accChildLink (\ s a -> s{_accChildLink = a})

-- | Resource type for Analytics account.
accKind :: Lens' Account Text
accKind = lens _accKind (\ s a -> s{_accKind = a})

-- | Time the account was created.
accCreated :: Lens' Account (Maybe UTCTime)
accCreated
  = lens _accCreated (\ s a -> s{_accCreated = a}) .
      mapping _DateTime

-- | Link for this account.
accSelfLink :: Lens' Account (Maybe Text)
accSelfLink
  = lens _accSelfLink (\ s a -> s{_accSelfLink = a})

-- | Account name.
accName :: Lens' Account (Maybe Text)
accName = lens _accName (\ s a -> s{_accName = a})

-- | Indicates whether this account is starred or not.
accStarred :: Lens' Account (Maybe Bool)
accStarred
  = lens _accStarred (\ s a -> s{_accStarred = a})

-- | Account ID.
accId :: Lens' Account (Maybe Text)
accId = lens _accId (\ s a -> s{_accId = a})

-- | Time the account was last modified.
accUpdated :: Lens' Account (Maybe UTCTime)
accUpdated
  = lens _accUpdated (\ s a -> s{_accUpdated = a}) .
      mapping _DateTime

-- | Permissions the user has for this account.
accPermissions :: Lens' Account (Maybe AccountPermissions)
accPermissions
  = lens _accPermissions
      (\ s a -> s{_accPermissions = a})

instance FromJSON Account where
        parseJSON
          = withObject "Account"
              (\ o ->
                 Account' <$>
                   (o .:? "childLink") <*>
                     (o .:? "kind" .!= "analytics#account")
                     <*> (o .:? "created")
                     <*> (o .:? "selfLink")
                     <*> (o .:? "name")
                     <*> (o .:? "starred")
                     <*> (o .:? "id")
                     <*> (o .:? "updated")
                     <*> (o .:? "permissions"))

instance ToJSON Account where
        toJSON Account'{..}
          = object
              (catMaybes
                 [("childLink" .=) <$> _accChildLink,
                  Just ("kind" .= _accKind),
                  ("created" .=) <$> _accCreated,
                  ("selfLink" .=) <$> _accSelfLink,
                  ("name" .=) <$> _accName,
                  ("starred" .=) <$> _accStarred, ("id" .=) <$> _accId,
                  ("updated" .=) <$> _accUpdated,
                  ("permissions" .=) <$> _accPermissions])

-- | JSON template for Analytics experiment resource.
--
-- /See:/ 'experiment' smart constructor.
data Experiment =
  Experiment'
    { _expParentLink :: !(Maybe ExperimentParentLink)
    , _expEqualWeighting :: !(Maybe Bool)
    , _expStatus :: !(Maybe Text)
    , _expWebPropertyId :: !(Maybe Text)
    , _expStartTime :: !(Maybe DateTime')
    , _expSnippet :: !(Maybe Text)
    , _expKind :: !Text
    , _expCreated :: !(Maybe DateTime')
    , _expReasonExperimentEnded :: !(Maybe Text)
    , _expTrafficCoverage :: !(Maybe (Textual Double))
    , _expEditableInGaUi :: !(Maybe Bool)
    , _expMinimumExperimentLengthInDays :: !(Maybe (Textual Int32))
    , _expProFileId :: !(Maybe Text)
    , _expOptimizationType :: !(Maybe Text)
    , _expSelfLink :: !(Maybe Text)
    , _expAccountId :: !(Maybe Text)
    , _expName :: !(Maybe Text)
    , _expWinnerFound :: !(Maybe Bool)
    , _expEndTime :: !(Maybe DateTime')
    , _expVariations :: !(Maybe [ExperimentVariationsItem])
    , _expInternalWebPropertyId :: !(Maybe Text)
    , _expId :: !(Maybe Text)
    , _expUpdated :: !(Maybe DateTime')
    , _expRewriteVariationURLsAsOriginal :: !(Maybe Bool)
    , _expObjectiveMetric :: !(Maybe Text)
    , _expWinnerConfidenceLevel :: !(Maybe (Textual Double))
    , _expServingFramework :: !(Maybe Text)
    , _expDescription :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'Experiment' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'expParentLink'
--
-- * 'expEqualWeighting'
--
-- * 'expStatus'
--
-- * 'expWebPropertyId'
--
-- * 'expStartTime'
--
-- * 'expSnippet'
--
-- * 'expKind'
--
-- * 'expCreated'
--
-- * 'expReasonExperimentEnded'
--
-- * 'expTrafficCoverage'
--
-- * 'expEditableInGaUi'
--
-- * 'expMinimumExperimentLengthInDays'
--
-- * 'expProFileId'
--
-- * 'expOptimizationType'
--
-- * 'expSelfLink'
--
-- * 'expAccountId'
--
-- * 'expName'
--
-- * 'expWinnerFound'
--
-- * 'expEndTime'
--
-- * 'expVariations'
--
-- * 'expInternalWebPropertyId'
--
-- * 'expId'
--
-- * 'expUpdated'
--
-- * 'expRewriteVariationURLsAsOriginal'
--
-- * 'expObjectiveMetric'
--
-- * 'expWinnerConfidenceLevel'
--
-- * 'expServingFramework'
--
-- * 'expDescription'
experiment
    :: Experiment
experiment =
  Experiment'
    { _expParentLink = Nothing
    , _expEqualWeighting = Nothing
    , _expStatus = Nothing
    , _expWebPropertyId = Nothing
    , _expStartTime = Nothing
    , _expSnippet = Nothing
    , _expKind = "analytics#experiment"
    , _expCreated = Nothing
    , _expReasonExperimentEnded = Nothing
    , _expTrafficCoverage = Nothing
    , _expEditableInGaUi = Nothing
    , _expMinimumExperimentLengthInDays = Nothing
    , _expProFileId = Nothing
    , _expOptimizationType = Nothing
    , _expSelfLink = Nothing
    , _expAccountId = Nothing
    , _expName = Nothing
    , _expWinnerFound = Nothing
    , _expEndTime = Nothing
    , _expVariations = Nothing
    , _expInternalWebPropertyId = Nothing
    , _expId = Nothing
    , _expUpdated = Nothing
    , _expRewriteVariationURLsAsOriginal = Nothing
    , _expObjectiveMetric = Nothing
    , _expWinnerConfidenceLevel = Nothing
    , _expServingFramework = Nothing
    , _expDescription = Nothing
    }


-- | Parent link for an experiment. Points to the view (profile) to which
-- this experiment belongs.
expParentLink :: Lens' Experiment (Maybe ExperimentParentLink)
expParentLink
  = lens _expParentLink
      (\ s a -> s{_expParentLink = a})

-- | 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.
expEqualWeighting :: Lens' Experiment (Maybe Bool)
expEqualWeighting
  = lens _expEqualWeighting
      (\ s a -> s{_expEqualWeighting = a})

-- | 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.
expStatus :: Lens' Experiment (Maybe Text)
expStatus
  = lens _expStatus (\ s a -> s{_expStatus = a})

-- | Web property ID to which this experiment belongs. The web property ID is
-- of the form UA-XXXXX-YY. This field is read-only.
expWebPropertyId :: Lens' Experiment (Maybe Text)
expWebPropertyId
  = lens _expWebPropertyId
      (\ s a -> s{_expWebPropertyId = a})

-- | 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.
expStartTime :: Lens' Experiment (Maybe UTCTime)
expStartTime
  = lens _expStartTime (\ s a -> s{_expStartTime = a})
      . mapping _DateTime

-- | The snippet of code to include on the control page(s). This field is
-- read-only.
expSnippet :: Lens' Experiment (Maybe Text)
expSnippet
  = lens _expSnippet (\ s a -> s{_expSnippet = a})

-- | Resource type for an Analytics experiment. This field is read-only.
expKind :: Lens' Experiment Text
expKind = lens _expKind (\ s a -> s{_expKind = a})

-- | Time the experiment was created. This field is read-only.
expCreated :: Lens' Experiment (Maybe UTCTime)
expCreated
  = lens _expCreated (\ s a -> s{_expCreated = a}) .
      mapping _DateTime

-- | 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.
expReasonExperimentEnded :: Lens' Experiment (Maybe Text)
expReasonExperimentEnded
  = lens _expReasonExperimentEnded
      (\ s a -> s{_expReasonExperimentEnded = a})

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

-- | If true, the end user will be able to edit the experiment via the Google
-- Analytics user interface.
expEditableInGaUi :: Lens' Experiment (Maybe Bool)
expEditableInGaUi
  = lens _expEditableInGaUi
      (\ s a -> s{_expEditableInGaUi = a})

-- | 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.
expMinimumExperimentLengthInDays :: Lens' Experiment (Maybe Int32)
expMinimumExperimentLengthInDays
  = lens _expMinimumExperimentLengthInDays
      (\ s a -> s{_expMinimumExperimentLengthInDays = a})
      . mapping _Coerce

-- | View (Profile) ID to which this experiment belongs. This field is
-- read-only.
expProFileId :: Lens' Experiment (Maybe Text)
expProFileId
  = lens _expProFileId (\ s a -> s{_expProFileId = a})

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

-- | Link for this experiment. This field is read-only.
expSelfLink :: Lens' Experiment (Maybe Text)
expSelfLink
  = lens _expSelfLink (\ s a -> s{_expSelfLink = a})

-- | Account ID to which this experiment belongs. This field is read-only.
expAccountId :: Lens' Experiment (Maybe Text)
expAccountId
  = lens _expAccountId (\ s a -> s{_expAccountId = a})

-- | Experiment name. This field may not be changed for an experiment whose
-- status is ENDED. This field is required when creating an experiment.
expName :: Lens' Experiment (Maybe Text)
expName = lens _expName (\ s a -> s{_expName = a})

-- | Boolean specifying whether a winner has been found for this experiment.
-- This field is read-only.
expWinnerFound :: Lens' Experiment (Maybe Bool)
expWinnerFound
  = lens _expWinnerFound
      (\ s a -> s{_expWinnerFound = a})

-- | 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.
expEndTime :: Lens' Experiment (Maybe UTCTime)
expEndTime
  = lens _expEndTime (\ s a -> s{_expEndTime = a}) .
      mapping _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.
expVariations :: Lens' Experiment [ExperimentVariationsItem]
expVariations
  = lens _expVariations
      (\ s a -> s{_expVariations = a})
      . _Default
      . _Coerce

-- | Internal ID for the web property to which this experiment belongs. This
-- field is read-only.
expInternalWebPropertyId :: Lens' Experiment (Maybe Text)
expInternalWebPropertyId
  = lens _expInternalWebPropertyId
      (\ s a -> s{_expInternalWebPropertyId = a})

-- | Experiment ID. Required for patch and update. Disallowed for create.
expId :: Lens' Experiment (Maybe Text)
expId = lens _expId (\ s a -> s{_expId = a})

-- | Time the experiment was last modified. This field is read-only.
expUpdated :: Lens' Experiment (Maybe UTCTime)
expUpdated
  = lens _expUpdated (\ s a -> s{_expUpdated = a}) .
      mapping _DateTime

-- | 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.
expRewriteVariationURLsAsOriginal :: Lens' Experiment (Maybe Bool)
expRewriteVariationURLsAsOriginal
  = lens _expRewriteVariationURLsAsOriginal
      (\ s a -> s{_expRewriteVariationURLsAsOriginal = a})

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

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

-- | 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.
expServingFramework :: Lens' Experiment (Maybe Text)
expServingFramework
  = lens _expServingFramework
      (\ s a -> s{_expServingFramework = a})

-- | Notes about this experiment.
expDescription :: Lens' Experiment (Maybe Text)
expDescription
  = lens _expDescription
      (\ s a -> s{_expDescription = a})

instance FromJSON Experiment where
        parseJSON
          = withObject "Experiment"
              (\ o ->
                 Experiment' <$>
                   (o .:? "parentLink") <*> (o .:? "equalWeighting") <*>
                     (o .:? "status")
                     <*> (o .:? "webPropertyId")
                     <*> (o .:? "startTime")
                     <*> (o .:? "snippet")
                     <*> (o .:? "kind" .!= "analytics#experiment")
                     <*> (o .:? "created")
                     <*> (o .:? "reasonExperimentEnded")
                     <*> (o .:? "trafficCoverage")
                     <*> (o .:? "editableInGaUi")
                     <*> (o .:? "minimumExperimentLengthInDays")
                     <*> (o .:? "profileId")
                     <*> (o .:? "optimizationType")
                     <*> (o .:? "selfLink")
                     <*> (o .:? "accountId")
                     <*> (o .:? "name")
                     <*> (o .:? "winnerFound")
                     <*> (o .:? "endTime")
                     <*> (o .:? "variations" .!= mempty)
                     <*> (o .:? "internalWebPropertyId")
                     <*> (o .:? "id")
                     <*> (o .:? "updated")
                     <*> (o .:? "rewriteVariationUrlsAsOriginal")
                     <*> (o .:? "objectiveMetric")
                     <*> (o .:? "winnerConfidenceLevel")
                     <*> (o .:? "servingFramework")
                     <*> (o .:? "description"))

instance ToJSON Experiment where
        toJSON Experiment'{..}
          = object
              (catMaybes
                 [("parentLink" .=) <$> _expParentLink,
                  ("equalWeighting" .=) <$> _expEqualWeighting,
                  ("status" .=) <$> _expStatus,
                  ("webPropertyId" .=) <$> _expWebPropertyId,
                  ("startTime" .=) <$> _expStartTime,
                  ("snippet" .=) <$> _expSnippet,
                  Just ("kind" .= _expKind),
                  ("created" .=) <$> _expCreated,
                  ("reasonExperimentEnded" .=) <$>
                    _expReasonExperimentEnded,
                  ("trafficCoverage" .=) <$> _expTrafficCoverage,
                  ("editableInGaUi" .=) <$> _expEditableInGaUi,
                  ("minimumExperimentLengthInDays" .=) <$>
                    _expMinimumExperimentLengthInDays,
                  ("profileId" .=) <$> _expProFileId,
                  ("optimizationType" .=) <$> _expOptimizationType,
                  ("selfLink" .=) <$> _expSelfLink,
                  ("accountId" .=) <$> _expAccountId,
                  ("name" .=) <$> _expName,
                  ("winnerFound" .=) <$> _expWinnerFound,
                  ("endTime" .=) <$> _expEndTime,
                  ("variations" .=) <$> _expVariations,
                  ("internalWebPropertyId" .=) <$>
                    _expInternalWebPropertyId,
                  ("id" .=) <$> _expId, ("updated" .=) <$> _expUpdated,
                  ("rewriteVariationUrlsAsOriginal" .=) <$>
                    _expRewriteVariationURLsAsOriginal,
                  ("objectiveMetric" .=) <$> _expObjectiveMetric,
                  ("winnerConfidenceLevel" .=) <$>
                    _expWinnerConfidenceLevel,
                  ("servingFramework" .=) <$> _expServingFramework,
                  ("description" .=) <$> _expDescription])

-- | An entity user link collection provides a list of Analytics ACL links
-- Each resource in this collection corresponds to a single link.
--
-- /See:/ 'entityUserLinks' smart constructor.
data EntityUserLinks =
  EntityUserLinks'
    { _eulNextLink :: !(Maybe Text)
    , _eulItemsPerPage :: !(Maybe (Textual Int32))
    , _eulKind :: !Text
    , _eulItems :: !(Maybe [EntityUserLink])
    , _eulTotalResults :: !(Maybe (Textual Int32))
    , _eulStartIndex :: !(Maybe (Textual Int32))
    , _eulPreviousLink :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'EntityUserLinks' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'eulNextLink'
--
-- * 'eulItemsPerPage'
--
-- * 'eulKind'
--
-- * 'eulItems'
--
-- * 'eulTotalResults'
--
-- * 'eulStartIndex'
--
-- * 'eulPreviousLink'
entityUserLinks
    :: EntityUserLinks
entityUserLinks =
  EntityUserLinks'
    { _eulNextLink = Nothing
    , _eulItemsPerPage = Nothing
    , _eulKind = "analytics#entityUserLinks"
    , _eulItems = Nothing
    , _eulTotalResults = Nothing
    , _eulStartIndex = Nothing
    , _eulPreviousLink = Nothing
    }


-- | Next link for this account collection.
eulNextLink :: Lens' EntityUserLinks (Maybe Text)
eulNextLink
  = lens _eulNextLink (\ s a -> s{_eulNextLink = a})

-- | 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.
eulItemsPerPage :: Lens' EntityUserLinks (Maybe Int32)
eulItemsPerPage
  = lens _eulItemsPerPage
      (\ s a -> s{_eulItemsPerPage = a})
      . mapping _Coerce

-- | Collection type.
eulKind :: Lens' EntityUserLinks Text
eulKind = lens _eulKind (\ s a -> s{_eulKind = a})

-- | A list of entity user links.
eulItems :: Lens' EntityUserLinks [EntityUserLink]
eulItems
  = lens _eulItems (\ s a -> s{_eulItems = a}) .
      _Default
      . _Coerce

-- | The total number of results for the query, regardless of the number of
-- results in the response.
eulTotalResults :: Lens' EntityUserLinks (Maybe Int32)
eulTotalResults
  = lens _eulTotalResults
      (\ s a -> s{_eulTotalResults = a})
      . mapping _Coerce

-- | The starting index of the entries, which is 1 by default or otherwise
-- specified by the start-index query parameter.
eulStartIndex :: Lens' EntityUserLinks (Maybe Int32)
eulStartIndex
  = lens _eulStartIndex
      (\ s a -> s{_eulStartIndex = a})
      . mapping _Coerce

-- | Previous link for this account collection.
eulPreviousLink :: Lens' EntityUserLinks (Maybe Text)
eulPreviousLink
  = lens _eulPreviousLink
      (\ s a -> s{_eulPreviousLink = a})

instance FromJSON EntityUserLinks where
        parseJSON
          = withObject "EntityUserLinks"
              (\ o ->
                 EntityUserLinks' <$>
                   (o .:? "nextLink") <*> (o .:? "itemsPerPage") <*>
                     (o .:? "kind" .!= "analytics#entityUserLinks")
                     <*> (o .:? "items" .!= mempty)
                     <*> (o .:? "totalResults")
                     <*> (o .:? "startIndex")
                     <*> (o .:? "previousLink"))

instance ToJSON EntityUserLinks where
        toJSON EntityUserLinks'{..}
          = object
              (catMaybes
                 [("nextLink" .=) <$> _eulNextLink,
                  ("itemsPerPage" .=) <$> _eulItemsPerPage,
                  Just ("kind" .= _eulKind),
                  ("items" .=) <$> _eulItems,
                  ("totalResults" .=) <$> _eulTotalResults,
                  ("startIndex" .=) <$> _eulStartIndex,
                  ("previousLink" .=) <$> _eulPreviousLink])

-- | JSON template for an Google Ads account.
--
-- /See:/ 'adWordsAccount' smart constructor.
data AdWordsAccount =
  AdWordsAccount'
    { _awaAutoTaggingEnabled :: !(Maybe Bool)
    , _awaKind :: !Text
    , _awaCustomerId :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'AdWordsAccount' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'awaAutoTaggingEnabled'
--
-- * 'awaKind'
--
-- * 'awaCustomerId'
adWordsAccount
    :: AdWordsAccount
adWordsAccount =
  AdWordsAccount'
    { _awaAutoTaggingEnabled = Nothing
    , _awaKind = "analytics#adWordsAccount"
    , _awaCustomerId = Nothing
    }


-- | True if auto-tagging is enabled on the Google Ads account. Read-only
-- after the insert operation.
awaAutoTaggingEnabled :: Lens' AdWordsAccount (Maybe Bool)
awaAutoTaggingEnabled
  = lens _awaAutoTaggingEnabled
      (\ s a -> s{_awaAutoTaggingEnabled = a})

-- | Resource type for Google Ads account.
awaKind :: Lens' AdWordsAccount Text
awaKind = lens _awaKind (\ s a -> s{_awaKind = a})

-- | Customer ID. This field is required when creating a Google Ads link.
awaCustomerId :: Lens' AdWordsAccount (Maybe Text)
awaCustomerId
  = lens _awaCustomerId
      (\ s a -> s{_awaCustomerId = a})

instance FromJSON AdWordsAccount where
        parseJSON
          = withObject "AdWordsAccount"
              (\ o ->
                 AdWordsAccount' <$>
                   (o .:? "autoTaggingEnabled") <*>
                     (o .:? "kind" .!= "analytics#adWordsAccount")
                     <*> (o .:? "customerId"))

instance ToJSON AdWordsAccount where
        toJSON AdWordsAccount'{..}
          = object
              (catMaybes
                 [("autoTaggingEnabled" .=) <$>
                    _awaAutoTaggingEnabled,
                  Just ("kind" .= _awaKind),
                  ("customerId" .=) <$> _awaCustomerId])

-- | JSON template for a profile filter link.
--
-- /See:/ 'filterRef' smart constructor.
data FilterRef =
  FilterRef'
    { _frKind :: !Text
    , _frHref :: !(Maybe Text)
    , _frAccountId :: !(Maybe Text)
    , _frName :: !(Maybe Text)
    , _frId :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'FilterRef' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'frKind'
--
-- * 'frHref'
--
-- * 'frAccountId'
--
-- * 'frName'
--
-- * 'frId'
filterRef
    :: FilterRef
filterRef =
  FilterRef'
    { _frKind = "analytics#filterRef"
    , _frHref = Nothing
    , _frAccountId = Nothing
    , _frName = Nothing
    , _frId = Nothing
    }


-- | Kind value for filter reference.
frKind :: Lens' FilterRef Text
frKind = lens _frKind (\ s a -> s{_frKind = a})

-- | Link for this filter.
frHref :: Lens' FilterRef (Maybe Text)
frHref = lens _frHref (\ s a -> s{_frHref = a})

-- | Account ID to which this filter belongs.
frAccountId :: Lens' FilterRef (Maybe Text)
frAccountId
  = lens _frAccountId (\ s a -> s{_frAccountId = a})

-- | Name of this filter.
frName :: Lens' FilterRef (Maybe Text)
frName = lens _frName (\ s a -> s{_frName = a})

-- | Filter ID.
frId :: Lens' FilterRef (Maybe Text)
frId = lens _frId (\ s a -> s{_frId = a})

instance FromJSON FilterRef where
        parseJSON
          = withObject "FilterRef"
              (\ o ->
                 FilterRef' <$>
                   (o .:? "kind" .!= "analytics#filterRef") <*>
                     (o .:? "href")
                     <*> (o .:? "accountId")
                     <*> (o .:? "name")
                     <*> (o .:? "id"))

instance ToJSON FilterRef where
        toJSON FilterRef'{..}
          = object
              (catMaybes
                 [Just ("kind" .= _frKind), ("href" .=) <$> _frHref,
                  ("accountId" .=) <$> _frAccountId,
                  ("name" .=) <$> _frName, ("id" .=) <$> _frId])

-- | Details for the goal of the type VISIT_TIME_ON_SITE.
--
-- /See:/ 'goalVisitTimeOnSiteDetails' smart constructor.
data GoalVisitTimeOnSiteDetails =
  GoalVisitTimeOnSiteDetails'
    { _gvtosdComparisonValue :: !(Maybe (Textual Int64))
    , _gvtosdComparisonType :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'GoalVisitTimeOnSiteDetails' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'gvtosdComparisonValue'
--
-- * 'gvtosdComparisonType'
goalVisitTimeOnSiteDetails
    :: GoalVisitTimeOnSiteDetails
goalVisitTimeOnSiteDetails =
  GoalVisitTimeOnSiteDetails'
    {_gvtosdComparisonValue = Nothing, _gvtosdComparisonType = Nothing}


-- | Value used for this comparison.
gvtosdComparisonValue :: Lens' GoalVisitTimeOnSiteDetails (Maybe Int64)
gvtosdComparisonValue
  = lens _gvtosdComparisonValue
      (\ s a -> s{_gvtosdComparisonValue = a})
      . mapping _Coerce

-- | Type of comparison. Possible values are LESS_THAN or GREATER_THAN.
gvtosdComparisonType :: Lens' GoalVisitTimeOnSiteDetails (Maybe Text)
gvtosdComparisonType
  = lens _gvtosdComparisonType
      (\ s a -> s{_gvtosdComparisonType = a})

instance FromJSON GoalVisitTimeOnSiteDetails where
        parseJSON
          = withObject "GoalVisitTimeOnSiteDetails"
              (\ o ->
                 GoalVisitTimeOnSiteDetails' <$>
                   (o .:? "comparisonValue") <*>
                     (o .:? "comparisonType"))

instance ToJSON GoalVisitTimeOnSiteDetails where
        toJSON GoalVisitTimeOnSiteDetails'{..}
          = object
              (catMaybes
                 [("comparisonValue" .=) <$> _gvtosdComparisonValue,
                  ("comparisonType" .=) <$> _gvtosdComparisonType])

-- | 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:/ 'webProperties' smart constructor.
data WebProperties =
  WebProperties'
    { _wpNextLink :: !(Maybe Text)
    , _wpItemsPerPage :: !(Maybe (Textual Int32))
    , _wpKind :: !Text
    , _wpUsername :: !(Maybe Text)
    , _wpItems :: !(Maybe [WebProperty])
    , _wpTotalResults :: !(Maybe (Textual Int32))
    , _wpStartIndex :: !(Maybe (Textual Int32))
    , _wpPreviousLink :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'WebProperties' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'wpNextLink'
--
-- * 'wpItemsPerPage'
--
-- * 'wpKind'
--
-- * 'wpUsername'
--
-- * 'wpItems'
--
-- * 'wpTotalResults'
--
-- * 'wpStartIndex'
--
-- * 'wpPreviousLink'
webProperties
    :: WebProperties
webProperties =
  WebProperties'
    { _wpNextLink = Nothing
    , _wpItemsPerPage = Nothing
    , _wpKind = "analytics#webproperties"
    , _wpUsername = Nothing
    , _wpItems = Nothing
    , _wpTotalResults = Nothing
    , _wpStartIndex = Nothing
    , _wpPreviousLink = Nothing
    }


-- | Link to next page for this web property collection.
wpNextLink :: Lens' WebProperties (Maybe Text)
wpNextLink
  = lens _wpNextLink (\ s a -> s{_wpNextLink = a})

-- | 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.
wpItemsPerPage :: Lens' WebProperties (Maybe Int32)
wpItemsPerPage
  = lens _wpItemsPerPage
      (\ s a -> s{_wpItemsPerPage = a})
      . mapping _Coerce

-- | Collection type.
wpKind :: Lens' WebProperties Text
wpKind = lens _wpKind (\ s a -> s{_wpKind = a})

-- | Email ID of the authenticated user
wpUsername :: Lens' WebProperties (Maybe Text)
wpUsername
  = lens _wpUsername (\ s a -> s{_wpUsername = a})

-- | A list of web properties.
wpItems :: Lens' WebProperties [WebProperty]
wpItems
  = lens _wpItems (\ s a -> s{_wpItems = a}) . _Default
      . _Coerce

-- | The total number of results for the query, regardless of the number of
-- results in the response.
wpTotalResults :: Lens' WebProperties (Maybe Int32)
wpTotalResults
  = lens _wpTotalResults
      (\ s a -> s{_wpTotalResults = a})
      . mapping _Coerce

-- | The starting index of the resources, which is 1 by default or otherwise
-- specified by the start-index query parameter.
wpStartIndex :: Lens' WebProperties (Maybe Int32)
wpStartIndex
  = lens _wpStartIndex (\ s a -> s{_wpStartIndex = a})
      . mapping _Coerce

-- | Link to previous page for this web property collection.
wpPreviousLink :: Lens' WebProperties (Maybe Text)
wpPreviousLink
  = lens _wpPreviousLink
      (\ s a -> s{_wpPreviousLink = a})

instance FromJSON WebProperties where
        parseJSON
          = withObject "WebProperties"
              (\ o ->
                 WebProperties' <$>
                   (o .:? "nextLink") <*> (o .:? "itemsPerPage") <*>
                     (o .:? "kind" .!= "analytics#webproperties")
                     <*> (o .:? "username")
                     <*> (o .:? "items" .!= mempty)
                     <*> (o .:? "totalResults")
                     <*> (o .:? "startIndex")
                     <*> (o .:? "previousLink"))

instance ToJSON WebProperties where
        toJSON WebProperties'{..}
          = object
              (catMaybes
                 [("nextLink" .=) <$> _wpNextLink,
                  ("itemsPerPage" .=) <$> _wpItemsPerPage,
                  Just ("kind" .= _wpKind),
                  ("username" .=) <$> _wpUsername,
                  ("items" .=) <$> _wpItems,
                  ("totalResults" .=) <$> _wpTotalResults,
                  ("startIndex" .=) <$> _wpStartIndex,
                  ("previousLink" .=) <$> _wpPreviousLink])

-- | 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:/ 'customMetrics' smart constructor.
data CustomMetrics =
  CustomMetrics'
    { _cmNextLink :: !(Maybe Text)
    , _cmItemsPerPage :: !(Maybe (Textual Int32))
    , _cmKind :: !Text
    , _cmUsername :: !(Maybe Text)
    , _cmItems :: !(Maybe [CustomMetric])
    , _cmTotalResults :: !(Maybe (Textual Int32))
    , _cmStartIndex :: !(Maybe (Textual Int32))
    , _cmPreviousLink :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'CustomMetrics' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'cmNextLink'
--
-- * 'cmItemsPerPage'
--
-- * 'cmKind'
--
-- * 'cmUsername'
--
-- * 'cmItems'
--
-- * 'cmTotalResults'
--
-- * 'cmStartIndex'
--
-- * 'cmPreviousLink'
customMetrics
    :: CustomMetrics
customMetrics =
  CustomMetrics'
    { _cmNextLink = Nothing
    , _cmItemsPerPage = Nothing
    , _cmKind = "analytics#customMetrics"
    , _cmUsername = Nothing
    , _cmItems = Nothing
    , _cmTotalResults = Nothing
    , _cmStartIndex = Nothing
    , _cmPreviousLink = Nothing
    }


-- | Link to next page for this custom metric collection.
cmNextLink :: Lens' CustomMetrics (Maybe Text)
cmNextLink
  = lens _cmNextLink (\ s a -> s{_cmNextLink = a})

-- | 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.
cmItemsPerPage :: Lens' CustomMetrics (Maybe Int32)
cmItemsPerPage
  = lens _cmItemsPerPage
      (\ s a -> s{_cmItemsPerPage = a})
      . mapping _Coerce

-- | Collection type.
cmKind :: Lens' CustomMetrics Text
cmKind = lens _cmKind (\ s a -> s{_cmKind = a})

-- | Email ID of the authenticated user
cmUsername :: Lens' CustomMetrics (Maybe Text)
cmUsername
  = lens _cmUsername (\ s a -> s{_cmUsername = a})

-- | Collection of custom metrics.
cmItems :: Lens' CustomMetrics [CustomMetric]
cmItems
  = lens _cmItems (\ s a -> s{_cmItems = a}) . _Default
      . _Coerce

-- | The total number of results for the query, regardless of the number of
-- results in the response.
cmTotalResults :: Lens' CustomMetrics (Maybe Int32)
cmTotalResults
  = lens _cmTotalResults
      (\ s a -> s{_cmTotalResults = a})
      . mapping _Coerce

-- | The starting index of the resources, which is 1 by default or otherwise
-- specified by the start-index query parameter.
cmStartIndex :: Lens' CustomMetrics (Maybe Int32)
cmStartIndex
  = lens _cmStartIndex (\ s a -> s{_cmStartIndex = a})
      . mapping _Coerce

-- | Link to previous page for this custom metric collection.
cmPreviousLink :: Lens' CustomMetrics (Maybe Text)
cmPreviousLink
  = lens _cmPreviousLink
      (\ s a -> s{_cmPreviousLink = a})

instance FromJSON CustomMetrics where
        parseJSON
          = withObject "CustomMetrics"
              (\ o ->
                 CustomMetrics' <$>
                   (o .:? "nextLink") <*> (o .:? "itemsPerPage") <*>
                     (o .:? "kind" .!= "analytics#customMetrics")
                     <*> (o .:? "username")
                     <*> (o .:? "items" .!= mempty)
                     <*> (o .:? "totalResults")
                     <*> (o .:? "startIndex")
                     <*> (o .:? "previousLink"))

instance ToJSON CustomMetrics where
        toJSON CustomMetrics'{..}
          = object
              (catMaybes
                 [("nextLink" .=) <$> _cmNextLink,
                  ("itemsPerPage" .=) <$> _cmItemsPerPage,
                  Just ("kind" .= _cmKind),
                  ("username" .=) <$> _cmUsername,
                  ("items" .=) <$> _cmItems,
                  ("totalResults" .=) <$> _cmTotalResults,
                  ("startIndex" .=) <$> _cmStartIndex,
                  ("previousLink" .=) <$> _cmPreviousLink])

-- | Details for the filter of the type ADVANCED.
--
-- /See:/ 'filterAdvancedDetails' smart constructor.
data FilterAdvancedDetails =
  FilterAdvancedDetails'
    { _fadExtractA :: !(Maybe Text)
    , _fadFieldARequired :: !(Maybe Bool)
    , _fadFieldA :: !(Maybe Text)
    , _fadFieldBIndex :: !(Maybe (Textual Int32))
    , _fadOutputToField :: !(Maybe Text)
    , _fadOutputConstructor :: !(Maybe Text)
    , _fadExtractB :: !(Maybe Text)
    , _fadFieldAIndex :: !(Maybe (Textual Int32))
    , _fadCaseSensitive :: !(Maybe Bool)
    , _fadOutputToFieldIndex :: !(Maybe (Textual Int32))
    , _fadFieldB :: !(Maybe Text)
    , _fadFieldBRequired :: !(Maybe Bool)
    , _fadOverrideOutputField :: !(Maybe Bool)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'FilterAdvancedDetails' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'fadExtractA'
--
-- * 'fadFieldARequired'
--
-- * 'fadFieldA'
--
-- * 'fadFieldBIndex'
--
-- * 'fadOutputToField'
--
-- * 'fadOutputConstructor'
--
-- * 'fadExtractB'
--
-- * 'fadFieldAIndex'
--
-- * 'fadCaseSensitive'
--
-- * 'fadOutputToFieldIndex'
--
-- * 'fadFieldB'
--
-- * 'fadFieldBRequired'
--
-- * 'fadOverrideOutputField'
filterAdvancedDetails
    :: FilterAdvancedDetails
filterAdvancedDetails =
  FilterAdvancedDetails'
    { _fadExtractA = Nothing
    , _fadFieldARequired = Nothing
    , _fadFieldA = Nothing
    , _fadFieldBIndex = Nothing
    , _fadOutputToField = Nothing
    , _fadOutputConstructor = Nothing
    , _fadExtractB = Nothing
    , _fadFieldAIndex = Nothing
    , _fadCaseSensitive = Nothing
    , _fadOutputToFieldIndex = Nothing
    , _fadFieldB = Nothing
    , _fadFieldBRequired = Nothing
    , _fadOverrideOutputField = Nothing
    }


-- | Expression to extract from field A.
fadExtractA :: Lens' FilterAdvancedDetails (Maybe Text)
fadExtractA
  = lens _fadExtractA (\ s a -> s{_fadExtractA = a})

-- | Indicates if field A is required to match.
fadFieldARequired :: Lens' FilterAdvancedDetails (Maybe Bool)
fadFieldARequired
  = lens _fadFieldARequired
      (\ s a -> s{_fadFieldARequired = a})

-- | Field A.
fadFieldA :: Lens' FilterAdvancedDetails (Maybe Text)
fadFieldA
  = lens _fadFieldA (\ s a -> s{_fadFieldA = a})

-- | The Index of the custom dimension. Required if field is a
-- CUSTOM_DIMENSION.
fadFieldBIndex :: Lens' FilterAdvancedDetails (Maybe Int32)
fadFieldBIndex
  = lens _fadFieldBIndex
      (\ s a -> s{_fadFieldBIndex = a})
      . mapping _Coerce

-- | Output field.
fadOutputToField :: Lens' FilterAdvancedDetails (Maybe Text)
fadOutputToField
  = lens _fadOutputToField
      (\ s a -> s{_fadOutputToField = a})

-- | Expression used to construct the output value.
fadOutputConstructor :: Lens' FilterAdvancedDetails (Maybe Text)
fadOutputConstructor
  = lens _fadOutputConstructor
      (\ s a -> s{_fadOutputConstructor = a})

-- | Expression to extract from field B.
fadExtractB :: Lens' FilterAdvancedDetails (Maybe Text)
fadExtractB
  = lens _fadExtractB (\ s a -> s{_fadExtractB = a})

-- | The Index of the custom dimension. Required if field is a
-- CUSTOM_DIMENSION.
fadFieldAIndex :: Lens' FilterAdvancedDetails (Maybe Int32)
fadFieldAIndex
  = lens _fadFieldAIndex
      (\ s a -> s{_fadFieldAIndex = a})
      . mapping _Coerce

-- | Indicates if the filter expressions are case sensitive.
fadCaseSensitive :: Lens' FilterAdvancedDetails (Maybe Bool)
fadCaseSensitive
  = lens _fadCaseSensitive
      (\ s a -> s{_fadCaseSensitive = a})

-- | The Index of the custom dimension. Required if field is a
-- CUSTOM_DIMENSION.
fadOutputToFieldIndex :: Lens' FilterAdvancedDetails (Maybe Int32)
fadOutputToFieldIndex
  = lens _fadOutputToFieldIndex
      (\ s a -> s{_fadOutputToFieldIndex = a})
      . mapping _Coerce

-- | Field B.
fadFieldB :: Lens' FilterAdvancedDetails (Maybe Text)
fadFieldB
  = lens _fadFieldB (\ s a -> s{_fadFieldB = a})

-- | Indicates if field B is required to match.
fadFieldBRequired :: Lens' FilterAdvancedDetails (Maybe Bool)
fadFieldBRequired
  = lens _fadFieldBRequired
      (\ s a -> s{_fadFieldBRequired = a})

-- | Indicates if the existing value of the output field, if any, should be
-- overridden by the output expression.
fadOverrideOutputField :: Lens' FilterAdvancedDetails (Maybe Bool)
fadOverrideOutputField
  = lens _fadOverrideOutputField
      (\ s a -> s{_fadOverrideOutputField = a})

instance FromJSON FilterAdvancedDetails where
        parseJSON
          = withObject "FilterAdvancedDetails"
              (\ o ->
                 FilterAdvancedDetails' <$>
                   (o .:? "extractA") <*> (o .:? "fieldARequired") <*>
                     (o .:? "fieldA")
                     <*> (o .:? "fieldBIndex")
                     <*> (o .:? "outputToField")
                     <*> (o .:? "outputConstructor")
                     <*> (o .:? "extractB")
                     <*> (o .:? "fieldAIndex")
                     <*> (o .:? "caseSensitive")
                     <*> (o .:? "outputToFieldIndex")
                     <*> (o .:? "fieldB")
                     <*> (o .:? "fieldBRequired")
                     <*> (o .:? "overrideOutputField"))

instance ToJSON FilterAdvancedDetails where
        toJSON FilterAdvancedDetails'{..}
          = object
              (catMaybes
                 [("extractA" .=) <$> _fadExtractA,
                  ("fieldARequired" .=) <$> _fadFieldARequired,
                  ("fieldA" .=) <$> _fadFieldA,
                  ("fieldBIndex" .=) <$> _fadFieldBIndex,
                  ("outputToField" .=) <$> _fadOutputToField,
                  ("outputConstructor" .=) <$> _fadOutputConstructor,
                  ("extractB" .=) <$> _fadExtractB,
                  ("fieldAIndex" .=) <$> _fadFieldAIndex,
                  ("caseSensitive" .=) <$> _fadCaseSensitive,
                  ("outputToFieldIndex" .=) <$> _fadOutputToFieldIndex,
                  ("fieldB" .=) <$> _fadFieldB,
                  ("fieldBRequired" .=) <$> _fadFieldBRequired,
                  ("overrideOutputField" .=) <$>
                    _fadOverrideOutputField])

-- | 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:/ 'accountTreeResponse' smart constructor.
data AccountTreeResponse =
  AccountTreeResponse'
    { _atrtKind :: !Text
    , _atrtProFile :: !(Maybe ProFile)
    , _atrtAccount :: !(Maybe Account)
    , _atrtWebProperty :: !(Maybe WebProperty)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'AccountTreeResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'atrtKind'
--
-- * 'atrtProFile'
--
-- * 'atrtAccount'
--
-- * 'atrtWebProperty'
accountTreeResponse
    :: AccountTreeResponse
accountTreeResponse =
  AccountTreeResponse'
    { _atrtKind = "analytics#accountTreeResponse"
    , _atrtProFile = Nothing
    , _atrtAccount = Nothing
    , _atrtWebProperty = Nothing
    }


-- | Resource type for account ticket.
atrtKind :: Lens' AccountTreeResponse Text
atrtKind = lens _atrtKind (\ s a -> s{_atrtKind = a})

-- | View (Profile) for the account.
atrtProFile :: Lens' AccountTreeResponse (Maybe ProFile)
atrtProFile
  = lens _atrtProFile (\ s a -> s{_atrtProFile = a})

-- | The account created.
atrtAccount :: Lens' AccountTreeResponse (Maybe Account)
atrtAccount
  = lens _atrtAccount (\ s a -> s{_atrtAccount = a})

-- | Web property for the account.
atrtWebProperty :: Lens' AccountTreeResponse (Maybe WebProperty)
atrtWebProperty
  = lens _atrtWebProperty
      (\ s a -> s{_atrtWebProperty = a})

instance FromJSON AccountTreeResponse where
        parseJSON
          = withObject "AccountTreeResponse"
              (\ o ->
                 AccountTreeResponse' <$>
                   (o .:? "kind" .!= "analytics#accountTreeResponse")
                     <*> (o .:? "profile")
                     <*> (o .:? "account")
                     <*> (o .:? "webproperty"))

instance ToJSON AccountTreeResponse where
        toJSON AccountTreeResponse'{..}
          = object
              (catMaybes
                 [Just ("kind" .= _atrtKind),
                  ("profile" .=) <$> _atrtProFile,
                  ("account" .=) <$> _atrtAccount,
                  ("webproperty" .=) <$> _atrtWebProperty])

-- | Details for the filter of the type UPPER.
--
-- /See:/ 'filterUppercaseDetails' smart constructor.
data FilterUppercaseDetails =
  FilterUppercaseDetails'
    { _fudFieldIndex :: !(Maybe (Textual Int32))
    , _fudField :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'FilterUppercaseDetails' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'fudFieldIndex'
--
-- * 'fudField'
filterUppercaseDetails
    :: FilterUppercaseDetails
filterUppercaseDetails =
  FilterUppercaseDetails' {_fudFieldIndex = Nothing, _fudField = Nothing}


-- | The Index of the custom dimension. Required if field is a
-- CUSTOM_DIMENSION.
fudFieldIndex :: Lens' FilterUppercaseDetails (Maybe Int32)
fudFieldIndex
  = lens _fudFieldIndex
      (\ s a -> s{_fudFieldIndex = a})
      . mapping _Coerce

-- | Field to use in the filter.
fudField :: Lens' FilterUppercaseDetails (Maybe Text)
fudField = lens _fudField (\ s a -> s{_fudField = a})

instance FromJSON FilterUppercaseDetails where
        parseJSON
          = withObject "FilterUppercaseDetails"
              (\ o ->
                 FilterUppercaseDetails' <$>
                   (o .:? "fieldIndex") <*> (o .:? "field"))

instance ToJSON FilterUppercaseDetails where
        toJSON FilterUppercaseDetails'{..}
          = object
              (catMaybes
                 [("fieldIndex" .=) <$> _fudFieldIndex,
                  ("field" .=) <$> _fudField])

--
-- /See:/ 'customDataSourceChildLink' smart constructor.
data CustomDataSourceChildLink =
  CustomDataSourceChildLink'
    { _cdsclHref :: !(Maybe Text)
    , _cdsclType :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'CustomDataSourceChildLink' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'cdsclHref'
--
-- * 'cdsclType'
customDataSourceChildLink
    :: CustomDataSourceChildLink
customDataSourceChildLink =
  CustomDataSourceChildLink' {_cdsclHref = Nothing, _cdsclType = Nothing}


-- | Link to the list of daily uploads for this custom data source. Link to
-- the list of uploads for this custom data source.
cdsclHref :: Lens' CustomDataSourceChildLink (Maybe Text)
cdsclHref
  = lens _cdsclHref (\ s a -> s{_cdsclHref = a})

-- | Value is \"analytics#dailyUploads\". Value is \"analytics#uploads\".
cdsclType :: Lens' CustomDataSourceChildLink (Maybe Text)
cdsclType
  = lens _cdsclType (\ s a -> s{_cdsclType = a})

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

instance ToJSON CustomDataSourceChildLink where
        toJSON CustomDataSourceChildLink'{..}
          = object
              (catMaybes
                 [("href" .=) <$> _cdsclHref,
                  ("type" .=) <$> _cdsclType])

-- | JSON template for an Analytics Remarketing Include Conditions.
--
-- /See:/ 'includeConditions' smart constructor.
data IncludeConditions =
  IncludeConditions'
    { _icKind :: !Text
    , _icDaysToLookBack :: !(Maybe (Textual Int32))
    , _icMembershipDurationDays :: !(Maybe (Textual Int32))
    , _icSegment :: !(Maybe Text)
    , _icIsSmartList :: !(Maybe Bool)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'IncludeConditions' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'icKind'
--
-- * 'icDaysToLookBack'
--
-- * 'icMembershipDurationDays'
--
-- * 'icSegment'
--
-- * 'icIsSmartList'
includeConditions
    :: IncludeConditions
includeConditions =
  IncludeConditions'
    { _icKind = "analytics#includeConditions"
    , _icDaysToLookBack = Nothing
    , _icMembershipDurationDays = Nothing
    , _icSegment = Nothing
    , _icIsSmartList = Nothing
    }


-- | Resource type for include conditions.
icKind :: Lens' IncludeConditions Text
icKind = lens _icKind (\ s a -> s{_icKind = a})

-- | 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.
icDaysToLookBack :: Lens' IncludeConditions (Maybe Int32)
icDaysToLookBack
  = lens _icDaysToLookBack
      (\ s a -> s{_icDaysToLookBack = a})
      . mapping _Coerce

-- | Number of days (in the range 1 to 540) a user remains in the audience.
icMembershipDurationDays :: Lens' IncludeConditions (Maybe Int32)
icMembershipDurationDays
  = lens _icMembershipDurationDays
      (\ s a -> s{_icMembershipDurationDays = a})
      . mapping _Coerce

-- | The segment condition that will cause a user to be added to an audience.
icSegment :: Lens' IncludeConditions (Maybe Text)
icSegment
  = lens _icSegment (\ s a -> s{_icSegment = a})

-- | Boolean indicating whether this segment is a smart list.
-- https:\/\/support.google.com\/analytics\/answer\/4628577
icIsSmartList :: Lens' IncludeConditions (Maybe Bool)
icIsSmartList
  = lens _icIsSmartList
      (\ s a -> s{_icIsSmartList = a})

instance FromJSON IncludeConditions where
        parseJSON
          = withObject "IncludeConditions"
              (\ o ->
                 IncludeConditions' <$>
                   (o .:? "kind" .!= "analytics#includeConditions") <*>
                     (o .:? "daysToLookBack")
                     <*> (o .:? "membershipDurationDays")
                     <*> (o .:? "segment")
                     <*> (o .:? "isSmartList"))

instance ToJSON IncludeConditions where
        toJSON IncludeConditions'{..}
          = object
              (catMaybes
                 [Just ("kind" .= _icKind),
                  ("daysToLookBack" .=) <$> _icDaysToLookBack,
                  ("membershipDurationDays" .=) <$>
                    _icMembershipDurationDays,
                  ("segment" .=) <$> _icSegment,
                  ("isSmartList" .=) <$> _icIsSmartList])

-- | Parent link for this filter. Points to the account to which this filter
-- belongs.
--
-- /See:/ 'filterParentLink' smart constructor.
data FilterParentLink =
  FilterParentLink'
    { _fplHref :: !(Maybe Text)
    , _fplType :: !Text
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'FilterParentLink' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'fplHref'
--
-- * 'fplType'
filterParentLink
    :: FilterParentLink
filterParentLink =
  FilterParentLink' {_fplHref = Nothing, _fplType = "analytics#account"}


-- | Link to the account to which this filter belongs.
fplHref :: Lens' FilterParentLink (Maybe Text)
fplHref = lens _fplHref (\ s a -> s{_fplHref = a})

-- | Value is \"analytics#account\".
fplType :: Lens' FilterParentLink Text
fplType = lens _fplType (\ s a -> s{_fplType = a})

instance FromJSON FilterParentLink where
        parseJSON
          = withObject "FilterParentLink"
              (\ o ->
                 FilterParentLink' <$>
                   (o .:? "href") <*>
                     (o .:? "type" .!= "analytics#account"))

instance ToJSON FilterParentLink where
        toJSON FilterParentLink'{..}
          = object
              (catMaybes
                 [("href" .=) <$> _fplHref,
                  Just ("type" .= _fplType)])

-- | JSON template for a hash Client Id request resource.
--
-- /See:/ 'hashClientIdRequest' smart constructor.
data HashClientIdRequest =
  HashClientIdRequest'
    { _hClientId :: !(Maybe Text)
    , _hWebPropertyId :: !(Maybe Text)
    , _hKind :: !Text
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'HashClientIdRequest' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'hClientId'
--
-- * 'hWebPropertyId'
--
-- * 'hKind'
hashClientIdRequest
    :: HashClientIdRequest
hashClientIdRequest =
  HashClientIdRequest'
    { _hClientId = Nothing
    , _hWebPropertyId = Nothing
    , _hKind = "analytics#hashClientIdRequest"
    }


hClientId :: Lens' HashClientIdRequest (Maybe Text)
hClientId
  = lens _hClientId (\ s a -> s{_hClientId = a})

hWebPropertyId :: Lens' HashClientIdRequest (Maybe Text)
hWebPropertyId
  = lens _hWebPropertyId
      (\ s a -> s{_hWebPropertyId = a})

hKind :: Lens' HashClientIdRequest Text
hKind = lens _hKind (\ s a -> s{_hKind = a})

instance FromJSON HashClientIdRequest where
        parseJSON
          = withObject "HashClientIdRequest"
              (\ o ->
                 HashClientIdRequest' <$>
                   (o .:? "clientId") <*> (o .:? "webPropertyId") <*>
                     (o .:? "kind" .!= "analytics#hashClientIdRequest"))

instance ToJSON HashClientIdRequest where
        toJSON HashClientIdRequest'{..}
          = object
              (catMaybes
                 [("clientId" .=) <$> _hClientId,
                  ("webPropertyId" .=) <$> _hWebPropertyId,
                  Just ("kind" .= _hKind)])

-- | Real time data for a given view (profile).
--
-- /See:/ 'realtimeData' smart constructor.
data RealtimeData =
  RealtimeData'
    { _rdProFileInfo :: !(Maybe RealtimeDataProFileInfo)
    , _rdKind :: !Text
    , _rdRows :: !(Maybe [[Text]])
    , _rdSelfLink :: !(Maybe Text)
    , _rdQuery :: !(Maybe RealtimeDataQuery)
    , _rdColumnHeaders :: !(Maybe [RealtimeDataColumnHeadersItem])
    , _rdId :: !(Maybe Text)
    , _rdTotalResults :: !(Maybe (Textual Int32))
    , _rdTotalsForAllResults :: !(Maybe RealtimeDataTotalsForAllResults)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'RealtimeData' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'rdProFileInfo'
--
-- * 'rdKind'
--
-- * 'rdRows'
--
-- * 'rdSelfLink'
--
-- * 'rdQuery'
--
-- * 'rdColumnHeaders'
--
-- * 'rdId'
--
-- * 'rdTotalResults'
--
-- * 'rdTotalsForAllResults'
realtimeData
    :: RealtimeData
realtimeData =
  RealtimeData'
    { _rdProFileInfo = Nothing
    , _rdKind = "analytics#realtimeData"
    , _rdRows = Nothing
    , _rdSelfLink = Nothing
    , _rdQuery = Nothing
    , _rdColumnHeaders = Nothing
    , _rdId = Nothing
    , _rdTotalResults = Nothing
    , _rdTotalsForAllResults = Nothing
    }


-- | Information for the view (profile), for which the real time data was
-- requested.
rdProFileInfo :: Lens' RealtimeData (Maybe RealtimeDataProFileInfo)
rdProFileInfo
  = lens _rdProFileInfo
      (\ s a -> s{_rdProFileInfo = a})

-- | Resource type.
rdKind :: Lens' RealtimeData Text
rdKind = lens _rdKind (\ s a -> s{_rdKind = a})

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

-- | Link to this page.
rdSelfLink :: Lens' RealtimeData (Maybe Text)
rdSelfLink
  = lens _rdSelfLink (\ s a -> s{_rdSelfLink = a})

-- | Real time data request query parameters.
rdQuery :: Lens' RealtimeData (Maybe RealtimeDataQuery)
rdQuery = lens _rdQuery (\ s a -> s{_rdQuery = a})

-- | Column headers that list dimension names followed by the metric names.
-- The order of dimensions and metrics is same as specified in the request.
rdColumnHeaders :: Lens' RealtimeData [RealtimeDataColumnHeadersItem]
rdColumnHeaders
  = lens _rdColumnHeaders
      (\ s a -> s{_rdColumnHeaders = a})
      . _Default
      . _Coerce

-- | Unique ID for this data response.
rdId :: Lens' RealtimeData (Maybe Text)
rdId = lens _rdId (\ s a -> s{_rdId = a})

-- | The total number of rows for the query, regardless of the number of rows
-- in the response.
rdTotalResults :: Lens' RealtimeData (Maybe Int32)
rdTotalResults
  = lens _rdTotalResults
      (\ s a -> s{_rdTotalResults = a})
      . mapping _Coerce

-- | 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.
rdTotalsForAllResults :: Lens' RealtimeData (Maybe RealtimeDataTotalsForAllResults)
rdTotalsForAllResults
  = lens _rdTotalsForAllResults
      (\ s a -> s{_rdTotalsForAllResults = a})

instance FromJSON RealtimeData where
        parseJSON
          = withObject "RealtimeData"
              (\ o ->
                 RealtimeData' <$>
                   (o .:? "profileInfo") <*>
                     (o .:? "kind" .!= "analytics#realtimeData")
                     <*> (o .:? "rows" .!= mempty)
                     <*> (o .:? "selfLink")
                     <*> (o .:? "query")
                     <*> (o .:? "columnHeaders" .!= mempty)
                     <*> (o .:? "id")
                     <*> (o .:? "totalResults")
                     <*> (o .:? "totalsForAllResults"))

instance ToJSON RealtimeData where
        toJSON RealtimeData'{..}
          = object
              (catMaybes
                 [("profileInfo" .=) <$> _rdProFileInfo,
                  Just ("kind" .= _rdKind), ("rows" .=) <$> _rdRows,
                  ("selfLink" .=) <$> _rdSelfLink,
                  ("query" .=) <$> _rdQuery,
                  ("columnHeaders" .=) <$> _rdColumnHeaders,
                  ("id" .=) <$> _rdId,
                  ("totalResults" .=) <$> _rdTotalResults,
                  ("totalsForAllResults" .=) <$>
                    _rdTotalsForAllResults])

-- | JSON template for Analytics Custom Metric.
--
-- /See:/ 'customMetric' smart constructor.
data CustomMetric =
  CustomMetric'
    { _cusParentLink :: !(Maybe CustomMetricParentLink)
    , _cusWebPropertyId :: !(Maybe Text)
    , _cusKind :: !Text
    , _cusMaxValue :: !(Maybe Text)
    , _cusCreated :: !(Maybe DateTime')
    , _cusMinValue :: !(Maybe Text)
    , _cusActive :: !(Maybe Bool)
    , _cusSelfLink :: !(Maybe Text)
    , _cusAccountId :: !(Maybe Text)
    , _cusName :: !(Maybe Text)
    , _cusScope :: !(Maybe Text)
    , _cusId :: !(Maybe Text)
    , _cusUpdated :: !(Maybe DateTime')
    , _cusType :: !(Maybe Text)
    , _cusIndex :: !(Maybe (Textual Int32))
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'CustomMetric' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'cusParentLink'
--
-- * 'cusWebPropertyId'
--
-- * 'cusKind'
--
-- * 'cusMaxValue'
--
-- * 'cusCreated'
--
-- * 'cusMinValue'
--
-- * 'cusActive'
--
-- * 'cusSelfLink'
--
-- * 'cusAccountId'
--
-- * 'cusName'
--
-- * 'cusScope'
--
-- * 'cusId'
--
-- * 'cusUpdated'
--
-- * 'cusType'
--
-- * 'cusIndex'
customMetric
    :: CustomMetric
customMetric =
  CustomMetric'
    { _cusParentLink = Nothing
    , _cusWebPropertyId = Nothing
    , _cusKind = "analytics#customMetric"
    , _cusMaxValue = Nothing
    , _cusCreated = Nothing
    , _cusMinValue = Nothing
    , _cusActive = Nothing
    , _cusSelfLink = Nothing
    , _cusAccountId = Nothing
    , _cusName = Nothing
    , _cusScope = Nothing
    , _cusId = Nothing
    , _cusUpdated = Nothing
    , _cusType = Nothing
    , _cusIndex = Nothing
    }


-- | Parent link for the custom metric. Points to the property to which the
-- custom metric belongs.
cusParentLink :: Lens' CustomMetric (Maybe CustomMetricParentLink)
cusParentLink
  = lens _cusParentLink
      (\ s a -> s{_cusParentLink = a})

-- | Property ID.
cusWebPropertyId :: Lens' CustomMetric (Maybe Text)
cusWebPropertyId
  = lens _cusWebPropertyId
      (\ s a -> s{_cusWebPropertyId = a})

-- | Kind value for a custom metric. Set to \"analytics#customMetric\". It is
-- a read-only field.
cusKind :: Lens' CustomMetric Text
cusKind = lens _cusKind (\ s a -> s{_cusKind = a})

-- | Max value of custom metric.
cusMaxValue :: Lens' CustomMetric (Maybe Text)
cusMaxValue
  = lens _cusMaxValue (\ s a -> s{_cusMaxValue = a})

-- | Time the custom metric was created.
cusCreated :: Lens' CustomMetric (Maybe UTCTime)
cusCreated
  = lens _cusCreated (\ s a -> s{_cusCreated = a}) .
      mapping _DateTime

-- | Min value of custom metric.
cusMinValue :: Lens' CustomMetric (Maybe Text)
cusMinValue
  = lens _cusMinValue (\ s a -> s{_cusMinValue = a})

-- | Boolean indicating whether the custom metric is active.
cusActive :: Lens' CustomMetric (Maybe Bool)
cusActive
  = lens _cusActive (\ s a -> s{_cusActive = a})

-- | Link for the custom metric
cusSelfLink :: Lens' CustomMetric (Maybe Text)
cusSelfLink
  = lens _cusSelfLink (\ s a -> s{_cusSelfLink = a})

-- | Account ID.
cusAccountId :: Lens' CustomMetric (Maybe Text)
cusAccountId
  = lens _cusAccountId (\ s a -> s{_cusAccountId = a})

-- | Name of the custom metric.
cusName :: Lens' CustomMetric (Maybe Text)
cusName = lens _cusName (\ s a -> s{_cusName = a})

-- | Scope of the custom metric: HIT or PRODUCT.
cusScope :: Lens' CustomMetric (Maybe Text)
cusScope = lens _cusScope (\ s a -> s{_cusScope = a})

-- | Custom metric ID.
cusId :: Lens' CustomMetric (Maybe Text)
cusId = lens _cusId (\ s a -> s{_cusId = a})

-- | Time the custom metric was last modified.
cusUpdated :: Lens' CustomMetric (Maybe UTCTime)
cusUpdated
  = lens _cusUpdated (\ s a -> s{_cusUpdated = a}) .
      mapping _DateTime

-- | Data type of custom metric.
cusType :: Lens' CustomMetric (Maybe Text)
cusType = lens _cusType (\ s a -> s{_cusType = a})

-- | Index of the custom metric.
cusIndex :: Lens' CustomMetric (Maybe Int32)
cusIndex
  = lens _cusIndex (\ s a -> s{_cusIndex = a}) .
      mapping _Coerce

instance FromJSON CustomMetric where
        parseJSON
          = withObject "CustomMetric"
              (\ o ->
                 CustomMetric' <$>
                   (o .:? "parentLink") <*> (o .:? "webPropertyId") <*>
                     (o .:? "kind" .!= "analytics#customMetric")
                     <*> (o .:? "max_value")
                     <*> (o .:? "created")
                     <*> (o .:? "min_value")
                     <*> (o .:? "active")
                     <*> (o .:? "selfLink")
                     <*> (o .:? "accountId")
                     <*> (o .:? "name")
                     <*> (o .:? "scope")
                     <*> (o .:? "id")
                     <*> (o .:? "updated")
                     <*> (o .:? "type")
                     <*> (o .:? "index"))

instance ToJSON CustomMetric where
        toJSON CustomMetric'{..}
          = object
              (catMaybes
                 [("parentLink" .=) <$> _cusParentLink,
                  ("webPropertyId" .=) <$> _cusWebPropertyId,
                  Just ("kind" .= _cusKind),
                  ("max_value" .=) <$> _cusMaxValue,
                  ("created" .=) <$> _cusCreated,
                  ("min_value" .=) <$> _cusMinValue,
                  ("active" .=) <$> _cusActive,
                  ("selfLink" .=) <$> _cusSelfLink,
                  ("accountId" .=) <$> _cusAccountId,
                  ("name" .=) <$> _cusName, ("scope" .=) <$> _cusScope,
                  ("id" .=) <$> _cusId, ("updated" .=) <$> _cusUpdated,
                  ("type" .=) <$> _cusType,
                  ("index" .=) <$> _cusIndex])

-- | JSON template for an Analytics ProfileSummary. ProfileSummary returns
-- basic information (i.e., summary) for a profile.
--
-- /See:/ 'proFileSummary' smart constructor.
data ProFileSummary =
  ProFileSummary'
    { _pfsKind :: !Text
    , _pfsName :: !(Maybe Text)
    , _pfsStarred :: !(Maybe Bool)
    , _pfsId :: !(Maybe Text)
    , _pfsType :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'ProFileSummary' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'pfsKind'
--
-- * 'pfsName'
--
-- * 'pfsStarred'
--
-- * 'pfsId'
--
-- * 'pfsType'
proFileSummary
    :: ProFileSummary
proFileSummary =
  ProFileSummary'
    { _pfsKind = "analytics#profileSummary"
    , _pfsName = Nothing
    , _pfsStarred = Nothing
    , _pfsId = Nothing
    , _pfsType = Nothing
    }


-- | Resource type for Analytics ProfileSummary.
pfsKind :: Lens' ProFileSummary Text
pfsKind = lens _pfsKind (\ s a -> s{_pfsKind = a})

-- | View (profile) name.
pfsName :: Lens' ProFileSummary (Maybe Text)
pfsName = lens _pfsName (\ s a -> s{_pfsName = a})

-- | Indicates whether this view (profile) is starred or not.
pfsStarred :: Lens' ProFileSummary (Maybe Bool)
pfsStarred
  = lens _pfsStarred (\ s a -> s{_pfsStarred = a})

-- | View (profile) ID.
pfsId :: Lens' ProFileSummary (Maybe Text)
pfsId = lens _pfsId (\ s a -> s{_pfsId = a})

-- | View (Profile) type. Supported types: WEB or APP.
pfsType :: Lens' ProFileSummary (Maybe Text)
pfsType = lens _pfsType (\ s a -> s{_pfsType = a})

instance FromJSON ProFileSummary where
        parseJSON
          = withObject "ProFileSummary"
              (\ o ->
                 ProFileSummary' <$>
                   (o .:? "kind" .!= "analytics#profileSummary") <*>
                     (o .:? "name")
                     <*> (o .:? "starred")
                     <*> (o .:? "id")
                     <*> (o .:? "type"))

instance ToJSON ProFileSummary where
        toJSON ProFileSummary'{..}
          = object
              (catMaybes
                 [Just ("kind" .= _pfsKind), ("name" .=) <$> _pfsName,
                  ("starred" .=) <$> _pfsStarred, ("id" .=) <$> _pfsId,
                  ("type" .=) <$> _pfsType])

-- | Parent link for the custom dimension. Points to the property to which
-- the custom dimension belongs.
--
-- /See:/ 'customDimensionParentLink' smart constructor.
data CustomDimensionParentLink =
  CustomDimensionParentLink'
    { _cdplHref :: !(Maybe Text)
    , _cdplType :: !Text
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'CustomDimensionParentLink' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'cdplHref'
--
-- * 'cdplType'
customDimensionParentLink
    :: CustomDimensionParentLink
customDimensionParentLink =
  CustomDimensionParentLink'
    {_cdplHref = Nothing, _cdplType = "analytics#webproperty"}


-- | Link to the property to which the custom dimension belongs.
cdplHref :: Lens' CustomDimensionParentLink (Maybe Text)
cdplHref = lens _cdplHref (\ s a -> s{_cdplHref = a})

-- | Type of the parent link. Set to \"analytics#webproperty\".
cdplType :: Lens' CustomDimensionParentLink Text
cdplType = lens _cdplType (\ s a -> s{_cdplType = a})

instance FromJSON CustomDimensionParentLink where
        parseJSON
          = withObject "CustomDimensionParentLink"
              (\ o ->
                 CustomDimensionParentLink' <$>
                   (o .:? "href") <*>
                     (o .:? "type" .!= "analytics#webproperty"))

instance ToJSON CustomDimensionParentLink where
        toJSON CustomDimensionParentLink'{..}
          = object
              (catMaybes
                 [("href" .=) <$> _cdplHref,
                  Just ("type" .= _cdplType)])

-- | JSON template for an Analytics web property.
--
-- /See:/ 'webProperty' smart constructor.
data WebProperty =
  WebProperty'
    { _wParentLink :: !(Maybe WebPropertyParentLink)
    , _wChildLink :: !(Maybe WebPropertyChildLink)
    , _wDefaultProFileId :: !(Maybe (Textual Int64))
    , _wKind :: !Text
    , _wCreated :: !(Maybe DateTime')
    , _wDataRetentionTtl :: !(Maybe Text)
    , _wDataRetentionResetOnNewActivity :: !(Maybe Bool)
    , _wSelfLink :: !(Maybe Text)
    , _wAccountId :: !(Maybe Text)
    , _wName :: !(Maybe Text)
    , _wStarred :: !(Maybe Bool)
    , _wInternalWebPropertyId :: !(Maybe Text)
    , _wId :: !(Maybe Text)
    , _wUpdated :: !(Maybe DateTime')
    , _wProFileCount :: !(Maybe (Textual Int32))
    , _wPermissions :: !(Maybe WebPropertyPermissions)
    , _wWebsiteURL :: !(Maybe Text)
    , _wIndustryVertical :: !(Maybe Text)
    , _wLevel :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'WebProperty' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'wParentLink'
--
-- * 'wChildLink'
--
-- * 'wDefaultProFileId'
--
-- * 'wKind'
--
-- * 'wCreated'
--
-- * 'wDataRetentionTtl'
--
-- * 'wDataRetentionResetOnNewActivity'
--
-- * 'wSelfLink'
--
-- * 'wAccountId'
--
-- * 'wName'
--
-- * 'wStarred'
--
-- * 'wInternalWebPropertyId'
--
-- * 'wId'
--
-- * 'wUpdated'
--
-- * 'wProFileCount'
--
-- * 'wPermissions'
--
-- * 'wWebsiteURL'
--
-- * 'wIndustryVertical'
--
-- * 'wLevel'
webProperty
    :: WebProperty
webProperty =
  WebProperty'
    { _wParentLink = Nothing
    , _wChildLink = Nothing
    , _wDefaultProFileId = Nothing
    , _wKind = "analytics#webproperty"
    , _wCreated = Nothing
    , _wDataRetentionTtl = Nothing
    , _wDataRetentionResetOnNewActivity = Nothing
    , _wSelfLink = Nothing
    , _wAccountId = Nothing
    , _wName = Nothing
    , _wStarred = Nothing
    , _wInternalWebPropertyId = Nothing
    , _wId = Nothing
    , _wUpdated = Nothing
    , _wProFileCount = Nothing
    , _wPermissions = Nothing
    , _wWebsiteURL = Nothing
    , _wIndustryVertical = Nothing
    , _wLevel = Nothing
    }


-- | Parent link for this web property. Points to the account to which this
-- web property belongs.
wParentLink :: Lens' WebProperty (Maybe WebPropertyParentLink)
wParentLink
  = lens _wParentLink (\ s a -> s{_wParentLink = a})

-- | Child link for this web property. Points to the list of views (profiles)
-- for this web property.
wChildLink :: Lens' WebProperty (Maybe WebPropertyChildLink)
wChildLink
  = lens _wChildLink (\ s a -> s{_wChildLink = a})

-- | Default view (profile) ID.
wDefaultProFileId :: Lens' WebProperty (Maybe Int64)
wDefaultProFileId
  = lens _wDefaultProFileId
      (\ s a -> s{_wDefaultProFileId = a})
      . mapping _Coerce

-- | Resource type for Analytics WebProperty.
wKind :: Lens' WebProperty Text
wKind = lens _wKind (\ s a -> s{_wKind = a})

-- | Time this web property was created.
wCreated :: Lens' WebProperty (Maybe UTCTime)
wCreated
  = lens _wCreated (\ s a -> s{_wCreated = a}) .
      mapping _DateTime

-- | The length of time for which user and event data is retained. This
-- property cannot be set on insert.
wDataRetentionTtl :: Lens' WebProperty (Maybe Text)
wDataRetentionTtl
  = lens _wDataRetentionTtl
      (\ s a -> s{_wDataRetentionTtl = a})

-- | 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.
wDataRetentionResetOnNewActivity :: Lens' WebProperty (Maybe Bool)
wDataRetentionResetOnNewActivity
  = lens _wDataRetentionResetOnNewActivity
      (\ s a -> s{_wDataRetentionResetOnNewActivity = a})

-- | Link for this web property.
wSelfLink :: Lens' WebProperty (Maybe Text)
wSelfLink
  = lens _wSelfLink (\ s a -> s{_wSelfLink = a})

-- | Account ID to which this web property belongs.
wAccountId :: Lens' WebProperty (Maybe Text)
wAccountId
  = lens _wAccountId (\ s a -> s{_wAccountId = a})

-- | Name of this web property.
wName :: Lens' WebProperty (Maybe Text)
wName = lens _wName (\ s a -> s{_wName = a})

-- | Indicates whether this web property is starred or not.
wStarred :: Lens' WebProperty (Maybe Bool)
wStarred = lens _wStarred (\ s a -> s{_wStarred = a})

-- | Internal ID for this web property.
wInternalWebPropertyId :: Lens' WebProperty (Maybe Text)
wInternalWebPropertyId
  = lens _wInternalWebPropertyId
      (\ s a -> s{_wInternalWebPropertyId = a})

-- | Web property ID of the form UA-XXXXX-YY.
wId :: Lens' WebProperty (Maybe Text)
wId = lens _wId (\ s a -> s{_wId = a})

-- | Time this web property was last modified.
wUpdated :: Lens' WebProperty (Maybe UTCTime)
wUpdated
  = lens _wUpdated (\ s a -> s{_wUpdated = a}) .
      mapping _DateTime

-- | View (Profile) count for this web property.
wProFileCount :: Lens' WebProperty (Maybe Int32)
wProFileCount
  = lens _wProFileCount
      (\ s a -> s{_wProFileCount = a})
      . mapping _Coerce

-- | Permissions the user has for this web property.
wPermissions :: Lens' WebProperty (Maybe WebPropertyPermissions)
wPermissions
  = lens _wPermissions (\ s a -> s{_wPermissions = a})

-- | Website url for this web property.
wWebsiteURL :: Lens' WebProperty (Maybe Text)
wWebsiteURL
  = lens _wWebsiteURL (\ s a -> s{_wWebsiteURL = a})

-- | The industry vertical\/category selected for this web property.
wIndustryVertical :: Lens' WebProperty (Maybe Text)
wIndustryVertical
  = lens _wIndustryVertical
      (\ s a -> s{_wIndustryVertical = a})

-- | Level for this web property. Possible values are STANDARD or PREMIUM.
wLevel :: Lens' WebProperty (Maybe Text)
wLevel = lens _wLevel (\ s a -> s{_wLevel = a})

instance FromJSON WebProperty where
        parseJSON
          = withObject "WebProperty"
              (\ o ->
                 WebProperty' <$>
                   (o .:? "parentLink") <*> (o .:? "childLink") <*>
                     (o .:? "defaultProfileId")
                     <*> (o .:? "kind" .!= "analytics#webproperty")
                     <*> (o .:? "created")
                     <*> (o .:? "dataRetentionTtl")
                     <*> (o .:? "dataRetentionResetOnNewActivity")
                     <*> (o .:? "selfLink")
                     <*> (o .:? "accountId")
                     <*> (o .:? "name")
                     <*> (o .:? "starred")
                     <*> (o .:? "internalWebPropertyId")
                     <*> (o .:? "id")
                     <*> (o .:? "updated")
                     <*> (o .:? "profileCount")
                     <*> (o .:? "permissions")
                     <*> (o .:? "websiteUrl")
                     <*> (o .:? "industryVertical")
                     <*> (o .:? "level"))

instance ToJSON WebProperty where
        toJSON WebProperty'{..}
          = object
              (catMaybes
                 [("parentLink" .=) <$> _wParentLink,
                  ("childLink" .=) <$> _wChildLink,
                  ("defaultProfileId" .=) <$> _wDefaultProFileId,
                  Just ("kind" .= _wKind),
                  ("created" .=) <$> _wCreated,
                  ("dataRetentionTtl" .=) <$> _wDataRetentionTtl,
                  ("dataRetentionResetOnNewActivity" .=) <$>
                    _wDataRetentionResetOnNewActivity,
                  ("selfLink" .=) <$> _wSelfLink,
                  ("accountId" .=) <$> _wAccountId,
                  ("name" .=) <$> _wName, ("starred" .=) <$> _wStarred,
                  ("internalWebPropertyId" .=) <$>
                    _wInternalWebPropertyId,
                  ("id" .=) <$> _wId, ("updated" .=) <$> _wUpdated,
                  ("profileCount" .=) <$> _wProFileCount,
                  ("permissions" .=) <$> _wPermissions,
                  ("websiteUrl" .=) <$> _wWebsiteURL,
                  ("industryVertical" .=) <$> _wIndustryVertical,
                  ("level" .=) <$> _wLevel])

-- | Permissions the user has for this web property.
--
-- /See:/ 'webPropertyPermissions' smart constructor.
newtype WebPropertyPermissions =
  WebPropertyPermissions'
    { _wppEffective :: Maybe [Text]
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'WebPropertyPermissions' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'wppEffective'
webPropertyPermissions
    :: WebPropertyPermissions
webPropertyPermissions = WebPropertyPermissions' {_wppEffective = Nothing}


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

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

instance ToJSON WebPropertyPermissions where
        toJSON WebPropertyPermissions'{..}
          = object
              (catMaybes [("effective" .=) <$> _wppEffective])

-- | JSON template for an Analytics Entity-User Link. Returns permissions
-- that a user has for an entity.
--
-- /See:/ 'entityUserLink' smart constructor.
data EntityUserLink =
  EntityUserLink'
    { _euluKind :: !Text
    , _euluUserRef :: !(Maybe UserRef)
    , _euluSelfLink :: !(Maybe Text)
    , _euluId :: !(Maybe Text)
    , _euluPermissions :: !(Maybe EntityUserLinkPermissions)
    , _euluEntity :: !(Maybe EntityUserLinkEntity)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'EntityUserLink' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'euluKind'
--
-- * 'euluUserRef'
--
-- * 'euluSelfLink'
--
-- * 'euluId'
--
-- * 'euluPermissions'
--
-- * 'euluEntity'
entityUserLink
    :: EntityUserLink
entityUserLink =
  EntityUserLink'
    { _euluKind = "analytics#entityUserLink"
    , _euluUserRef = Nothing
    , _euluSelfLink = Nothing
    , _euluId = Nothing
    , _euluPermissions = Nothing
    , _euluEntity = Nothing
    }


-- | Resource type for entity user link.
euluKind :: Lens' EntityUserLink Text
euluKind = lens _euluKind (\ s a -> s{_euluKind = a})

-- | User reference.
euluUserRef :: Lens' EntityUserLink (Maybe UserRef)
euluUserRef
  = lens _euluUserRef (\ s a -> s{_euluUserRef = a})

-- | Self link for this resource.
euluSelfLink :: Lens' EntityUserLink (Maybe Text)
euluSelfLink
  = lens _euluSelfLink (\ s a -> s{_euluSelfLink = a})

-- | Entity user link ID
euluId :: Lens' EntityUserLink (Maybe Text)
euluId = lens _euluId (\ s a -> s{_euluId = a})

-- | Permissions the user has for this entity.
euluPermissions :: Lens' EntityUserLink (Maybe EntityUserLinkPermissions)
euluPermissions
  = lens _euluPermissions
      (\ s a -> s{_euluPermissions = a})

-- | Entity for this link. It can be an account, a web property, or a view
-- (profile).
euluEntity :: Lens' EntityUserLink (Maybe EntityUserLinkEntity)
euluEntity
  = lens _euluEntity (\ s a -> s{_euluEntity = a})

instance FromJSON EntityUserLink where
        parseJSON
          = withObject "EntityUserLink"
              (\ o ->
                 EntityUserLink' <$>
                   (o .:? "kind" .!= "analytics#entityUserLink") <*>
                     (o .:? "userRef")
                     <*> (o .:? "selfLink")
                     <*> (o .:? "id")
                     <*> (o .:? "permissions")
                     <*> (o .:? "entity"))

instance ToJSON EntityUserLink where
        toJSON EntityUserLink'{..}
          = object
              (catMaybes
                 [Just ("kind" .= _euluKind),
                  ("userRef" .=) <$> _euluUserRef,
                  ("selfLink" .=) <$> _euluSelfLink,
                  ("id" .=) <$> _euluId,
                  ("permissions" .=) <$> _euluPermissions,
                  ("entity" .=) <$> _euluEntity])

-- | Parent link for this custom data source. Points to the web property to
-- which this custom data source belongs.
--
-- /See:/ 'customDataSourceParentLink' smart constructor.
data CustomDataSourceParentLink =
  CustomDataSourceParentLink'
    { _cdsplHref :: !(Maybe Text)
    , _cdsplType :: !Text
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'CustomDataSourceParentLink' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'cdsplHref'
--
-- * 'cdsplType'
customDataSourceParentLink
    :: CustomDataSourceParentLink
customDataSourceParentLink =
  CustomDataSourceParentLink'
    {_cdsplHref = Nothing, _cdsplType = "analytics#webproperty"}


-- | Link to the web property to which this custom data source belongs.
cdsplHref :: Lens' CustomDataSourceParentLink (Maybe Text)
cdsplHref
  = lens _cdsplHref (\ s a -> s{_cdsplHref = a})

-- | Value is \"analytics#webproperty\".
cdsplType :: Lens' CustomDataSourceParentLink Text
cdsplType
  = lens _cdsplType (\ s a -> s{_cdsplType = a})

instance FromJSON CustomDataSourceParentLink where
        parseJSON
          = withObject "CustomDataSourceParentLink"
              (\ o ->
                 CustomDataSourceParentLink' <$>
                   (o .:? "href") <*>
                     (o .:? "type" .!= "analytics#webproperty"))

instance ToJSON CustomDataSourceParentLink where
        toJSON CustomDataSourceParentLink'{..}
          = object
              (catMaybes
                 [("href" .=) <$> _cdsplHref,
                  Just ("type" .= _cdsplType)])

--
-- /See:/ 'goalEventDetailsEventConditionsItem' smart constructor.
data GoalEventDetailsEventConditionsItem =
  GoalEventDetailsEventConditionsItem'
    { _gedeciMatchType :: !(Maybe Text)
    , _gedeciExpression :: !(Maybe Text)
    , _gedeciComparisonValue :: !(Maybe (Textual Int64))
    , _gedeciType :: !(Maybe Text)
    , _gedeciComparisonType :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'GoalEventDetailsEventConditionsItem' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'gedeciMatchType'
--
-- * 'gedeciExpression'
--
-- * 'gedeciComparisonValue'
--
-- * 'gedeciType'
--
-- * 'gedeciComparisonType'
goalEventDetailsEventConditionsItem
    :: GoalEventDetailsEventConditionsItem
goalEventDetailsEventConditionsItem =
  GoalEventDetailsEventConditionsItem'
    { _gedeciMatchType = Nothing
    , _gedeciExpression = Nothing
    , _gedeciComparisonValue = Nothing
    , _gedeciType = Nothing
    , _gedeciComparisonType = Nothing
    }


-- | Type of the match to be performed. Possible values are REGEXP,
-- BEGINS_WITH, or EXACT.
gedeciMatchType :: Lens' GoalEventDetailsEventConditionsItem (Maybe Text)
gedeciMatchType
  = lens _gedeciMatchType
      (\ s a -> s{_gedeciMatchType = a})

-- | Expression used for this match.
gedeciExpression :: Lens' GoalEventDetailsEventConditionsItem (Maybe Text)
gedeciExpression
  = lens _gedeciExpression
      (\ s a -> s{_gedeciExpression = a})

-- | Value used for this comparison.
gedeciComparisonValue :: Lens' GoalEventDetailsEventConditionsItem (Maybe Int64)
gedeciComparisonValue
  = lens _gedeciComparisonValue
      (\ s a -> s{_gedeciComparisonValue = a})
      . mapping _Coerce

-- | Type of this event condition. Possible values are CATEGORY, ACTION,
-- LABEL, or VALUE.
gedeciType :: Lens' GoalEventDetailsEventConditionsItem (Maybe Text)
gedeciType
  = lens _gedeciType (\ s a -> s{_gedeciType = a})

-- | Type of comparison. Possible values are LESS_THAN, GREATER_THAN or
-- EQUAL.
gedeciComparisonType :: Lens' GoalEventDetailsEventConditionsItem (Maybe Text)
gedeciComparisonType
  = lens _gedeciComparisonType
      (\ s a -> s{_gedeciComparisonType = a})

instance FromJSON GoalEventDetailsEventConditionsItem
         where
        parseJSON
          = withObject "GoalEventDetailsEventConditionsItem"
              (\ o ->
                 GoalEventDetailsEventConditionsItem' <$>
                   (o .:? "matchType") <*> (o .:? "expression") <*>
                     (o .:? "comparisonValue")
                     <*> (o .:? "type")
                     <*> (o .:? "comparisonType"))

instance ToJSON GoalEventDetailsEventConditionsItem
         where
        toJSON GoalEventDetailsEventConditionsItem'{..}
          = object
              (catMaybes
                 [("matchType" .=) <$> _gedeciMatchType,
                  ("expression" .=) <$> _gedeciExpression,
                  ("comparisonValue" .=) <$> _gedeciComparisonValue,
                  ("type" .=) <$> _gedeciType,
                  ("comparisonType" .=) <$> _gedeciComparisonType])

-- | Analytics data request query parameters.
--
-- /See:/ 'mcfDataQuery' smart constructor.
data McfDataQuery =
  McfDataQuery'
    { _mdqMetrics :: !(Maybe [Text])
    , _mdqSamplingLevel :: !(Maybe Text)
    , _mdqFilters :: !(Maybe Text)
    , _mdqIds :: !(Maybe Text)
    , _mdqEndDate :: !(Maybe Text)
    , _mdqSort :: !(Maybe [Text])
    , _mdqDimensions :: !(Maybe Text)
    , _mdqStartIndex :: !(Maybe (Textual Int32))
    , _mdqMaxResults :: !(Maybe (Textual Int32))
    , _mdqSegment :: !(Maybe Text)
    , _mdqStartDate :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'McfDataQuery' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'mdqMetrics'
--
-- * 'mdqSamplingLevel'
--
-- * 'mdqFilters'
--
-- * 'mdqIds'
--
-- * 'mdqEndDate'
--
-- * 'mdqSort'
--
-- * 'mdqDimensions'
--
-- * 'mdqStartIndex'
--
-- * 'mdqMaxResults'
--
-- * 'mdqSegment'
--
-- * 'mdqStartDate'
mcfDataQuery
    :: McfDataQuery
mcfDataQuery =
  McfDataQuery'
    { _mdqMetrics = Nothing
    , _mdqSamplingLevel = Nothing
    , _mdqFilters = Nothing
    , _mdqIds = Nothing
    , _mdqEndDate = Nothing
    , _mdqSort = Nothing
    , _mdqDimensions = Nothing
    , _mdqStartIndex = Nothing
    , _mdqMaxResults = Nothing
    , _mdqSegment = Nothing
    , _mdqStartDate = Nothing
    }


-- | List of analytics metrics.
mdqMetrics :: Lens' McfDataQuery [Text]
mdqMetrics
  = lens _mdqMetrics (\ s a -> s{_mdqMetrics = a}) .
      _Default
      . _Coerce

-- | Desired sampling level
mdqSamplingLevel :: Lens' McfDataQuery (Maybe Text)
mdqSamplingLevel
  = lens _mdqSamplingLevel
      (\ s a -> s{_mdqSamplingLevel = a})

-- | Comma-separated list of dimension or metric filters.
mdqFilters :: Lens' McfDataQuery (Maybe Text)
mdqFilters
  = lens _mdqFilters (\ s a -> s{_mdqFilters = a})

-- | Unique table ID.
mdqIds :: Lens' McfDataQuery (Maybe Text)
mdqIds = lens _mdqIds (\ s a -> s{_mdqIds = a})

-- | End date.
mdqEndDate :: Lens' McfDataQuery (Maybe Text)
mdqEndDate
  = lens _mdqEndDate (\ s a -> s{_mdqEndDate = a})

-- | List of dimensions or metrics based on which Analytics data is sorted.
mdqSort :: Lens' McfDataQuery [Text]
mdqSort
  = lens _mdqSort (\ s a -> s{_mdqSort = a}) . _Default
      . _Coerce

-- | List of analytics dimensions.
mdqDimensions :: Lens' McfDataQuery (Maybe Text)
mdqDimensions
  = lens _mdqDimensions
      (\ s a -> s{_mdqDimensions = a})

-- | Start index.
mdqStartIndex :: Lens' McfDataQuery (Maybe Int32)
mdqStartIndex
  = lens _mdqStartIndex
      (\ s a -> s{_mdqStartIndex = a})
      . mapping _Coerce

-- | Maximum results per page.
mdqMaxResults :: Lens' McfDataQuery (Maybe Int32)
mdqMaxResults
  = lens _mdqMaxResults
      (\ s a -> s{_mdqMaxResults = a})
      . mapping _Coerce

-- | Analytics advanced segment.
mdqSegment :: Lens' McfDataQuery (Maybe Text)
mdqSegment
  = lens _mdqSegment (\ s a -> s{_mdqSegment = a})

-- | Start date.
mdqStartDate :: Lens' McfDataQuery (Maybe Text)
mdqStartDate
  = lens _mdqStartDate (\ s a -> s{_mdqStartDate = a})

instance FromJSON McfDataQuery where
        parseJSON
          = withObject "McfDataQuery"
              (\ o ->
                 McfDataQuery' <$>
                   (o .:? "metrics" .!= mempty) <*>
                     (o .:? "samplingLevel")
                     <*> (o .:? "filters")
                     <*> (o .:? "ids")
                     <*> (o .:? "end-date")
                     <*> (o .:? "sort" .!= mempty)
                     <*> (o .:? "dimensions")
                     <*> (o .:? "start-index")
                     <*> (o .:? "max-results")
                     <*> (o .:? "segment")
                     <*> (o .:? "start-date"))

instance ToJSON McfDataQuery where
        toJSON McfDataQuery'{..}
          = object
              (catMaybes
                 [("metrics" .=) <$> _mdqMetrics,
                  ("samplingLevel" .=) <$> _mdqSamplingLevel,
                  ("filters" .=) <$> _mdqFilters,
                  ("ids" .=) <$> _mdqIds,
                  ("end-date" .=) <$> _mdqEndDate,
                  ("sort" .=) <$> _mdqSort,
                  ("dimensions" .=) <$> _mdqDimensions,
                  ("start-index" .=) <$> _mdqStartIndex,
                  ("max-results" .=) <$> _mdqMaxResults,
                  ("segment" .=) <$> _mdqSegment,
                  ("start-date" .=) <$> _mdqStartDate])

-- | JSON template for Analytics goal resource.
--
-- /See:/ 'goal' smart constructor.
data Goal =
  Goal'
    { _goaParentLink :: !(Maybe GoalParentLink)
    , _goaWebPropertyId :: !(Maybe Text)
    , _goaKind :: !Text
    , _goaCreated :: !(Maybe DateTime')
    , _goaValue :: !(Maybe (Textual Double))
    , _goaProFileId :: !(Maybe Text)
    , _goaEventDetails :: !(Maybe GoalEventDetails)
    , _goaActive :: !(Maybe Bool)
    , _goaSelfLink :: !(Maybe Text)
    , _goaVisitTimeOnSiteDetails :: !(Maybe GoalVisitTimeOnSiteDetails)
    , _goaAccountId :: !(Maybe Text)
    , _goaName :: !(Maybe Text)
    , _goaInternalWebPropertyId :: !(Maybe Text)
    , _goaId :: !(Maybe Text)
    , _goaURLDestinationDetails :: !(Maybe GoalURLDestinationDetails)
    , _goaVisitNumPagesDetails :: !(Maybe GoalVisitNumPagesDetails)
    , _goaUpdated :: !(Maybe DateTime')
    , _goaType :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'Goal' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'goaParentLink'
--
-- * 'goaWebPropertyId'
--
-- * 'goaKind'
--
-- * 'goaCreated'
--
-- * 'goaValue'
--
-- * 'goaProFileId'
--
-- * 'goaEventDetails'
--
-- * 'goaActive'
--
-- * 'goaSelfLink'
--
-- * 'goaVisitTimeOnSiteDetails'
--
-- * 'goaAccountId'
--
-- * 'goaName'
--
-- * 'goaInternalWebPropertyId'
--
-- * 'goaId'
--
-- * 'goaURLDestinationDetails'
--
-- * 'goaVisitNumPagesDetails'
--
-- * 'goaUpdated'
--
-- * 'goaType'
goal
    :: Goal
goal =
  Goal'
    { _goaParentLink = Nothing
    , _goaWebPropertyId = Nothing
    , _goaKind = "analytics#goal"
    , _goaCreated = Nothing
    , _goaValue = Nothing
    , _goaProFileId = Nothing
    , _goaEventDetails = Nothing
    , _goaActive = Nothing
    , _goaSelfLink = Nothing
    , _goaVisitTimeOnSiteDetails = Nothing
    , _goaAccountId = Nothing
    , _goaName = Nothing
    , _goaInternalWebPropertyId = Nothing
    , _goaId = Nothing
    , _goaURLDestinationDetails = Nothing
    , _goaVisitNumPagesDetails = Nothing
    , _goaUpdated = Nothing
    , _goaType = Nothing
    }


-- | Parent link for a goal. Points to the view (profile) to which this goal
-- belongs.
goaParentLink :: Lens' Goal (Maybe GoalParentLink)
goaParentLink
  = lens _goaParentLink
      (\ s a -> s{_goaParentLink = a})

-- | Web property ID to which this goal belongs. The web property ID is of
-- the form UA-XXXXX-YY.
goaWebPropertyId :: Lens' Goal (Maybe Text)
goaWebPropertyId
  = lens _goaWebPropertyId
      (\ s a -> s{_goaWebPropertyId = a})

-- | Resource type for an Analytics goal.
goaKind :: Lens' Goal Text
goaKind = lens _goaKind (\ s a -> s{_goaKind = a})

-- | Time this goal was created.
goaCreated :: Lens' Goal (Maybe UTCTime)
goaCreated
  = lens _goaCreated (\ s a -> s{_goaCreated = a}) .
      mapping _DateTime

-- | Goal value.
goaValue :: Lens' Goal (Maybe Double)
goaValue
  = lens _goaValue (\ s a -> s{_goaValue = a}) .
      mapping _Coerce

-- | View (Profile) ID to which this goal belongs.
goaProFileId :: Lens' Goal (Maybe Text)
goaProFileId
  = lens _goaProFileId (\ s a -> s{_goaProFileId = a})

-- | Details for the goal of the type EVENT.
goaEventDetails :: Lens' Goal (Maybe GoalEventDetails)
goaEventDetails
  = lens _goaEventDetails
      (\ s a -> s{_goaEventDetails = a})

-- | Determines whether this goal is active.
goaActive :: Lens' Goal (Maybe Bool)
goaActive
  = lens _goaActive (\ s a -> s{_goaActive = a})

-- | Link for this goal.
goaSelfLink :: Lens' Goal (Maybe Text)
goaSelfLink
  = lens _goaSelfLink (\ s a -> s{_goaSelfLink = a})

-- | Details for the goal of the type VISIT_TIME_ON_SITE.
goaVisitTimeOnSiteDetails :: Lens' Goal (Maybe GoalVisitTimeOnSiteDetails)
goaVisitTimeOnSiteDetails
  = lens _goaVisitTimeOnSiteDetails
      (\ s a -> s{_goaVisitTimeOnSiteDetails = a})

-- | Account ID to which this goal belongs.
goaAccountId :: Lens' Goal (Maybe Text)
goaAccountId
  = lens _goaAccountId (\ s a -> s{_goaAccountId = a})

-- | Goal name.
goaName :: Lens' Goal (Maybe Text)
goaName = lens _goaName (\ s a -> s{_goaName = a})

-- | Internal ID for the web property to which this goal belongs.
goaInternalWebPropertyId :: Lens' Goal (Maybe Text)
goaInternalWebPropertyId
  = lens _goaInternalWebPropertyId
      (\ s a -> s{_goaInternalWebPropertyId = a})

-- | Goal ID.
goaId :: Lens' Goal (Maybe Text)
goaId = lens _goaId (\ s a -> s{_goaId = a})

-- | Details for the goal of the type URL_DESTINATION.
goaURLDestinationDetails :: Lens' Goal (Maybe GoalURLDestinationDetails)
goaURLDestinationDetails
  = lens _goaURLDestinationDetails
      (\ s a -> s{_goaURLDestinationDetails = a})

-- | Details for the goal of the type VISIT_NUM_PAGES.
goaVisitNumPagesDetails :: Lens' Goal (Maybe GoalVisitNumPagesDetails)
goaVisitNumPagesDetails
  = lens _goaVisitNumPagesDetails
      (\ s a -> s{_goaVisitNumPagesDetails = a})

-- | Time this goal was last modified.
goaUpdated :: Lens' Goal (Maybe UTCTime)
goaUpdated
  = lens _goaUpdated (\ s a -> s{_goaUpdated = a}) .
      mapping _DateTime

-- | Goal type. Possible values are URL_DESTINATION, VISIT_TIME_ON_SITE,
-- VISIT_NUM_PAGES, AND EVENT.
goaType :: Lens' Goal (Maybe Text)
goaType = lens _goaType (\ s a -> s{_goaType = a})

instance FromJSON Goal where
        parseJSON
          = withObject "Goal"
              (\ o ->
                 Goal' <$>
                   (o .:? "parentLink") <*> (o .:? "webPropertyId") <*>
                     (o .:? "kind" .!= "analytics#goal")
                     <*> (o .:? "created")
                     <*> (o .:? "value")
                     <*> (o .:? "profileId")
                     <*> (o .:? "eventDetails")
                     <*> (o .:? "active")
                     <*> (o .:? "selfLink")
                     <*> (o .:? "visitTimeOnSiteDetails")
                     <*> (o .:? "accountId")
                     <*> (o .:? "name")
                     <*> (o .:? "internalWebPropertyId")
                     <*> (o .:? "id")
                     <*> (o .:? "urlDestinationDetails")
                     <*> (o .:? "visitNumPagesDetails")
                     <*> (o .:? "updated")
                     <*> (o .:? "type"))

instance ToJSON Goal where
        toJSON Goal'{..}
          = object
              (catMaybes
                 [("parentLink" .=) <$> _goaParentLink,
                  ("webPropertyId" .=) <$> _goaWebPropertyId,
                  Just ("kind" .= _goaKind),
                  ("created" .=) <$> _goaCreated,
                  ("value" .=) <$> _goaValue,
                  ("profileId" .=) <$> _goaProFileId,
                  ("eventDetails" .=) <$> _goaEventDetails,
                  ("active" .=) <$> _goaActive,
                  ("selfLink" .=) <$> _goaSelfLink,
                  ("visitTimeOnSiteDetails" .=) <$>
                    _goaVisitTimeOnSiteDetails,
                  ("accountId" .=) <$> _goaAccountId,
                  ("name" .=) <$> _goaName,
                  ("internalWebPropertyId" .=) <$>
                    _goaInternalWebPropertyId,
                  ("id" .=) <$> _goaId,
                  ("urlDestinationDetails" .=) <$>
                    _goaURLDestinationDetails,
                  ("visitNumPagesDetails" .=) <$>
                    _goaVisitNumPagesDetails,
                  ("updated" .=) <$> _goaUpdated,
                  ("type" .=) <$> _goaType])

-- | 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:/ 'accountTicket' smart constructor.
data AccountTicket =
  AccountTicket'
    { _atRedirectURI :: !(Maybe Text)
    , _atKind :: !Text
    , _atProFile :: !(Maybe ProFile)
    , _atAccount :: !(Maybe Account)
    , _atWebProperty :: !(Maybe WebProperty)
    , _atId :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'AccountTicket' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'atRedirectURI'
--
-- * 'atKind'
--
-- * 'atProFile'
--
-- * 'atAccount'
--
-- * 'atWebProperty'
--
-- * 'atId'
accountTicket
    :: AccountTicket
accountTicket =
  AccountTicket'
    { _atRedirectURI = Nothing
    , _atKind = "analytics#accountTicket"
    , _atProFile = Nothing
    , _atAccount = Nothing
    , _atWebProperty = Nothing
    , _atId = Nothing
    }


-- | Redirect URI where the user will be sent after accepting Terms of
-- Service. Must be configured in APIs console as a callback URL.
atRedirectURI :: Lens' AccountTicket (Maybe Text)
atRedirectURI
  = lens _atRedirectURI
      (\ s a -> s{_atRedirectURI = a})

-- | Resource type for account ticket.
atKind :: Lens' AccountTicket Text
atKind = lens _atKind (\ s a -> s{_atKind = a})

-- | View (Profile) for the account.
atProFile :: Lens' AccountTicket (Maybe ProFile)
atProFile
  = lens _atProFile (\ s a -> s{_atProFile = a})

-- | Account for this ticket.
atAccount :: Lens' AccountTicket (Maybe Account)
atAccount
  = lens _atAccount (\ s a -> s{_atAccount = a})

-- | Web property for the account.
atWebProperty :: Lens' AccountTicket (Maybe WebProperty)
atWebProperty
  = lens _atWebProperty
      (\ s a -> s{_atWebProperty = a})

-- | Account ticket ID used to access the account ticket.
atId :: Lens' AccountTicket (Maybe Text)
atId = lens _atId (\ s a -> s{_atId = a})

instance FromJSON AccountTicket where
        parseJSON
          = withObject "AccountTicket"
              (\ o ->
                 AccountTicket' <$>
                   (o .:? "redirectUri") <*>
                     (o .:? "kind" .!= "analytics#accountTicket")
                     <*> (o .:? "profile")
                     <*> (o .:? "account")
                     <*> (o .:? "webproperty")
                     <*> (o .:? "id"))

instance ToJSON AccountTicket where
        toJSON AccountTicket'{..}
          = object
              (catMaybes
                 [("redirectUri" .=) <$> _atRedirectURI,
                  Just ("kind" .= _atKind),
                  ("profile" .=) <$> _atProFile,
                  ("account" .=) <$> _atAccount,
                  ("webproperty" .=) <$> _atWebProperty,
                  ("id" .=) <$> _atId])

-- | JSON template for an Analytics AccountSummary. An AccountSummary is a
-- lightweight tree comprised of properties\/profiles.
--
-- /See:/ 'accountSummary' smart constructor.
data AccountSummary =
  AccountSummary'
    { _assKind :: !Text
    , _assWebProperties :: !(Maybe [WebPropertySummary])
    , _assName :: !(Maybe Text)
    , _assStarred :: !(Maybe Bool)
    , _assId :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'AccountSummary' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'assKind'
--
-- * 'assWebProperties'
--
-- * 'assName'
--
-- * 'assStarred'
--
-- * 'assId'
accountSummary
    :: AccountSummary
accountSummary =
  AccountSummary'
    { _assKind = "analytics#accountSummary"
    , _assWebProperties = Nothing
    , _assName = Nothing
    , _assStarred = Nothing
    , _assId = Nothing
    }


-- | Resource type for Analytics AccountSummary.
assKind :: Lens' AccountSummary Text
assKind = lens _assKind (\ s a -> s{_assKind = a})

-- | List of web properties under this account.
assWebProperties :: Lens' AccountSummary [WebPropertySummary]
assWebProperties
  = lens _assWebProperties
      (\ s a -> s{_assWebProperties = a})
      . _Default
      . _Coerce

-- | Account name.
assName :: Lens' AccountSummary (Maybe Text)
assName = lens _assName (\ s a -> s{_assName = a})

-- | Indicates whether this account is starred or not.
assStarred :: Lens' AccountSummary (Maybe Bool)
assStarred
  = lens _assStarred (\ s a -> s{_assStarred = a})

-- | Account ID.
assId :: Lens' AccountSummary (Maybe Text)
assId = lens _assId (\ s a -> s{_assId = a})

instance FromJSON AccountSummary where
        parseJSON
          = withObject "AccountSummary"
              (\ o ->
                 AccountSummary' <$>
                   (o .:? "kind" .!= "analytics#accountSummary") <*>
                     (o .:? "webProperties" .!= mempty)
                     <*> (o .:? "name")
                     <*> (o .:? "starred")
                     <*> (o .:? "id"))

instance ToJSON AccountSummary where
        toJSON AccountSummary'{..}
          = object
              (catMaybes
                 [Just ("kind" .= _assKind),
                  ("webProperties" .=) <$> _assWebProperties,
                  ("name" .=) <$> _assName,
                  ("starred" .=) <$> _assStarred,
                  ("id" .=) <$> _assId])

-- | Real time data request query parameters.
--
-- /See:/ 'realtimeDataQuery' smart constructor.
data RealtimeDataQuery =
  RealtimeDataQuery'
    { _rdqMetrics :: !(Maybe [Text])
    , _rdqFilters :: !(Maybe Text)
    , _rdqIds :: !(Maybe Text)
    , _rdqSort :: !(Maybe [Text])
    , _rdqDimensions :: !(Maybe Text)
    , _rdqMaxResults :: !(Maybe (Textual Int32))
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'RealtimeDataQuery' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'rdqMetrics'
--
-- * 'rdqFilters'
--
-- * 'rdqIds'
--
-- * 'rdqSort'
--
-- * 'rdqDimensions'
--
-- * 'rdqMaxResults'
realtimeDataQuery
    :: RealtimeDataQuery
realtimeDataQuery =
  RealtimeDataQuery'
    { _rdqMetrics = Nothing
    , _rdqFilters = Nothing
    , _rdqIds = Nothing
    , _rdqSort = Nothing
    , _rdqDimensions = Nothing
    , _rdqMaxResults = Nothing
    }


-- | List of real time metrics.
rdqMetrics :: Lens' RealtimeDataQuery [Text]
rdqMetrics
  = lens _rdqMetrics (\ s a -> s{_rdqMetrics = a}) .
      _Default
      . _Coerce

-- | Comma-separated list of dimension or metric filters.
rdqFilters :: Lens' RealtimeDataQuery (Maybe Text)
rdqFilters
  = lens _rdqFilters (\ s a -> s{_rdqFilters = a})

-- | Unique table ID.
rdqIds :: Lens' RealtimeDataQuery (Maybe Text)
rdqIds = lens _rdqIds (\ s a -> s{_rdqIds = a})

-- | List of dimensions or metrics based on which real time data is sorted.
rdqSort :: Lens' RealtimeDataQuery [Text]
rdqSort
  = lens _rdqSort (\ s a -> s{_rdqSort = a}) . _Default
      . _Coerce

-- | List of real time dimensions.
rdqDimensions :: Lens' RealtimeDataQuery (Maybe Text)
rdqDimensions
  = lens _rdqDimensions
      (\ s a -> s{_rdqDimensions = a})

-- | Maximum results per page.
rdqMaxResults :: Lens' RealtimeDataQuery (Maybe Int32)
rdqMaxResults
  = lens _rdqMaxResults
      (\ s a -> s{_rdqMaxResults = a})
      . mapping _Coerce

instance FromJSON RealtimeDataQuery where
        parseJSON
          = withObject "RealtimeDataQuery"
              (\ o ->
                 RealtimeDataQuery' <$>
                   (o .:? "metrics" .!= mempty) <*> (o .:? "filters")
                     <*> (o .:? "ids")
                     <*> (o .:? "sort" .!= mempty)
                     <*> (o .:? "dimensions")
                     <*> (o .:? "max-results"))

instance ToJSON RealtimeDataQuery where
        toJSON RealtimeDataQuery'{..}
          = object
              (catMaybes
                 [("metrics" .=) <$> _rdqMetrics,
                  ("filters" .=) <$> _rdqFilters,
                  ("ids" .=) <$> _rdqIds, ("sort" .=) <$> _rdqSort,
                  ("dimensions" .=) <$> _rdqDimensions,
                  ("max-results" .=) <$> _rdqMaxResults])

-- | Lists columns (dimensions and metrics) for a particular report type.
--
-- /See:/ 'columns' smart constructor.
data Columns =
  Columns'
    { _colEtag :: !(Maybe Text)
    , _colKind :: !Text
    , _colItems :: !(Maybe [Column])
    , _colTotalResults :: !(Maybe (Textual Int32))
    , _colAttributeNames :: !(Maybe [Text])
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'Columns' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'colEtag'
--
-- * 'colKind'
--
-- * 'colItems'
--
-- * 'colTotalResults'
--
-- * 'colAttributeNames'
columns
    :: Columns
columns =
  Columns'
    { _colEtag = Nothing
    , _colKind = "analytics#columns"
    , _colItems = Nothing
    , _colTotalResults = Nothing
    , _colAttributeNames = Nothing
    }


-- | Etag of collection. This etag can be compared with the last response
-- etag to check if response has changed.
colEtag :: Lens' Columns (Maybe Text)
colEtag = lens _colEtag (\ s a -> s{_colEtag = a})

-- | Collection type.
colKind :: Lens' Columns Text
colKind = lens _colKind (\ s a -> s{_colKind = a})

-- | List of columns for a report type.
colItems :: Lens' Columns [Column]
colItems
  = lens _colItems (\ s a -> s{_colItems = a}) .
      _Default
      . _Coerce

-- | Total number of columns returned in the response.
colTotalResults :: Lens' Columns (Maybe Int32)
colTotalResults
  = lens _colTotalResults
      (\ s a -> s{_colTotalResults = a})
      . mapping _Coerce

-- | List of attributes names returned by columns.
colAttributeNames :: Lens' Columns [Text]
colAttributeNames
  = lens _colAttributeNames
      (\ s a -> s{_colAttributeNames = a})
      . _Default
      . _Coerce

instance FromJSON Columns where
        parseJSON
          = withObject "Columns"
              (\ o ->
                 Columns' <$>
                   (o .:? "etag") <*>
                     (o .:? "kind" .!= "analytics#columns")
                     <*> (o .:? "items" .!= mempty)
                     <*> (o .:? "totalResults")
                     <*> (o .:? "attributeNames" .!= mempty))

instance ToJSON Columns where
        toJSON Columns'{..}
          = object
              (catMaybes
                 [("etag" .=) <$> _colEtag, Just ("kind" .= _colKind),
                  ("items" .=) <$> _colItems,
                  ("totalResults" .=) <$> _colTotalResults,
                  ("attributeNames" .=) <$> _colAttributeNames])

-- | Details for the filter of the type LOWER.
--
-- /See:/ 'filterLowercaseDetails' smart constructor.
data FilterLowercaseDetails =
  FilterLowercaseDetails'
    { _fldFieldIndex :: !(Maybe (Textual Int32))
    , _fldField :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'FilterLowercaseDetails' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'fldFieldIndex'
--
-- * 'fldField'
filterLowercaseDetails
    :: FilterLowercaseDetails
filterLowercaseDetails =
  FilterLowercaseDetails' {_fldFieldIndex = Nothing, _fldField = Nothing}


-- | The Index of the custom dimension. Required if field is a
-- CUSTOM_DIMENSION.
fldFieldIndex :: Lens' FilterLowercaseDetails (Maybe Int32)
fldFieldIndex
  = lens _fldFieldIndex
      (\ s a -> s{_fldFieldIndex = a})
      . mapping _Coerce

-- | Field to use in the filter.
fldField :: Lens' FilterLowercaseDetails (Maybe Text)
fldField = lens _fldField (\ s a -> s{_fldField = a})

instance FromJSON FilterLowercaseDetails where
        parseJSON
          = withObject "FilterLowercaseDetails"
              (\ o ->
                 FilterLowercaseDetails' <$>
                   (o .:? "fieldIndex") <*> (o .:? "field"))

instance ToJSON FilterLowercaseDetails where
        toJSON FilterLowercaseDetails'{..}
          = object
              (catMaybes
                 [("fieldIndex" .=) <$> _fldFieldIndex,
                  ("field" .=) <$> _fldField])

-- | JSON template for an Analytics account filter.
--
-- /See:/ 'filter'' smart constructor.
data Filter =
  Filter'
    { _filParentLink :: !(Maybe FilterParentLink)
    , _filAdvancedDetails :: !(Maybe FilterAdvancedDetails)
    , _filUppercaseDetails :: !(Maybe FilterUppercaseDetails)
    , _filLowercaseDetails :: !(Maybe FilterLowercaseDetails)
    , _filKind :: !Text
    , _filCreated :: !(Maybe DateTime')
    , _filIncludeDetails :: !(Maybe FilterExpression)
    , _filExcludeDetails :: !(Maybe FilterExpression)
    , _filSelfLink :: !(Maybe Text)
    , _filAccountId :: !(Maybe Text)
    , _filName :: !(Maybe Text)
    , _filId :: !(Maybe Text)
    , _filUpdated :: !(Maybe DateTime')
    , _filType :: !(Maybe Text)
    , _filSearchAndReplaceDetails :: !(Maybe FilterSearchAndReplaceDetails)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'Filter' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'filParentLink'
--
-- * 'filAdvancedDetails'
--
-- * 'filUppercaseDetails'
--
-- * 'filLowercaseDetails'
--
-- * 'filKind'
--
-- * 'filCreated'
--
-- * 'filIncludeDetails'
--
-- * 'filExcludeDetails'
--
-- * 'filSelfLink'
--
-- * 'filAccountId'
--
-- * 'filName'
--
-- * 'filId'
--
-- * 'filUpdated'
--
-- * 'filType'
--
-- * 'filSearchAndReplaceDetails'
filter'
    :: Filter
filter' =
  Filter'
    { _filParentLink = Nothing
    , _filAdvancedDetails = Nothing
    , _filUppercaseDetails = Nothing
    , _filLowercaseDetails = Nothing
    , _filKind = "analytics#filter"
    , _filCreated = Nothing
    , _filIncludeDetails = Nothing
    , _filExcludeDetails = Nothing
    , _filSelfLink = Nothing
    , _filAccountId = Nothing
    , _filName = Nothing
    , _filId = Nothing
    , _filUpdated = Nothing
    , _filType = Nothing
    , _filSearchAndReplaceDetails = Nothing
    }


-- | Parent link for this filter. Points to the account to which this filter
-- belongs.
filParentLink :: Lens' Filter (Maybe FilterParentLink)
filParentLink
  = lens _filParentLink
      (\ s a -> s{_filParentLink = a})

-- | Details for the filter of the type ADVANCED.
filAdvancedDetails :: Lens' Filter (Maybe FilterAdvancedDetails)
filAdvancedDetails
  = lens _filAdvancedDetails
      (\ s a -> s{_filAdvancedDetails = a})

-- | Details for the filter of the type UPPER.
filUppercaseDetails :: Lens' Filter (Maybe FilterUppercaseDetails)
filUppercaseDetails
  = lens _filUppercaseDetails
      (\ s a -> s{_filUppercaseDetails = a})

-- | Details for the filter of the type LOWER.
filLowercaseDetails :: Lens' Filter (Maybe FilterLowercaseDetails)
filLowercaseDetails
  = lens _filLowercaseDetails
      (\ s a -> s{_filLowercaseDetails = a})

-- | Resource type for Analytics filter.
filKind :: Lens' Filter Text
filKind = lens _filKind (\ s a -> s{_filKind = a})

-- | Time this filter was created.
filCreated :: Lens' Filter (Maybe UTCTime)
filCreated
  = lens _filCreated (\ s a -> s{_filCreated = a}) .
      mapping _DateTime

-- | Details for the filter of the type INCLUDE.
filIncludeDetails :: Lens' Filter (Maybe FilterExpression)
filIncludeDetails
  = lens _filIncludeDetails
      (\ s a -> s{_filIncludeDetails = a})

-- | Details for the filter of the type EXCLUDE.
filExcludeDetails :: Lens' Filter (Maybe FilterExpression)
filExcludeDetails
  = lens _filExcludeDetails
      (\ s a -> s{_filExcludeDetails = a})

-- | Link for this filter.
filSelfLink :: Lens' Filter (Maybe Text)
filSelfLink
  = lens _filSelfLink (\ s a -> s{_filSelfLink = a})

-- | Account ID to which this filter belongs.
filAccountId :: Lens' Filter (Maybe Text)
filAccountId
  = lens _filAccountId (\ s a -> s{_filAccountId = a})

-- | Name of this filter.
filName :: Lens' Filter (Maybe Text)
filName = lens _filName (\ s a -> s{_filName = a})

-- | Filter ID.
filId :: Lens' Filter (Maybe Text)
filId = lens _filId (\ s a -> s{_filId = a})

-- | Time this filter was last modified.
filUpdated :: Lens' Filter (Maybe UTCTime)
filUpdated
  = lens _filUpdated (\ s a -> s{_filUpdated = a}) .
      mapping _DateTime

-- | Type of this filter. Possible values are INCLUDE, EXCLUDE, LOWERCASE,
-- UPPERCASE, SEARCH_AND_REPLACE and ADVANCED.
filType :: Lens' Filter (Maybe Text)
filType = lens _filType (\ s a -> s{_filType = a})

-- | Details for the filter of the type SEARCH_AND_REPLACE.
filSearchAndReplaceDetails :: Lens' Filter (Maybe FilterSearchAndReplaceDetails)
filSearchAndReplaceDetails
  = lens _filSearchAndReplaceDetails
      (\ s a -> s{_filSearchAndReplaceDetails = a})

instance FromJSON Filter where
        parseJSON
          = withObject "Filter"
              (\ o ->
                 Filter' <$>
                   (o .:? "parentLink") <*> (o .:? "advancedDetails")
                     <*> (o .:? "uppercaseDetails")
                     <*> (o .:? "lowercaseDetails")
                     <*> (o .:? "kind" .!= "analytics#filter")
                     <*> (o .:? "created")
                     <*> (o .:? "includeDetails")
                     <*> (o .:? "excludeDetails")
                     <*> (o .:? "selfLink")
                     <*> (o .:? "accountId")
                     <*> (o .:? "name")
                     <*> (o .:? "id")
                     <*> (o .:? "updated")
                     <*> (o .:? "type")
                     <*> (o .:? "searchAndReplaceDetails"))

instance ToJSON Filter where
        toJSON Filter'{..}
          = object
              (catMaybes
                 [("parentLink" .=) <$> _filParentLink,
                  ("advancedDetails" .=) <$> _filAdvancedDetails,
                  ("uppercaseDetails" .=) <$> _filUppercaseDetails,
                  ("lowercaseDetails" .=) <$> _filLowercaseDetails,
                  Just ("kind" .= _filKind),
                  ("created" .=) <$> _filCreated,
                  ("includeDetails" .=) <$> _filIncludeDetails,
                  ("excludeDetails" .=) <$> _filExcludeDetails,
                  ("selfLink" .=) <$> _filSelfLink,
                  ("accountId" .=) <$> _filAccountId,
                  ("name" .=) <$> _filName, ("id" .=) <$> _filId,
                  ("updated" .=) <$> _filUpdated,
                  ("type" .=) <$> _filType,
                  ("searchAndReplaceDetails" .=) <$>
                    _filSearchAndReplaceDetails])

-- | 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:/ 'uploads' smart constructor.
data Uploads =
  Uploads'
    { _uplNextLink :: !(Maybe Text)
    , _uplItemsPerPage :: !(Maybe (Textual Int32))
    , _uplKind :: !Text
    , _uplItems :: !(Maybe [Upload])
    , _uplTotalResults :: !(Maybe (Textual Int32))
    , _uplStartIndex :: !(Maybe (Textual Int32))
    , _uplPreviousLink :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'Uploads' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'uplNextLink'
--
-- * 'uplItemsPerPage'
--
-- * 'uplKind'
--
-- * 'uplItems'
--
-- * 'uplTotalResults'
--
-- * 'uplStartIndex'
--
-- * 'uplPreviousLink'
uploads
    :: Uploads
uploads =
  Uploads'
    { _uplNextLink = Nothing
    , _uplItemsPerPage = Nothing
    , _uplKind = "analytics#uploads"
    , _uplItems = Nothing
    , _uplTotalResults = Nothing
    , _uplStartIndex = Nothing
    , _uplPreviousLink = Nothing
    }


-- | Link to next page for this upload collection.
uplNextLink :: Lens' Uploads (Maybe Text)
uplNextLink
  = lens _uplNextLink (\ s a -> s{_uplNextLink = a})

-- | 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.
uplItemsPerPage :: Lens' Uploads (Maybe Int32)
uplItemsPerPage
  = lens _uplItemsPerPage
      (\ s a -> s{_uplItemsPerPage = a})
      . mapping _Coerce

-- | Collection type.
uplKind :: Lens' Uploads Text
uplKind = lens _uplKind (\ s a -> s{_uplKind = a})

-- | A list of uploads.
uplItems :: Lens' Uploads [Upload]
uplItems
  = lens _uplItems (\ s a -> s{_uplItems = a}) .
      _Default
      . _Coerce

-- | The total number of results for the query, regardless of the number of
-- resources in the result.
uplTotalResults :: Lens' Uploads (Maybe Int32)
uplTotalResults
  = lens _uplTotalResults
      (\ s a -> s{_uplTotalResults = a})
      . mapping _Coerce

-- | The starting index of the resources, which is 1 by default or otherwise
-- specified by the start-index query parameter.
uplStartIndex :: Lens' Uploads (Maybe Int32)
uplStartIndex
  = lens _uplStartIndex
      (\ s a -> s{_uplStartIndex = a})
      . mapping _Coerce

-- | Link to previous page for this upload collection.
uplPreviousLink :: Lens' Uploads (Maybe Text)
uplPreviousLink
  = lens _uplPreviousLink
      (\ s a -> s{_uplPreviousLink = a})

instance FromJSON Uploads where
        parseJSON
          = withObject "Uploads"
              (\ o ->
                 Uploads' <$>
                   (o .:? "nextLink") <*> (o .:? "itemsPerPage") <*>
                     (o .:? "kind" .!= "analytics#uploads")
                     <*> (o .:? "items" .!= mempty)
                     <*> (o .:? "totalResults")
                     <*> (o .:? "startIndex")
                     <*> (o .:? "previousLink"))

instance ToJSON Uploads where
        toJSON Uploads'{..}
          = object
              (catMaybes
                 [("nextLink" .=) <$> _uplNextLink,
                  ("itemsPerPage" .=) <$> _uplItemsPerPage,
                  Just ("kind" .= _uplKind),
                  ("items" .=) <$> _uplItems,
                  ("totalResults" .=) <$> _uplTotalResults,
                  ("startIndex" .=) <$> _uplStartIndex,
                  ("previousLink" .=) <$> _uplPreviousLink])

-- | 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:/ 'customDimensions' smart constructor.
data CustomDimensions =
  CustomDimensions'
    { _cdNextLink :: !(Maybe Text)
    , _cdItemsPerPage :: !(Maybe (Textual Int32))
    , _cdKind :: !Text
    , _cdUsername :: !(Maybe Text)
    , _cdItems :: !(Maybe [CustomDimension])
    , _cdTotalResults :: !(Maybe (Textual Int32))
    , _cdStartIndex :: !(Maybe (Textual Int32))
    , _cdPreviousLink :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'CustomDimensions' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'cdNextLink'
--
-- * 'cdItemsPerPage'
--
-- * 'cdKind'
--
-- * 'cdUsername'
--
-- * 'cdItems'
--
-- * 'cdTotalResults'
--
-- * 'cdStartIndex'
--
-- * 'cdPreviousLink'
customDimensions
    :: CustomDimensions
customDimensions =
  CustomDimensions'
    { _cdNextLink = Nothing
    , _cdItemsPerPage = Nothing
    , _cdKind = "analytics#customDimensions"
    , _cdUsername = Nothing
    , _cdItems = Nothing
    , _cdTotalResults = Nothing
    , _cdStartIndex = Nothing
    , _cdPreviousLink = Nothing
    }


-- | Link to next page for this custom dimension collection.
cdNextLink :: Lens' CustomDimensions (Maybe Text)
cdNextLink
  = lens _cdNextLink (\ s a -> s{_cdNextLink = a})

-- | 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.
cdItemsPerPage :: Lens' CustomDimensions (Maybe Int32)
cdItemsPerPage
  = lens _cdItemsPerPage
      (\ s a -> s{_cdItemsPerPage = a})
      . mapping _Coerce

-- | Collection type.
cdKind :: Lens' CustomDimensions Text
cdKind = lens _cdKind (\ s a -> s{_cdKind = a})

-- | Email ID of the authenticated user
cdUsername :: Lens' CustomDimensions (Maybe Text)
cdUsername
  = lens _cdUsername (\ s a -> s{_cdUsername = a})

-- | Collection of custom dimensions.
cdItems :: Lens' CustomDimensions [CustomDimension]
cdItems
  = lens _cdItems (\ s a -> s{_cdItems = a}) . _Default
      . _Coerce

-- | The total number of results for the query, regardless of the number of
-- results in the response.
cdTotalResults :: Lens' CustomDimensions (Maybe Int32)
cdTotalResults
  = lens _cdTotalResults
      (\ s a -> s{_cdTotalResults = a})
      . mapping _Coerce

-- | The starting index of the resources, which is 1 by default or otherwise
-- specified by the start-index query parameter.
cdStartIndex :: Lens' CustomDimensions (Maybe Int32)
cdStartIndex
  = lens _cdStartIndex (\ s a -> s{_cdStartIndex = a})
      . mapping _Coerce

-- | Link to previous page for this custom dimension collection.
cdPreviousLink :: Lens' CustomDimensions (Maybe Text)
cdPreviousLink
  = lens _cdPreviousLink
      (\ s a -> s{_cdPreviousLink = a})

instance FromJSON CustomDimensions where
        parseJSON
          = withObject "CustomDimensions"
              (\ o ->
                 CustomDimensions' <$>
                   (o .:? "nextLink") <*> (o .:? "itemsPerPage") <*>
                     (o .:? "kind" .!= "analytics#customDimensions")
                     <*> (o .:? "username")
                     <*> (o .:? "items" .!= mempty)
                     <*> (o .:? "totalResults")
                     <*> (o .:? "startIndex")
                     <*> (o .:? "previousLink"))

instance ToJSON CustomDimensions where
        toJSON CustomDimensions'{..}
          = object
              (catMaybes
                 [("nextLink" .=) <$> _cdNextLink,
                  ("itemsPerPage" .=) <$> _cdItemsPerPage,
                  Just ("kind" .= _cdKind),
                  ("username" .=) <$> _cdUsername,
                  ("items" .=) <$> _cdItems,
                  ("totalResults" .=) <$> _cdTotalResults,
                  ("startIndex" .=) <$> _cdStartIndex,
                  ("previousLink" .=) <$> _cdPreviousLink])

-- | An segment collection lists Analytics segments that the user has access
-- to. Each resource in the collection corresponds to a single Analytics
-- segment.
--
-- /See:/ 'segments' smart constructor.
data Segments =
  Segments'
    { _sNextLink :: !(Maybe Text)
    , _sItemsPerPage :: !(Maybe (Textual Int32))
    , _sKind :: !Text
    , _sUsername :: !(Maybe Text)
    , _sItems :: !(Maybe [Segment])
    , _sTotalResults :: !(Maybe (Textual Int32))
    , _sStartIndex :: !(Maybe (Textual Int32))
    , _sPreviousLink :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'Segments' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'sNextLink'
--
-- * 'sItemsPerPage'
--
-- * 'sKind'
--
-- * 'sUsername'
--
-- * 'sItems'
--
-- * 'sTotalResults'
--
-- * 'sStartIndex'
--
-- * 'sPreviousLink'
segments
    :: Segments
segments =
  Segments'
    { _sNextLink = Nothing
    , _sItemsPerPage = Nothing
    , _sKind = "analytics#segments"
    , _sUsername = Nothing
    , _sItems = Nothing
    , _sTotalResults = Nothing
    , _sStartIndex = Nothing
    , _sPreviousLink = Nothing
    }


-- | Link to next page for this segment collection.
sNextLink :: Lens' Segments (Maybe Text)
sNextLink
  = lens _sNextLink (\ s a -> s{_sNextLink = a})

-- | 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.
sItemsPerPage :: Lens' Segments (Maybe Int32)
sItemsPerPage
  = lens _sItemsPerPage
      (\ s a -> s{_sItemsPerPage = a})
      . mapping _Coerce

-- | Collection type for segments.
sKind :: Lens' Segments Text
sKind = lens _sKind (\ s a -> s{_sKind = a})

-- | Email ID of the authenticated user
sUsername :: Lens' Segments (Maybe Text)
sUsername
  = lens _sUsername (\ s a -> s{_sUsername = a})

-- | A list of segments.
sItems :: Lens' Segments [Segment]
sItems
  = lens _sItems (\ s a -> s{_sItems = a}) . _Default .
      _Coerce

-- | The total number of results for the query, regardless of the number of
-- results in the response.
sTotalResults :: Lens' Segments (Maybe Int32)
sTotalResults
  = lens _sTotalResults
      (\ s a -> s{_sTotalResults = a})
      . mapping _Coerce

-- | The starting index of the resources, which is 1 by default or otherwise
-- specified by the start-index query parameter.
sStartIndex :: Lens' Segments (Maybe Int32)
sStartIndex
  = lens _sStartIndex (\ s a -> s{_sStartIndex = a}) .
      mapping _Coerce

-- | Link to previous page for this segment collection.
sPreviousLink :: Lens' Segments (Maybe Text)
sPreviousLink
  = lens _sPreviousLink
      (\ s a -> s{_sPreviousLink = a})

instance FromJSON Segments where
        parseJSON
          = withObject "Segments"
              (\ o ->
                 Segments' <$>
                   (o .:? "nextLink") <*> (o .:? "itemsPerPage") <*>
                     (o .:? "kind" .!= "analytics#segments")
                     <*> (o .:? "username")
                     <*> (o .:? "items" .!= mempty)
                     <*> (o .:? "totalResults")
                     <*> (o .:? "startIndex")
                     <*> (o .:? "previousLink"))

instance ToJSON Segments where
        toJSON Segments'{..}
          = object
              (catMaybes
                 [("nextLink" .=) <$> _sNextLink,
                  ("itemsPerPage" .=) <$> _sItemsPerPage,
                  Just ("kind" .= _sKind),
                  ("username" .=) <$> _sUsername,
                  ("items" .=) <$> _sItems,
                  ("totalResults" .=) <$> _sTotalResults,
                  ("startIndex" .=) <$> _sStartIndex,
                  ("previousLink" .=) <$> _sPreviousLink])

--
-- /See:/ 'gaDataDataTable' smart constructor.
data GaDataDataTable =
  GaDataDataTable'
    { _gddtCols :: !(Maybe [GaDataDataTableColsItem])
    , _gddtRows :: !(Maybe [GaDataDataTableRowsItem])
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'GaDataDataTable' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'gddtCols'
--
-- * 'gddtRows'
gaDataDataTable
    :: GaDataDataTable
gaDataDataTable = GaDataDataTable' {_gddtCols = Nothing, _gddtRows = Nothing}


gddtCols :: Lens' GaDataDataTable [GaDataDataTableColsItem]
gddtCols
  = lens _gddtCols (\ s a -> s{_gddtCols = a}) .
      _Default
      . _Coerce

gddtRows :: Lens' GaDataDataTable [GaDataDataTableRowsItem]
gddtRows
  = lens _gddtRows (\ s a -> s{_gddtRows = a}) .
      _Default
      . _Coerce

instance FromJSON GaDataDataTable where
        parseJSON
          = withObject "GaDataDataTable"
              (\ o ->
                 GaDataDataTable' <$>
                   (o .:? "cols" .!= mempty) <*>
                     (o .:? "rows" .!= mempty))

instance ToJSON GaDataDataTable where
        toJSON GaDataDataTable'{..}
          = object
              (catMaybes
                 [("cols" .=) <$> _gddtCols,
                  ("rows" .=) <$> _gddtRows])

-- | Web property being linked.
--
-- /See:/ 'entityAdWordsLinkEntity' smart constructor.
newtype EntityAdWordsLinkEntity =
  EntityAdWordsLinkEntity'
    { _eawleWebPropertyRef :: Maybe WebPropertyRef
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'EntityAdWordsLinkEntity' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'eawleWebPropertyRef'
entityAdWordsLinkEntity
    :: EntityAdWordsLinkEntity
entityAdWordsLinkEntity =
  EntityAdWordsLinkEntity' {_eawleWebPropertyRef = Nothing}


eawleWebPropertyRef :: Lens' EntityAdWordsLinkEntity (Maybe WebPropertyRef)
eawleWebPropertyRef
  = lens _eawleWebPropertyRef
      (\ s a -> s{_eawleWebPropertyRef = a})

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

instance ToJSON EntityAdWordsLinkEntity where
        toJSON EntityAdWordsLinkEntity'{..}
          = object
              (catMaybes
                 [("webPropertyRef" .=) <$> _eawleWebPropertyRef])

-- | A state based audience definition that will cause a user to be added or
-- removed from an audience.
--
-- /See:/ 'remarketingAudienceStateBasedAudienceDefinition' smart constructor.
data RemarketingAudienceStateBasedAudienceDefinition =
  RemarketingAudienceStateBasedAudienceDefinition'
    { _rasbadExcludeConditions :: !(Maybe RemarketingAudienceStateBasedAudienceDefinitionExcludeConditions)
    , _rasbadIncludeConditions :: !(Maybe IncludeConditions)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'RemarketingAudienceStateBasedAudienceDefinition' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'rasbadExcludeConditions'
--
-- * 'rasbadIncludeConditions'
remarketingAudienceStateBasedAudienceDefinition
    :: RemarketingAudienceStateBasedAudienceDefinition
remarketingAudienceStateBasedAudienceDefinition =
  RemarketingAudienceStateBasedAudienceDefinition'
    {_rasbadExcludeConditions = Nothing, _rasbadIncludeConditions = Nothing}


-- | Defines the conditions to exclude users from the audience.
rasbadExcludeConditions :: Lens' RemarketingAudienceStateBasedAudienceDefinition (Maybe RemarketingAudienceStateBasedAudienceDefinitionExcludeConditions)
rasbadExcludeConditions
  = lens _rasbadExcludeConditions
      (\ s a -> s{_rasbadExcludeConditions = a})

-- | Defines the conditions to include users to the audience.
rasbadIncludeConditions :: Lens' RemarketingAudienceStateBasedAudienceDefinition (Maybe IncludeConditions)
rasbadIncludeConditions
  = lens _rasbadIncludeConditions
      (\ s a -> s{_rasbadIncludeConditions = a})

instance FromJSON
           RemarketingAudienceStateBasedAudienceDefinition
         where
        parseJSON
          = withObject
              "RemarketingAudienceStateBasedAudienceDefinition"
              (\ o ->
                 RemarketingAudienceStateBasedAudienceDefinition' <$>
                   (o .:? "excludeConditions") <*>
                     (o .:? "includeConditions"))

instance ToJSON
           RemarketingAudienceStateBasedAudienceDefinition
         where
        toJSON
          RemarketingAudienceStateBasedAudienceDefinition'{..}
          = object
              (catMaybes
                 [("excludeConditions" .=) <$>
                    _rasbadExcludeConditions,
                  ("includeConditions" .=) <$>
                    _rasbadIncludeConditions])

-- | Details for the goal of the type URL_DESTINATION.
--
-- /See:/ 'goalURLDestinationDetails' smart constructor.
data GoalURLDestinationDetails =
  GoalURLDestinationDetails'
    { _guddURL :: !(Maybe Text)
    , _guddMatchType :: !(Maybe Text)
    , _guddSteps :: !(Maybe [GoalURLDestinationDetailsStepsItem])
    , _guddCaseSensitive :: !(Maybe Bool)
    , _guddFirstStepRequired :: !(Maybe Bool)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'GoalURLDestinationDetails' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'guddURL'
--
-- * 'guddMatchType'
--
-- * 'guddSteps'
--
-- * 'guddCaseSensitive'
--
-- * 'guddFirstStepRequired'
goalURLDestinationDetails
    :: GoalURLDestinationDetails
goalURLDestinationDetails =
  GoalURLDestinationDetails'
    { _guddURL = Nothing
    , _guddMatchType = Nothing
    , _guddSteps = Nothing
    , _guddCaseSensitive = Nothing
    , _guddFirstStepRequired = Nothing
    }


-- | URL for this goal.
guddURL :: Lens' GoalURLDestinationDetails (Maybe Text)
guddURL = lens _guddURL (\ s a -> s{_guddURL = a})

-- | Match type for the goal URL. Possible values are HEAD, EXACT, or REGEX.
guddMatchType :: Lens' GoalURLDestinationDetails (Maybe Text)
guddMatchType
  = lens _guddMatchType
      (\ s a -> s{_guddMatchType = a})

-- | List of steps configured for this goal funnel.
guddSteps :: Lens' GoalURLDestinationDetails [GoalURLDestinationDetailsStepsItem]
guddSteps
  = lens _guddSteps (\ s a -> s{_guddSteps = a}) .
      _Default
      . _Coerce

-- | Determines if the goal URL must exactly match the capitalization of
-- visited URLs.
guddCaseSensitive :: Lens' GoalURLDestinationDetails (Maybe Bool)
guddCaseSensitive
  = lens _guddCaseSensitive
      (\ s a -> s{_guddCaseSensitive = a})

-- | Determines if the first step in this goal is required.
guddFirstStepRequired :: Lens' GoalURLDestinationDetails (Maybe Bool)
guddFirstStepRequired
  = lens _guddFirstStepRequired
      (\ s a -> s{_guddFirstStepRequired = a})

instance FromJSON GoalURLDestinationDetails where
        parseJSON
          = withObject "GoalURLDestinationDetails"
              (\ o ->
                 GoalURLDestinationDetails' <$>
                   (o .:? "url") <*> (o .:? "matchType") <*>
                     (o .:? "steps" .!= mempty)
                     <*> (o .:? "caseSensitive")
                     <*> (o .:? "firstStepRequired"))

instance ToJSON GoalURLDestinationDetails where
        toJSON GoalURLDestinationDetails'{..}
          = object
              (catMaybes
                 [("url" .=) <$> _guddURL,
                  ("matchType" .=) <$> _guddMatchType,
                  ("steps" .=) <$> _guddSteps,
                  ("caseSensitive" .=) <$> _guddCaseSensitive,
                  ("firstStepRequired" .=) <$> _guddFirstStepRequired])

-- | 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:/ 'proFileFilterLinks' smart constructor.
data ProFileFilterLinks =
  ProFileFilterLinks'
    { _pfflNextLink :: !(Maybe Text)
    , _pfflItemsPerPage :: !(Maybe (Textual Int32))
    , _pfflKind :: !Text
    , _pfflUsername :: !(Maybe Text)
    , _pfflItems :: !(Maybe [ProFileFilterLink])
    , _pfflTotalResults :: !(Maybe (Textual Int32))
    , _pfflStartIndex :: !(Maybe (Textual Int32))
    , _pfflPreviousLink :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'ProFileFilterLinks' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'pfflNextLink'
--
-- * 'pfflItemsPerPage'
--
-- * 'pfflKind'
--
-- * 'pfflUsername'
--
-- * 'pfflItems'
--
-- * 'pfflTotalResults'
--
-- * 'pfflStartIndex'
--
-- * 'pfflPreviousLink'
proFileFilterLinks
    :: ProFileFilterLinks
proFileFilterLinks =
  ProFileFilterLinks'
    { _pfflNextLink = Nothing
    , _pfflItemsPerPage = Nothing
    , _pfflKind = "analytics#profileFilterLinks"
    , _pfflUsername = Nothing
    , _pfflItems = Nothing
    , _pfflTotalResults = Nothing
    , _pfflStartIndex = Nothing
    , _pfflPreviousLink = Nothing
    }


-- | Link to next page for this profile filter link collection.
pfflNextLink :: Lens' ProFileFilterLinks (Maybe Text)
pfflNextLink
  = lens _pfflNextLink (\ s a -> s{_pfflNextLink = a})

-- | 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.
pfflItemsPerPage :: Lens' ProFileFilterLinks (Maybe Int32)
pfflItemsPerPage
  = lens _pfflItemsPerPage
      (\ s a -> s{_pfflItemsPerPage = a})
      . mapping _Coerce

-- | Collection type.
pfflKind :: Lens' ProFileFilterLinks Text
pfflKind = lens _pfflKind (\ s a -> s{_pfflKind = a})

-- | Email ID of the authenticated user
pfflUsername :: Lens' ProFileFilterLinks (Maybe Text)
pfflUsername
  = lens _pfflUsername (\ s a -> s{_pfflUsername = a})

-- | A list of profile filter links.
pfflItems :: Lens' ProFileFilterLinks [ProFileFilterLink]
pfflItems
  = lens _pfflItems (\ s a -> s{_pfflItems = a}) .
      _Default
      . _Coerce

-- | The total number of results for the query, regardless of the number of
-- results in the response.
pfflTotalResults :: Lens' ProFileFilterLinks (Maybe Int32)
pfflTotalResults
  = lens _pfflTotalResults
      (\ s a -> s{_pfflTotalResults = a})
      . mapping _Coerce

-- | The starting index of the resources, which is 1 by default or otherwise
-- specified by the start-index query parameter.
pfflStartIndex :: Lens' ProFileFilterLinks (Maybe Int32)
pfflStartIndex
  = lens _pfflStartIndex
      (\ s a -> s{_pfflStartIndex = a})
      . mapping _Coerce

-- | Link to previous page for this profile filter link collection.
pfflPreviousLink :: Lens' ProFileFilterLinks (Maybe Text)
pfflPreviousLink
  = lens _pfflPreviousLink
      (\ s a -> s{_pfflPreviousLink = a})

instance FromJSON ProFileFilterLinks where
        parseJSON
          = withObject "ProFileFilterLinks"
              (\ o ->
                 ProFileFilterLinks' <$>
                   (o .:? "nextLink") <*> (o .:? "itemsPerPage") <*>
                     (o .:? "kind" .!= "analytics#profileFilterLinks")
                     <*> (o .:? "username")
                     <*> (o .:? "items" .!= mempty)
                     <*> (o .:? "totalResults")
                     <*> (o .:? "startIndex")
                     <*> (o .:? "previousLink"))

instance ToJSON ProFileFilterLinks where
        toJSON ProFileFilterLinks'{..}
          = object
              (catMaybes
                 [("nextLink" .=) <$> _pfflNextLink,
                  ("itemsPerPage" .=) <$> _pfflItemsPerPage,
                  Just ("kind" .= _pfflKind),
                  ("username" .=) <$> _pfflUsername,
                  ("items" .=) <$> _pfflItems,
                  ("totalResults" .=) <$> _pfflTotalResults,
                  ("startIndex" .=) <$> _pfflStartIndex,
                  ("previousLink" .=) <$> _pfflPreviousLink])

-- | Parent link for this web property. Points to the account to which this
-- web property belongs.
--
-- /See:/ 'webPropertyParentLink' smart constructor.
data WebPropertyParentLink =
  WebPropertyParentLink'
    { _wpplHref :: !(Maybe Text)
    , _wpplType :: !Text
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'WebPropertyParentLink' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'wpplHref'
--
-- * 'wpplType'
webPropertyParentLink
    :: WebPropertyParentLink
webPropertyParentLink =
  WebPropertyParentLink' {_wpplHref = Nothing, _wpplType = "analytics#account"}


-- | Link to the account for this web property.
wpplHref :: Lens' WebPropertyParentLink (Maybe Text)
wpplHref = lens _wpplHref (\ s a -> s{_wpplHref = a})

-- | Type of the parent link. Its value is \"analytics#account\".
wpplType :: Lens' WebPropertyParentLink Text
wpplType = lens _wpplType (\ s a -> s{_wpplType = a})

instance FromJSON WebPropertyParentLink where
        parseJSON
          = withObject "WebPropertyParentLink"
              (\ o ->
                 WebPropertyParentLink' <$>
                   (o .:? "href") <*>
                     (o .:? "type" .!= "analytics#account"))

instance ToJSON WebPropertyParentLink where
        toJSON WebPropertyParentLink'{..}
          = object
              (catMaybes
                 [("href" .=) <$> _wpplHref,
                  Just ("type" .= _wpplType)])

-- | Information for the view (profile), for which the Analytics data was
-- requested.
--
-- /See:/ 'gaDataProFileInfo' smart constructor.
data GaDataProFileInfo =
  GaDataProFileInfo'
    { _gdpfiWebPropertyId :: !(Maybe Text)
    , _gdpfiProFileId :: !(Maybe Text)
    , _gdpfiProFileName :: !(Maybe Text)
    , _gdpfiAccountId :: !(Maybe Text)
    , _gdpfiInternalWebPropertyId :: !(Maybe Text)
    , _gdpfiTableId :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'GaDataProFileInfo' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'gdpfiWebPropertyId'
--
-- * 'gdpfiProFileId'
--
-- * 'gdpfiProFileName'
--
-- * 'gdpfiAccountId'
--
-- * 'gdpfiInternalWebPropertyId'
--
-- * 'gdpfiTableId'
gaDataProFileInfo
    :: GaDataProFileInfo
gaDataProFileInfo =
  GaDataProFileInfo'
    { _gdpfiWebPropertyId = Nothing
    , _gdpfiProFileId = Nothing
    , _gdpfiProFileName = Nothing
    , _gdpfiAccountId = Nothing
    , _gdpfiInternalWebPropertyId = Nothing
    , _gdpfiTableId = Nothing
    }


-- | Web Property ID to which this view (profile) belongs.
gdpfiWebPropertyId :: Lens' GaDataProFileInfo (Maybe Text)
gdpfiWebPropertyId
  = lens _gdpfiWebPropertyId
      (\ s a -> s{_gdpfiWebPropertyId = a})

-- | View (Profile) ID.
gdpfiProFileId :: Lens' GaDataProFileInfo (Maybe Text)
gdpfiProFileId
  = lens _gdpfiProFileId
      (\ s a -> s{_gdpfiProFileId = a})

-- | View (Profile) name.
gdpfiProFileName :: Lens' GaDataProFileInfo (Maybe Text)
gdpfiProFileName
  = lens _gdpfiProFileName
      (\ s a -> s{_gdpfiProFileName = a})

-- | Account ID to which this view (profile) belongs.
gdpfiAccountId :: Lens' GaDataProFileInfo (Maybe Text)
gdpfiAccountId
  = lens _gdpfiAccountId
      (\ s a -> s{_gdpfiAccountId = a})

-- | Internal ID for the web property to which this view (profile) belongs.
gdpfiInternalWebPropertyId :: Lens' GaDataProFileInfo (Maybe Text)
gdpfiInternalWebPropertyId
  = lens _gdpfiInternalWebPropertyId
      (\ s a -> s{_gdpfiInternalWebPropertyId = a})

-- | Table ID for view (profile).
gdpfiTableId :: Lens' GaDataProFileInfo (Maybe Text)
gdpfiTableId
  = lens _gdpfiTableId (\ s a -> s{_gdpfiTableId = a})

instance FromJSON GaDataProFileInfo where
        parseJSON
          = withObject "GaDataProFileInfo"
              (\ o ->
                 GaDataProFileInfo' <$>
                   (o .:? "webPropertyId") <*> (o .:? "profileId") <*>
                     (o .:? "profileName")
                     <*> (o .:? "accountId")
                     <*> (o .:? "internalWebPropertyId")
                     <*> (o .:? "tableId"))

instance ToJSON GaDataProFileInfo where
        toJSON GaDataProFileInfo'{..}
          = object
              (catMaybes
                 [("webPropertyId" .=) <$> _gdpfiWebPropertyId,
                  ("profileId" .=) <$> _gdpfiProFileId,
                  ("profileName" .=) <$> _gdpfiProFileName,
                  ("accountId" .=) <$> _gdpfiAccountId,
                  ("internalWebPropertyId" .=) <$>
                    _gdpfiInternalWebPropertyId,
                  ("tableId" .=) <$> _gdpfiTableId])

-- | Metadata returned for an upload operation.
--
-- /See:/ 'upload' smart constructor.
data Upload =
  Upload'
    { _uuStatus :: !(Maybe Text)
    , _uuKind :: !Text
    , _uuCustomDataSourceId :: !(Maybe Text)
    , _uuUploadTime :: !(Maybe DateTime')
    , _uuAccountId :: !(Maybe (Textual Int64))
    , _uuId :: !(Maybe Text)
    , _uuErrors :: !(Maybe [Text])
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'Upload' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'uuStatus'
--
-- * 'uuKind'
--
-- * 'uuCustomDataSourceId'
--
-- * 'uuUploadTime'
--
-- * 'uuAccountId'
--
-- * 'uuId'
--
-- * 'uuErrors'
upload
    :: Upload
upload =
  Upload'
    { _uuStatus = Nothing
    , _uuKind = "analytics#upload"
    , _uuCustomDataSourceId = Nothing
    , _uuUploadTime = Nothing
    , _uuAccountId = Nothing
    , _uuId = Nothing
    , _uuErrors = Nothing
    }


-- | Upload status. Possible values: PENDING, COMPLETED, FAILED, DELETING,
-- DELETED.
uuStatus :: Lens' Upload (Maybe Text)
uuStatus = lens _uuStatus (\ s a -> s{_uuStatus = a})

-- | Resource type for Analytics upload.
uuKind :: Lens' Upload Text
uuKind = lens _uuKind (\ s a -> s{_uuKind = a})

-- | Custom data source Id to which this data import belongs.
uuCustomDataSourceId :: Lens' Upload (Maybe Text)
uuCustomDataSourceId
  = lens _uuCustomDataSourceId
      (\ s a -> s{_uuCustomDataSourceId = a})

-- | Time this file is uploaded.
uuUploadTime :: Lens' Upload (Maybe UTCTime)
uuUploadTime
  = lens _uuUploadTime (\ s a -> s{_uuUploadTime = a})
      . mapping _DateTime

-- | Account Id to which this upload belongs.
uuAccountId :: Lens' Upload (Maybe Int64)
uuAccountId
  = lens _uuAccountId (\ s a -> s{_uuAccountId = a}) .
      mapping _Coerce

-- | A unique ID for this upload.
uuId :: Lens' Upload (Maybe Text)
uuId = lens _uuId (\ s a -> s{_uuId = a})

-- | Data import errors collection.
uuErrors :: Lens' Upload [Text]
uuErrors
  = lens _uuErrors (\ s a -> s{_uuErrors = a}) .
      _Default
      . _Coerce

instance FromJSON Upload where
        parseJSON
          = withObject "Upload"
              (\ o ->
                 Upload' <$>
                   (o .:? "status") <*>
                     (o .:? "kind" .!= "analytics#upload")
                     <*> (o .:? "customDataSourceId")
                     <*> (o .:? "uploadTime")
                     <*> (o .:? "accountId")
                     <*> (o .:? "id")
                     <*> (o .:? "errors" .!= mempty))

instance ToJSON Upload where
        toJSON Upload'{..}
          = object
              (catMaybes
                 [("status" .=) <$> _uuStatus,
                  Just ("kind" .= _uuKind),
                  ("customDataSourceId" .=) <$> _uuCustomDataSourceId,
                  ("uploadTime" .=) <$> _uuUploadTime,
                  ("accountId" .=) <$> _uuAccountId,
                  ("id" .=) <$> _uuId, ("errors" .=) <$> _uuErrors])

-- | JSON template for Analytics Custom Dimension.
--
-- /See:/ 'customDimension' smart constructor.
data CustomDimension =
  CustomDimension'
    { _cddParentLink :: !(Maybe CustomDimensionParentLink)
    , _cddWebPropertyId :: !(Maybe Text)
    , _cddKind :: !Text
    , _cddCreated :: !(Maybe DateTime')
    , _cddActive :: !(Maybe Bool)
    , _cddSelfLink :: !(Maybe Text)
    , _cddAccountId :: !(Maybe Text)
    , _cddName :: !(Maybe Text)
    , _cddScope :: !(Maybe Text)
    , _cddId :: !(Maybe Text)
    , _cddUpdated :: !(Maybe DateTime')
    , _cddIndex :: !(Maybe (Textual Int32))
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'CustomDimension' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'cddParentLink'
--
-- * 'cddWebPropertyId'
--
-- * 'cddKind'
--
-- * 'cddCreated'
--
-- * 'cddActive'
--
-- * 'cddSelfLink'
--
-- * 'cddAccountId'
--
-- * 'cddName'
--
-- * 'cddScope'
--
-- * 'cddId'
--
-- * 'cddUpdated'
--
-- * 'cddIndex'
customDimension
    :: CustomDimension
customDimension =
  CustomDimension'
    { _cddParentLink = Nothing
    , _cddWebPropertyId = Nothing
    , _cddKind = "analytics#customDimension"
    , _cddCreated = Nothing
    , _cddActive = Nothing
    , _cddSelfLink = Nothing
    , _cddAccountId = Nothing
    , _cddName = Nothing
    , _cddScope = Nothing
    , _cddId = Nothing
    , _cddUpdated = Nothing
    , _cddIndex = Nothing
    }


-- | Parent link for the custom dimension. Points to the property to which
-- the custom dimension belongs.
cddParentLink :: Lens' CustomDimension (Maybe CustomDimensionParentLink)
cddParentLink
  = lens _cddParentLink
      (\ s a -> s{_cddParentLink = a})

-- | Property ID.
cddWebPropertyId :: Lens' CustomDimension (Maybe Text)
cddWebPropertyId
  = lens _cddWebPropertyId
      (\ s a -> s{_cddWebPropertyId = a})

-- | Kind value for a custom dimension. Set to \"analytics#customDimension\".
-- It is a read-only field.
cddKind :: Lens' CustomDimension Text
cddKind = lens _cddKind (\ s a -> s{_cddKind = a})

-- | Time the custom dimension was created.
cddCreated :: Lens' CustomDimension (Maybe UTCTime)
cddCreated
  = lens _cddCreated (\ s a -> s{_cddCreated = a}) .
      mapping _DateTime

-- | Boolean indicating whether the custom dimension is active.
cddActive :: Lens' CustomDimension (Maybe Bool)
cddActive
  = lens _cddActive (\ s a -> s{_cddActive = a})

-- | Link for the custom dimension
cddSelfLink :: Lens' CustomDimension (Maybe Text)
cddSelfLink
  = lens _cddSelfLink (\ s a -> s{_cddSelfLink = a})

-- | Account ID.
cddAccountId :: Lens' CustomDimension (Maybe Text)
cddAccountId
  = lens _cddAccountId (\ s a -> s{_cddAccountId = a})

-- | Name of the custom dimension.
cddName :: Lens' CustomDimension (Maybe Text)
cddName = lens _cddName (\ s a -> s{_cddName = a})

-- | Scope of the custom dimension: HIT, SESSION, USER or PRODUCT.
cddScope :: Lens' CustomDimension (Maybe Text)
cddScope = lens _cddScope (\ s a -> s{_cddScope = a})

-- | Custom dimension ID.
cddId :: Lens' CustomDimension (Maybe Text)
cddId = lens _cddId (\ s a -> s{_cddId = a})

-- | Time the custom dimension was last modified.
cddUpdated :: Lens' CustomDimension (Maybe UTCTime)
cddUpdated
  = lens _cddUpdated (\ s a -> s{_cddUpdated = a}) .
      mapping _DateTime

-- | Index of the custom dimension.
cddIndex :: Lens' CustomDimension (Maybe Int32)
cddIndex
  = lens _cddIndex (\ s a -> s{_cddIndex = a}) .
      mapping _Coerce

instance FromJSON CustomDimension where
        parseJSON
          = withObject "CustomDimension"
              (\ o ->
                 CustomDimension' <$>
                   (o .:? "parentLink") <*> (o .:? "webPropertyId") <*>
                     (o .:? "kind" .!= "analytics#customDimension")
                     <*> (o .:? "created")
                     <*> (o .:? "active")
                     <*> (o .:? "selfLink")
                     <*> (o .:? "accountId")
                     <*> (o .:? "name")
                     <*> (o .:? "scope")
                     <*> (o .:? "id")
                     <*> (o .:? "updated")
                     <*> (o .:? "index"))

instance ToJSON CustomDimension where
        toJSON CustomDimension'{..}
          = object
              (catMaybes
                 [("parentLink" .=) <$> _cddParentLink,
                  ("webPropertyId" .=) <$> _cddWebPropertyId,
                  Just ("kind" .= _cddKind),
                  ("created" .=) <$> _cddCreated,
                  ("active" .=) <$> _cddActive,
                  ("selfLink" .=) <$> _cddSelfLink,
                  ("accountId" .=) <$> _cddAccountId,
                  ("name" .=) <$> _cddName, ("scope" .=) <$> _cddScope,
                  ("id" .=) <$> _cddId, ("updated" .=) <$> _cddUpdated,
                  ("index" .=) <$> _cddIndex])

-- | JSON template for an Analytics segment.
--
-- /See:/ 'segment' smart constructor.
data Segment =
  Segment'
    { _segDefinition :: !(Maybe Text)
    , _segKind :: !Text
    , _segCreated :: !(Maybe DateTime')
    , _segSelfLink :: !(Maybe Text)
    , _segName :: !(Maybe Text)
    , _segId :: !(Maybe Text)
    , _segUpdated :: !(Maybe DateTime')
    , _segType :: !(Maybe Text)
    , _segSegmentId :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'Segment' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'segDefinition'
--
-- * 'segKind'
--
-- * 'segCreated'
--
-- * 'segSelfLink'
--
-- * 'segName'
--
-- * 'segId'
--
-- * 'segUpdated'
--
-- * 'segType'
--
-- * 'segSegmentId'
segment
    :: Segment
segment =
  Segment'
    { _segDefinition = Nothing
    , _segKind = "analytics#segment"
    , _segCreated = Nothing
    , _segSelfLink = Nothing
    , _segName = Nothing
    , _segId = Nothing
    , _segUpdated = Nothing
    , _segType = Nothing
    , _segSegmentId = Nothing
    }


-- | Segment definition.
segDefinition :: Lens' Segment (Maybe Text)
segDefinition
  = lens _segDefinition
      (\ s a -> s{_segDefinition = a})

-- | Resource type for Analytics segment.
segKind :: Lens' Segment Text
segKind = lens _segKind (\ s a -> s{_segKind = a})

-- | Time the segment was created.
segCreated :: Lens' Segment (Maybe UTCTime)
segCreated
  = lens _segCreated (\ s a -> s{_segCreated = a}) .
      mapping _DateTime

-- | Link for this segment.
segSelfLink :: Lens' Segment (Maybe Text)
segSelfLink
  = lens _segSelfLink (\ s a -> s{_segSelfLink = a})

-- | Segment name.
segName :: Lens' Segment (Maybe Text)
segName = lens _segName (\ s a -> s{_segName = a})

-- | Segment ID.
segId :: Lens' Segment (Maybe Text)
segId = lens _segId (\ s a -> s{_segId = a})

-- | Time the segment was last modified.
segUpdated :: Lens' Segment (Maybe UTCTime)
segUpdated
  = lens _segUpdated (\ s a -> s{_segUpdated = a}) .
      mapping _DateTime

-- | Type for a segment. Possible values are \"BUILT_IN\" or \"CUSTOM\".
segType :: Lens' Segment (Maybe Text)
segType = lens _segType (\ s a -> s{_segType = a})

-- | Segment ID. Can be used with the \'segment\' parameter in Core Reporting
-- API.
segSegmentId :: Lens' Segment (Maybe Text)
segSegmentId
  = lens _segSegmentId (\ s a -> s{_segSegmentId = a})

instance FromJSON Segment where
        parseJSON
          = withObject "Segment"
              (\ o ->
                 Segment' <$>
                   (o .:? "definition") <*>
                     (o .:? "kind" .!= "analytics#segment")
                     <*> (o .:? "created")
                     <*> (o .:? "selfLink")
                     <*> (o .:? "name")
                     <*> (o .:? "id")
                     <*> (o .:? "updated")
                     <*> (o .:? "type")
                     <*> (o .:? "segmentId"))

instance ToJSON Segment where
        toJSON Segment'{..}
          = object
              (catMaybes
                 [("definition" .=) <$> _segDefinition,
                  Just ("kind" .= _segKind),
                  ("created" .=) <$> _segCreated,
                  ("selfLink" .=) <$> _segSelfLink,
                  ("name" .=) <$> _segName, ("id" .=) <$> _segId,
                  ("updated" .=) <$> _segUpdated,
                  ("type" .=) <$> _segType,
                  ("segmentId" .=) <$> _segSegmentId])

-- | Child link for an account entry. Points to the list of web properties
-- for this account.
--
-- /See:/ 'accountChildLink' smart constructor.
data AccountChildLink =
  AccountChildLink'
    { _aclHref :: !(Maybe Text)
    , _aclType :: !Text
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'AccountChildLink' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'aclHref'
--
-- * 'aclType'
accountChildLink
    :: AccountChildLink
accountChildLink =
  AccountChildLink' {_aclHref = Nothing, _aclType = "analytics#webproperties"}


-- | Link to the list of web properties for this account.
aclHref :: Lens' AccountChildLink (Maybe Text)
aclHref = lens _aclHref (\ s a -> s{_aclHref = a})

-- | Type of the child link. Its value is \"analytics#webproperties\".
aclType :: Lens' AccountChildLink Text
aclType = lens _aclType (\ s a -> s{_aclType = a})

instance FromJSON AccountChildLink where
        parseJSON
          = withObject "AccountChildLink"
              (\ o ->
                 AccountChildLink' <$>
                   (o .:? "href") <*>
                     (o .:? "type" .!= "analytics#webproperties"))

instance ToJSON AccountChildLink where
        toJSON AccountChildLink'{..}
          = object
              (catMaybes
                 [("href" .=) <$> _aclHref,
                  Just ("type" .= _aclType)])

-- | JSON template for an Analytics profile filter link.
--
-- /See:/ 'proFileFilterLink' smart constructor.
data ProFileFilterLink =
  ProFileFilterLink'
    { _proProFileRef :: !(Maybe ProFileRef)
    , _proKind :: !Text
    , _proFilterRef :: !(Maybe FilterRef)
    , _proSelfLink :: !(Maybe Text)
    , _proId :: !(Maybe Text)
    , _proRank :: !(Maybe (Textual Int32))
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'ProFileFilterLink' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'proProFileRef'
--
-- * 'proKind'
--
-- * 'proFilterRef'
--
-- * 'proSelfLink'
--
-- * 'proId'
--
-- * 'proRank'
proFileFilterLink
    :: ProFileFilterLink
proFileFilterLink =
  ProFileFilterLink'
    { _proProFileRef = Nothing
    , _proKind = "analytics#profileFilterLink"
    , _proFilterRef = Nothing
    , _proSelfLink = Nothing
    , _proId = Nothing
    , _proRank = Nothing
    }


-- | View (Profile) for this link.
proProFileRef :: Lens' ProFileFilterLink (Maybe ProFileRef)
proProFileRef
  = lens _proProFileRef
      (\ s a -> s{_proProFileRef = a})

-- | Resource type for Analytics filter.
proKind :: Lens' ProFileFilterLink Text
proKind = lens _proKind (\ s a -> s{_proKind = a})

-- | Filter for this link.
proFilterRef :: Lens' ProFileFilterLink (Maybe FilterRef)
proFilterRef
  = lens _proFilterRef (\ s a -> s{_proFilterRef = a})

-- | Link for this profile filter link.
proSelfLink :: Lens' ProFileFilterLink (Maybe Text)
proSelfLink
  = lens _proSelfLink (\ s a -> s{_proSelfLink = a})

-- | Profile filter link ID.
proId :: Lens' ProFileFilterLink (Maybe Text)
proId = lens _proId (\ s a -> s{_proId = a})

-- | 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.
proRank :: Lens' ProFileFilterLink (Maybe Int32)
proRank
  = lens _proRank (\ s a -> s{_proRank = a}) .
      mapping _Coerce

instance FromJSON ProFileFilterLink where
        parseJSON
          = withObject "ProFileFilterLink"
              (\ o ->
                 ProFileFilterLink' <$>
                   (o .:? "profileRef") <*>
                     (o .:? "kind" .!= "analytics#profileFilterLink")
                     <*> (o .:? "filterRef")
                     <*> (o .:? "selfLink")
                     <*> (o .:? "id")
                     <*> (o .:? "rank"))

instance ToJSON ProFileFilterLink where
        toJSON ProFileFilterLink'{..}
          = object
              (catMaybes
                 [("profileRef" .=) <$> _proProFileRef,
                  Just ("kind" .= _proKind),
                  ("filterRef" .=) <$> _proFilterRef,
                  ("selfLink" .=) <$> _proSelfLink,
                  ("id" .=) <$> _proId, ("rank" .=) <$> _proRank])

-- | Parent link for the custom metric. Points to the property to which the
-- custom metric belongs.
--
-- /See:/ 'customMetricParentLink' smart constructor.
data CustomMetricParentLink =
  CustomMetricParentLink'
    { _cmplHref :: !(Maybe Text)
    , _cmplType :: !Text
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'CustomMetricParentLink' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'cmplHref'
--
-- * 'cmplType'
customMetricParentLink
    :: CustomMetricParentLink
customMetricParentLink =
  CustomMetricParentLink'
    {_cmplHref = Nothing, _cmplType = "analytics#webproperty"}


-- | Link to the property to which the custom metric belongs.
cmplHref :: Lens' CustomMetricParentLink (Maybe Text)
cmplHref = lens _cmplHref (\ s a -> s{_cmplHref = a})

-- | Type of the parent link. Set to \"analytics#webproperty\".
cmplType :: Lens' CustomMetricParentLink Text
cmplType = lens _cmplType (\ s a -> s{_cmplType = a})

instance FromJSON CustomMetricParentLink where
        parseJSON
          = withObject "CustomMetricParentLink"
              (\ o ->
                 CustomMetricParentLink' <$>
                   (o .:? "href") <*>
                     (o .:? "type" .!= "analytics#webproperty"))

instance ToJSON CustomMetricParentLink where
        toJSON CustomMetricParentLink'{..}
          = object
              (catMaybes
                 [("href" .=) <$> _cmplHref,
                  Just ("type" .= _cmplType)])

-- | JSON template for a metadata column.
--
-- /See:/ 'column' smart constructor.
data Column =
  Column'
    { _ccKind :: !Text
    , _ccAttributes :: !(Maybe ColumnAttributes)
    , _ccId :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'Column' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ccKind'
--
-- * 'ccAttributes'
--
-- * 'ccId'
column
    :: Column
column =
  Column'
    {_ccKind = "analytics#column", _ccAttributes = Nothing, _ccId = Nothing}


-- | Resource type for Analytics column.
ccKind :: Lens' Column Text
ccKind = lens _ccKind (\ s a -> s{_ccKind = a})

-- | Map of attribute name and value for this column.
ccAttributes :: Lens' Column (Maybe ColumnAttributes)
ccAttributes
  = lens _ccAttributes (\ s a -> s{_ccAttributes = a})

-- | Column id.
ccId :: Lens' Column (Maybe Text)
ccId = lens _ccId (\ s a -> s{_ccId = a})

instance FromJSON Column where
        parseJSON
          = withObject "Column"
              (\ o ->
                 Column' <$>
                   (o .:? "kind" .!= "analytics#column") <*>
                     (o .:? "attributes")
                     <*> (o .:? "id"))

instance ToJSON Column where
        toJSON Column'{..}
          = object
              (catMaybes
                 [Just ("kind" .= _ccKind),
                  ("attributes" .=) <$> _ccAttributes,
                  ("id" .=) <$> _ccId])

-- | The simple audience definition that will cause a user to be added to an
-- audience.
--
-- /See:/ 'remarketingAudienceAudienceDefinition' smart constructor.
newtype RemarketingAudienceAudienceDefinition =
  RemarketingAudienceAudienceDefinition'
    { _raadIncludeConditions :: Maybe IncludeConditions
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'RemarketingAudienceAudienceDefinition' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'raadIncludeConditions'
remarketingAudienceAudienceDefinition
    :: RemarketingAudienceAudienceDefinition
remarketingAudienceAudienceDefinition =
  RemarketingAudienceAudienceDefinition' {_raadIncludeConditions = Nothing}


-- | Defines the conditions to include users to the audience.
raadIncludeConditions :: Lens' RemarketingAudienceAudienceDefinition (Maybe IncludeConditions)
raadIncludeConditions
  = lens _raadIncludeConditions
      (\ s a -> s{_raadIncludeConditions = a})

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

instance ToJSON RemarketingAudienceAudienceDefinition
         where
        toJSON RemarketingAudienceAudienceDefinition'{..}
          = object
              (catMaybes
                 [("includeConditions" .=) <$>
                    _raadIncludeConditions])

--
-- /See:/ 'gaDataDataTableColsItem' smart constructor.
data GaDataDataTableColsItem =
  GaDataDataTableColsItem'
    { _gddtciId :: !(Maybe Text)
    , _gddtciType :: !(Maybe Text)
    , _gddtciLabel :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'GaDataDataTableColsItem' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'gddtciId'
--
-- * 'gddtciType'
--
-- * 'gddtciLabel'
gaDataDataTableColsItem
    :: GaDataDataTableColsItem
gaDataDataTableColsItem =
  GaDataDataTableColsItem'
    {_gddtciId = Nothing, _gddtciType = Nothing, _gddtciLabel = Nothing}


gddtciId :: Lens' GaDataDataTableColsItem (Maybe Text)
gddtciId = lens _gddtciId (\ s a -> s{_gddtciId = a})

gddtciType :: Lens' GaDataDataTableColsItem (Maybe Text)
gddtciType
  = lens _gddtciType (\ s a -> s{_gddtciType = a})

gddtciLabel :: Lens' GaDataDataTableColsItem (Maybe Text)
gddtciLabel
  = lens _gddtciLabel (\ s a -> s{_gddtciLabel = a})

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

instance ToJSON GaDataDataTableColsItem where
        toJSON GaDataDataTableColsItem'{..}
          = object
              (catMaybes
                 [("id" .=) <$> _gddtciId,
                  ("type" .=) <$> _gddtciType,
                  ("label" .=) <$> _gddtciLabel])

--
-- /See:/ 'experimentVariationsItem' smart constructor.
data ExperimentVariationsItem =
  ExperimentVariationsItem'
    { _eviStatus :: !(Maybe Text)
    , _eviWeight :: !(Maybe (Textual Double))
    , _eviURL :: !(Maybe Text)
    , _eviWon :: !(Maybe Bool)
    , _eviName :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'ExperimentVariationsItem' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'eviStatus'
--
-- * 'eviWeight'
--
-- * 'eviURL'
--
-- * 'eviWon'
--
-- * 'eviName'
experimentVariationsItem
    :: ExperimentVariationsItem
experimentVariationsItem =
  ExperimentVariationsItem'
    { _eviStatus = Nothing
    , _eviWeight = Nothing
    , _eviURL = Nothing
    , _eviWon = Nothing
    , _eviName = Nothing
    }


-- | 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.
eviStatus :: Lens' ExperimentVariationsItem (Maybe Text)
eviStatus
  = lens _eviStatus (\ s a -> s{_eviStatus = a})

-- | Weight that this variation should receive. Only present if the
-- experiment is running. This field is read-only.
eviWeight :: Lens' ExperimentVariationsItem (Maybe Double)
eviWeight
  = lens _eviWeight (\ s a -> s{_eviWeight = a}) .
      mapping _Coerce

-- | The URL of the variation. This field may not be changed for an
-- experiment whose status is RUNNING or ENDED.
eviURL :: Lens' ExperimentVariationsItem (Maybe Text)
eviURL = lens _eviURL (\ s a -> s{_eviURL = a})

-- | True if the experiment has ended and this variation performed
-- (statistically) significantly better than the original. This field is
-- read-only.
eviWon :: Lens' ExperimentVariationsItem (Maybe Bool)
eviWon = lens _eviWon (\ s a -> s{_eviWon = a})

-- | 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.
eviName :: Lens' ExperimentVariationsItem (Maybe Text)
eviName = lens _eviName (\ s a -> s{_eviName = a})

instance FromJSON ExperimentVariationsItem where
        parseJSON
          = withObject "ExperimentVariationsItem"
              (\ o ->
                 ExperimentVariationsItem' <$>
                   (o .:? "status") <*> (o .:? "weight") <*>
                     (o .:? "url")
                     <*> (o .:? "won")
                     <*> (o .:? "name"))

instance ToJSON ExperimentVariationsItem where
        toJSON ExperimentVariationsItem'{..}
          = object
              (catMaybes
                 [("status" .=) <$> _eviStatus,
                  ("weight" .=) <$> _eviWeight, ("url" .=) <$> _eviURL,
                  ("won" .=) <$> _eviWon, ("name" .=) <$> _eviName])

-- | Defines the conditions to exclude users from the audience.
--
-- /See:/ 'remarketingAudienceStateBasedAudienceDefinitionExcludeConditions' smart constructor.
data RemarketingAudienceStateBasedAudienceDefinitionExcludeConditions =
  RemarketingAudienceStateBasedAudienceDefinitionExcludeConditions'
    { _rasbadecExclusionDuration :: !(Maybe Text)
    , _rasbadecSegment :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'RemarketingAudienceStateBasedAudienceDefinitionExcludeConditions' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'rasbadecExclusionDuration'
--
-- * 'rasbadecSegment'
remarketingAudienceStateBasedAudienceDefinitionExcludeConditions
    :: RemarketingAudienceStateBasedAudienceDefinitionExcludeConditions
remarketingAudienceStateBasedAudienceDefinitionExcludeConditions =
  RemarketingAudienceStateBasedAudienceDefinitionExcludeConditions'
    {_rasbadecExclusionDuration = Nothing, _rasbadecSegment = Nothing}


-- | Whether to make the exclusion TEMPORARY or PERMANENT.
rasbadecExclusionDuration :: Lens' RemarketingAudienceStateBasedAudienceDefinitionExcludeConditions (Maybe Text)
rasbadecExclusionDuration
  = lens _rasbadecExclusionDuration
      (\ s a -> s{_rasbadecExclusionDuration = a})

-- | The segment condition that will cause a user to be removed from an
-- audience.
rasbadecSegment :: Lens' RemarketingAudienceStateBasedAudienceDefinitionExcludeConditions (Maybe Text)
rasbadecSegment
  = lens _rasbadecSegment
      (\ s a -> s{_rasbadecSegment = a})

instance FromJSON
           RemarketingAudienceStateBasedAudienceDefinitionExcludeConditions
         where
        parseJSON
          = withObject
              "RemarketingAudienceStateBasedAudienceDefinitionExcludeConditions"
              (\ o ->
                 RemarketingAudienceStateBasedAudienceDefinitionExcludeConditions'
                   <$>
                   (o .:? "exclusionDuration") <*> (o .:? "segment"))

instance ToJSON
           RemarketingAudienceStateBasedAudienceDefinitionExcludeConditions
         where
        toJSON
          RemarketingAudienceStateBasedAudienceDefinitionExcludeConditions'{..}
          = object
              (catMaybes
                 [("exclusionDuration" .=) <$>
                    _rasbadecExclusionDuration,
                  ("segment" .=) <$> _rasbadecSegment])

-- | 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:/ 'mcfDataTotalsForAllResults' smart constructor.
newtype McfDataTotalsForAllResults =
  McfDataTotalsForAllResults'
    { _mdtfarAddtional :: HashMap Text Text
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'McfDataTotalsForAllResults' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'mdtfarAddtional'
mcfDataTotalsForAllResults
    :: HashMap Text Text -- ^ 'mdtfarAddtional'
    -> McfDataTotalsForAllResults
mcfDataTotalsForAllResults pMdtfarAddtional_ =
  McfDataTotalsForAllResults' {_mdtfarAddtional = _Coerce # pMdtfarAddtional_}


-- | 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.
mdtfarAddtional :: Lens' McfDataTotalsForAllResults (HashMap Text Text)
mdtfarAddtional
  = lens _mdtfarAddtional
      (\ s a -> s{_mdtfarAddtional = a})
      . _Coerce

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

instance ToJSON McfDataTotalsForAllResults where
        toJSON = toJSON . _mdtfarAddtional

-- | User ID.
--
-- /See:/ 'userDeletionRequestId' smart constructor.
data UserDeletionRequestId =
  UserDeletionRequestId'
    { _udriUserId :: !(Maybe Text)
    , _udriType :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'UserDeletionRequestId' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'udriUserId'
--
-- * 'udriType'
userDeletionRequestId
    :: UserDeletionRequestId
userDeletionRequestId =
  UserDeletionRequestId' {_udriUserId = Nothing, _udriType = Nothing}


-- | The User\'s id
udriUserId :: Lens' UserDeletionRequestId (Maybe Text)
udriUserId
  = lens _udriUserId (\ s a -> s{_udriUserId = a})

-- | Type of user
udriType :: Lens' UserDeletionRequestId (Maybe Text)
udriType = lens _udriType (\ s a -> s{_udriType = a})

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

instance ToJSON UserDeletionRequestId where
        toJSON UserDeletionRequestId'{..}
          = object
              (catMaybes
                 [("userId" .=) <$> _udriUserId,
                  ("type" .=) <$> _udriType])

-- | Download details for a file stored in Google Cloud Storage.
--
-- /See:/ 'unSampledReportCloudStorageDownloadDetails' smart constructor.
data UnSampledReportCloudStorageDownloadDetails =
  UnSampledReportCloudStorageDownloadDetails'
    { _usrcsddObjectId :: !(Maybe Text)
    , _usrcsddBucketId :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'UnSampledReportCloudStorageDownloadDetails' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'usrcsddObjectId'
--
-- * 'usrcsddBucketId'
unSampledReportCloudStorageDownloadDetails
    :: UnSampledReportCloudStorageDownloadDetails
unSampledReportCloudStorageDownloadDetails =
  UnSampledReportCloudStorageDownloadDetails'
    {_usrcsddObjectId = Nothing, _usrcsddBucketId = Nothing}


-- | Id of the file object containing the report data.
usrcsddObjectId :: Lens' UnSampledReportCloudStorageDownloadDetails (Maybe Text)
usrcsddObjectId
  = lens _usrcsddObjectId
      (\ s a -> s{_usrcsddObjectId = a})

-- | Id of the bucket the file object is stored in.
usrcsddBucketId :: Lens' UnSampledReportCloudStorageDownloadDetails (Maybe Text)
usrcsddBucketId
  = lens _usrcsddBucketId
      (\ s a -> s{_usrcsddBucketId = a})

instance FromJSON
           UnSampledReportCloudStorageDownloadDetails
         where
        parseJSON
          = withObject
              "UnSampledReportCloudStorageDownloadDetails"
              (\ o ->
                 UnSampledReportCloudStorageDownloadDetails' <$>
                   (o .:? "objectId") <*> (o .:? "bucketId"))

instance ToJSON
           UnSampledReportCloudStorageDownloadDetails
         where
        toJSON
          UnSampledReportCloudStorageDownloadDetails'{..}
          = object
              (catMaybes
                 [("objectId" .=) <$> _usrcsddObjectId,
                  ("bucketId" .=) <$> _usrcsddBucketId])

-- | Child link for this view (profile). Points to the list of goals for this
-- view (profile).
--
-- /See:/ 'proFileChildLink' smart constructor.
data ProFileChildLink =
  ProFileChildLink'
    { _pfclHref :: !(Maybe Text)
    , _pfclType :: !Text
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'ProFileChildLink' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'pfclHref'
--
-- * 'pfclType'
proFileChildLink
    :: ProFileChildLink
proFileChildLink =
  ProFileChildLink' {_pfclHref = Nothing, _pfclType = "analytics#goals"}


-- | Link to the list of goals for this view (profile).
pfclHref :: Lens' ProFileChildLink (Maybe Text)
pfclHref = lens _pfclHref (\ s a -> s{_pfclHref = a})

-- | Value is \"analytics#goals\".
pfclType :: Lens' ProFileChildLink Text
pfclType = lens _pfclType (\ s a -> s{_pfclType = a})

instance FromJSON ProFileChildLink where
        parseJSON
          = withObject "ProFileChildLink"
              (\ o ->
                 ProFileChildLink' <$>
                   (o .:? "href") <*>
                     (o .:? "type" .!= "analytics#goals"))

instance ToJSON ProFileChildLink where
        toJSON ProFileChildLink'{..}
          = object
              (catMaybes
                 [("href" .=) <$> _pfclHref,
                  Just ("type" .= _pfclType)])

--
-- /See:/ 'gaDataColumnHeadersItem' smart constructor.
data GaDataColumnHeadersItem =
  GaDataColumnHeadersItem'
    { _gdchiColumnType :: !(Maybe Text)
    , _gdchiName :: !(Maybe Text)
    , _gdchiDataType :: !(Maybe Text)
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'GaDataColumnHeadersItem' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'gdchiColumnType'
--
-- * 'gdchiName'
--
-- * 'gdchiDataType'
gaDataColumnHeadersItem
    :: GaDataColumnHeadersItem
gaDataColumnHeadersItem =
  GaDataColumnHeadersItem'
    {_gdchiColumnType = Nothing, _gdchiName = Nothing, _gdchiDataType = Nothing}


-- | Column Type. Either DIMENSION or METRIC.
gdchiColumnType :: Lens' GaDataColumnHeadersItem (Maybe Text)
gdchiColumnType
  = lens _gdchiColumnType
      (\ s a -> s{_gdchiColumnType = a})

-- | Column name.
gdchiName :: Lens' GaDataColumnHeadersItem (Maybe Text)
gdchiName
  = lens _gdchiName (\ s a -> s{_gdchiName = a})

-- | 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.
gdchiDataType :: Lens' GaDataColumnHeadersItem (Maybe Text)
gdchiDataType
  = lens _gdchiDataType
      (\ s a -> s{_gdchiDataType = a})

instance FromJSON GaDataColumnHeadersItem where
        parseJSON
          = withObject "GaDataColumnHeadersItem"
              (\ o ->
                 GaDataColumnHeadersItem' <$>
                   (o .:? "columnType") <*> (o .:? "name") <*>
                     (o .:? "dataType"))

instance ToJSON GaDataColumnHeadersItem where
        toJSON GaDataColumnHeadersItem'{..}
          = object
              (catMaybes
                 [("columnType" .=) <$> _gdchiColumnType,
                  ("name" .=) <$> _gdchiName,
                  ("dataType" .=) <$> _gdchiDataType])

-- | Parent link for a goal. Points to the view (profile) to which this goal
-- belongs.
--
-- /See:/ 'goalParentLink' smart constructor.
data GoalParentLink =
  GoalParentLink'
    { _gplHref :: !(Maybe Text)
    , _gplType :: !Text
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'GoalParentLink' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'gplHref'
--
-- * 'gplType'
goalParentLink
    :: GoalParentLink
goalParentLink =
  GoalParentLink' {_gplHref = Nothing, _gplType = "analytics#profile"}


-- | Link to the view (profile) to which this goal belongs.
gplHref :: Lens' GoalParentLink (Maybe Text)
gplHref = lens _gplHref (\ s a -> s{_gplHref = a})

-- | Value is \"analytics#profile\".
gplType :: Lens' GoalParentLink Text
gplType = lens _gplType (\ s a -> s{_gplType = a})

instance FromJSON GoalParentLink where
        parseJSON
          = withObject "GoalParentLink"
              (\ o ->
                 GoalParentLink' <$>
                   (o .:? "href") <*>
                     (o .:? "type" .!= "analytics#profile"))

instance ToJSON GoalParentLink where
        toJSON GoalParentLink'{..}
          = object
              (catMaybes
                 [("href" .=) <$> _gplHref,
                  Just ("type" .= _gplType)])

-- | Map of attribute name and value for this column.
--
-- /See:/ 'columnAttributes' smart constructor.
newtype ColumnAttributes =
  ColumnAttributes'
    { _caAddtional :: HashMap Text Text
    }
  deriving (Eq, Show, Data, Typeable, Generic)


-- | Creates a value of 'ColumnAttributes' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'caAddtional'
columnAttributes
    :: HashMap Text Text -- ^ 'caAddtional'
    -> ColumnAttributes
columnAttributes pCaAddtional_ =
  ColumnAttributes' {_caAddtional = _Coerce # pCaAddtional_}


-- | The name of the attribute.
caAddtional :: Lens' ColumnAttributes (HashMap Text Text)
caAddtional
  = lens _caAddtional (\ s a -> s{_caAddtional = a}) .
      _Coerce

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

instance ToJSON ColumnAttributes where
        toJSON = toJSON . _caAddtional
