#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# Copyright 2014 Google Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Reference command-line example for Google Analytics Management API v3.

This application demonstrates how to use the python client library to access
all the pieces of data returned by the Google Analytics Management API v3.

The application manages autorization by saving an OAuth2.0 token in a local
file and reusing the token for subsequent requests. It then traverses the
Google Analytics Management hierarchy. It first retrieves and prints all the
authorized user's accounts, next it prints all the web properties for the
first account, then all the profiles for the first web property and finally
all the goals for the first profile. The sample then prints all the
user's advanced segments.


Before You Begin:

Update the client_secrets.json file

  You must update the clients_secrets.json file with a client id, client
  secret, and the redirect uri. You get these values by creating a new project
  in the Google APIs console and registering for OAuth2.0 for installed
  applications: https://code.google.com/apis/console

  Learn more about registering your analytics application here:
  https://developers.google.com/analytics/devguides/config/mgmt/v3/mgmtAuthorization

Sample Usage:

  $ python management_v3_reference.py

Also you can also get help on all the command-line flags the program
understands by running:

  $ python management_v3_reference.py --help
"""
from __future__ import print_function

__author__ = "api.nickm@gmail.com (Nick Mihailovski)"

import sys

from googleapiclient.errors import HttpError
from googleapiclient import sample_tools
from oauth2client.client import AccessTokenRefreshError


def main(argv):
    # Authenticate and construct service.
    service, flags = sample_tools.init(
        argv,
        "analytics",
        "v3",
        __doc__,
        __file__,
        scope="https://www.googleapis.com/auth/analytics.readonly",
    )

    # Traverse the Management hierarchy and print results or handle errors.
    try:
        traverse_hierarchy(service)

    except TypeError as error:
        # Handle errors in constructing a query.
        print(("There was an error in constructing your query : %s" % error))

    except HttpError as error:
        # Handle API errors.
        print(
            (
                "Arg, there was an API error : %s : %s"
                % (error.resp.status, error._get_reason())
            )
        )

    except AccessTokenRefreshError:
        print(
            "The credentials have been revoked or expired, please re-run"
            "the application to re-authorize"
        )


def traverse_hierarchy(service):
    """Traverses the management API hierarchy and prints results.

    This retrieves and prints the authorized user's accounts. It then
    retrieves and prints all the web properties for the first account,
    retrieves and prints all the profiles for the first web property,
    and retrieves and prints all the goals for the first profile.

    Args:
      service: The service object built by the Google API Python client library.

    Raises:
      HttpError: If an error occurred when accessing the API.
      AccessTokenRefreshError: If the current token was invalid.
    """

    accounts = service.management().accounts().list().execute()
    print_accounts(accounts)

    if accounts.get("items"):
        firstAccountId = accounts.get("items")[0].get("id")
        webproperties = (
            service.management()
            .webproperties()
            .list(accountId=firstAccountId)
            .execute()
        )

        print_webproperties(webproperties)

        if webproperties.get("items"):
            firstWebpropertyId = webproperties.get("items")[0].get("id")
            profiles = (
                service.management()
                .profiles()
                .list(accountId=firstAccountId, webPropertyId=firstWebpropertyId)
                .execute()
            )

            print_profiles(profiles)

            if profiles.get("items"):
                firstProfileId = profiles.get("items")[0].get("id")
                goals = (
                    service.management()
                    .goals()
                    .list(
                        accountId=firstAccountId,
                        webPropertyId=firstWebpropertyId,
                        profileId=firstProfileId,
                    )
                    .execute()
                )

                print_goals(goals)

    print_segments(service.management().segments().list().execute())


def print_accounts(accounts_response):
    """Prints all the account info in the Accounts Collection.

    Args:
      accounts_response: The response object returned from querying the Accounts
          collection.
    """

    print("------ Account Collection -------")
    print_pagination_info(accounts_response)
    print()

    for account in accounts_response.get("items", []):
        print("Account ID      = %s" % account.get("id"))
        print("Kind            = %s" % account.get("kind"))
        print("Self Link       = %s" % account.get("selfLink"))
        print("Account Name    = %s" % account.get("name"))
        print("Created         = %s" % account.get("created"))
        print("Updated         = %s" % account.get("updated"))

        child_link = account.get("childLink")
        print("Child link href = %s" % child_link.get("href"))
        print("Child link type = %s" % child_link.get("type"))
        print()

    if not accounts_response.get("items"):
        print("No accounts found.\n")


def print_webproperties(webproperties_response):
    """Prints all the web property info in the WebProperties collection.

    Args:
      webproperties_response: The response object returned from querying the
          Webproperties collection.
    """

    print("------ Web Properties Collection -------")
    print_pagination_info(webproperties_response)
    print()

    for webproperty in webproperties_response.get("items", []):
        print("Kind               = %s" % webproperty.get("kind"))
        print("Account ID         = %s" % webproperty.get("accountId"))
        print("Web Property ID    = %s" % webproperty.get("id"))
        print(
            ("Internal Web Property ID = %s" % webproperty.get("internalWebPropertyId"))
        )

        print("Website URL        = %s" % webproperty.get("websiteUrl"))
        print("Created            = %s" % webproperty.get("created"))
        print("Updated            = %s" % webproperty.get("updated"))

        print("Self Link          = %s" % webproperty.get("selfLink"))
        parent_link = webproperty.get("parentLink")
        print("Parent link href   = %s" % parent_link.get("href"))
        print("Parent link type   = %s" % parent_link.get("type"))
        child_link = webproperty.get("childLink")
        print("Child link href    = %s" % child_link.get("href"))
        print("Child link type    = %s" % child_link.get("type"))
        print()

    if not webproperties_response.get("items"):
        print("No webproperties found.\n")


def print_profiles(profiles_response):
    """Prints all the profile info in the Profiles Collection.

    Args:
      profiles_response: The response object returned from querying the
          Profiles collection.
    """

    print("------ Profiles Collection -------")
    print_pagination_info(profiles_response)
    print()

    for profile in profiles_response.get("items", []):
        print("Kind                      = %s" % profile.get("kind"))
        print("Account ID                = %s" % profile.get("accountId"))
        print("Web Property ID           = %s" % profile.get("webPropertyId"))
        print(("Internal Web Property ID = %s" % profile.get("internalWebPropertyId")))
        print("Profile ID                = %s" % profile.get("id"))
        print("Profile Name              = %s" % profile.get("name"))

        print("Currency         = %s" % profile.get("currency"))
        print("Timezone         = %s" % profile.get("timezone"))
        print("Default Page     = %s" % profile.get("defaultPage"))

        print(
            (
                "Exclude Query Parameters        = %s"
                % profile.get("excludeQueryParameters")
            )
        )
        print(
            (
                "Site Search Category Parameters = %s"
                % profile.get("siteSearchCategoryParameters")
            )
        )
        print(
            (
                "Site Search Query Parameters    = %s"
                % profile.get("siteSearchQueryParameters")
            )
        )

        print("Created          = %s" % profile.get("created"))
        print("Updated          = %s" % profile.get("updated"))

        print("Self Link        = %s" % profile.get("selfLink"))
        parent_link = profile.get("parentLink")
        print("Parent link href = %s" % parent_link.get("href"))
        print("Parent link type = %s" % parent_link.get("type"))
        child_link = profile.get("childLink")
        print("Child link href  = %s" % child_link.get("href"))
        print("Child link type  = %s" % child_link.get("type"))
        print()

    if not profiles_response.get("items"):
        print("No profiles found.\n")


def print_goals(goals_response):
    """Prints all the goal info in the Goals collection.

    Args:
      goals_response: The response object returned from querying the Goals
          collection
    """

    print("------ Goals Collection -------")
    print_pagination_info(goals_response)
    print()

    for goal in goals_response.get("items", []):
        print("Goal ID     = %s" % goal.get("id"))
        print("Kind        = %s" % goal.get("kind"))
        print("Self Link        = %s" % goal.get("selfLink"))

        print("Account ID               = %s" % goal.get("accountId"))
        print("Web Property ID          = %s" % goal.get("webPropertyId"))
        print(("Internal Web Property ID = %s" % goal.get("internalWebPropertyId")))
        print("Profile ID               = %s" % goal.get("profileId"))

        print("Goal Name   = %s" % goal.get("name"))
        print("Goal Value  = %s" % goal.get("value"))
        print("Goal Active = %s" % goal.get("active"))
        print("Goal Type   = %s" % goal.get("type"))

        print("Created     = %s" % goal.get("created"))
        print("Updated     = %s" % goal.get("updated"))

        parent_link = goal.get("parentLink")
        print("Parent link href = %s" % parent_link.get("href"))
        print("Parent link type = %s" % parent_link.get("type"))

        # Print the goal details depending on the type of goal.
        if goal.get("urlDestinationDetails"):
            print_url_destination_goal_details(goal.get("urlDestinationDetails"))

        elif goal.get("visitTimeOnSiteDetails"):
            print_visit_time_on_site_goal_details(goal.get("visitTimeOnSiteDetails"))

        elif goal.get("visitNumPagesDetails"):
            print_visit_num_pages_goal_details(goal.get("visitNumPagesDetails"))

        elif goal.get("eventDetails"):
            print_event_goal_details(goal.get("eventDetails"))

        print()

    if not goals_response.get("items"):
        print("No goals found.\n")


def print_url_destination_goal_details(goal_details):
    """Prints all the URL Destination goal type info.

    Args:
      goal_details: The details portion of the goal response.
    """

    print("------ Url Destination Goal -------")
    print("Goal URL            = %s" % goal_details.get("url"))
    print("Case Sensitive      = %s" % goal_details.get("caseSensitive"))
    print("Match Type          = %s" % goal_details.get("matchType"))
    print("First Step Required = %s" % goal_details.get("firstStepRequired"))

    print("------ Url Destination Goal Steps -------")
    for goal_step in goal_details.get("steps", []):
        print("Step Number  = %s" % goal_step.get("number"))
        print("Step Name    = %s" % goal_step.get("name"))
        print("Step URL     = %s" % goal_step.get("url"))

    if not goal_details.get("steps"):
        print("No Steps Configured")


def print_visit_time_on_site_goal_details(goal_details):
    """Prints all the Visit Time On Site goal type info.

    Args:
      goal_details: The details portion of the goal response.
    """

    print("------ Visit Time On Site Goal -------")
    print("Comparison Type  = %s" % goal_details.get("comparisonType"))
    print("comparison Value = %s" % goal_details.get("comparisonValue"))


def print_visit_num_pages_goal_details(goal_details):
    """Prints all the Visit Num Pages goal type info.

    Args:
      goal_details: The details portion of the goal response.
    """

    print("------ Visit Num Pages Goal -------")
    print("Comparison Type  = %s" % goal_details.get("comparisonType"))
    print("comparison Value = %s" % goal_details.get("comparisonValue"))


def print_event_goal_details(goal_details):
    """Prints all the Event goal type info.

    Args:
      goal_details: The details portion of the goal response.
    """

    print("------ Event Goal -------")
    print("Use Event Value  = %s" % goal_details.get("useEventValue"))

    for event_condition in goal_details.get("eventConditions", []):
        event_type = event_condition.get("type")
        print("Type             = %s" % event_type)

        if event_type in ("CATEGORY", "ACTION", "LABEL"):
            print("Match Type       = %s" % event_condition.get("matchType"))
            print("Expression       = %s" % event_condition.get("expression"))
        else:  # VALUE type.
            print("Comparison Type  = %s" % event_condition.get("comparisonType"))
            print("Comparison Value = %s" % event_condition.get("comparisonValue"))


def print_segments(segments_response):
    """Prints all the segment info in the Segments collection.

    Args:
      segments_response: The response object returned from querying the
          Segments collection.
    """

    print("------ Segments Collection -------")
    print_pagination_info(segments_response)
    print()

    for segment in segments_response.get("items", []):
        print("Segment ID = %s" % segment.get("id"))
        print("Kind       = %s" % segment.get("kind"))
        print("Self Link  = %s" % segment.get("selfLink"))
        print("Name       = %s" % segment.get("name"))
        print("Definition = %s" % segment.get("definition"))
        print("Created    = %s" % segment.get("created"))
        print("Updated    = %s" % segment.get("updated"))
        print()


def print_pagination_info(management_response):
    """Prints common pagination details.

    Args:
      management_response: The common reponse object for each collection in the
          Management API.
    """

    print("Items per page = %s" % management_response.get("itemsPerPage"))
    print("Total Results  = %s" % management_response.get("totalResults"))
    print("Start Index    = %s" % management_response.get("startIndex"))

    # These only have values if other result pages exist.
    if management_response.get("previousLink"):
        print("Previous Link  = %s" % management_response.get("previousLink"))
    if management_response.get("nextLink"):
        print("Next Link      = %s" % management_response.get("nextLink"))


if __name__ == "__main__":
    main(sys.argv)
