#!/usr/bin/env python
#
# 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.
#
"""Starting template for Google App Engine applications.

Use this project as a starting point if you are just beginning to build a Google
App Engine project. Remember to download the OAuth 2.0 client secrets which can
be obtained from the Developer Console <https://code.google.com/apis/console/>
and save them as 'client_secrets.json' in the project directory.
"""

__author__ = "jcgregorio@google.com (Joe Gregorio)"


import httplib2
import os

from googleapiclient import discovery
from oauth2client import client
from oauth2client.contrib import appengine
from google.appengine.api import memcache

import webapp2
import jinja2


JINJA_ENVIRONMENT = jinja2.Environment(
    loader=jinja2.FileSystemLoader(os.path.dirname(__file__)),
    autoescape=True,
    extensions=["jinja2.ext.autoescape"],
)

# CLIENT_SECRETS, name of a file containing the OAuth 2.0 information for this
# application, including client_id and client_secret, which are found
# on the API Access tab on the Google APIs
# Console <http://code.google.com/apis/console>
CLIENT_SECRETS = os.path.join(os.path.dirname(__file__), "client_secrets.json")

# Helpful message to display in the browser if the CLIENT_SECRETS file
# is missing.
MISSING_CLIENT_SECRETS_MESSAGE = (
    """
<h1>Warning: Please configure OAuth 2.0</h1>
<p>
To make this sample run you will need to populate the client_secrets.json file
found at:
</p>
<p>
<code>%s</code>.
</p>
<p>with information found on the <a
href="https://code.google.com/apis/console">APIs Console</a>.
</p>
"""
    % CLIENT_SECRETS
)


http = httplib2.Http(memcache)
service = discovery.build("plus", "v1", http=http)
decorator = appengine.oauth2decorator_from_clientsecrets(
    CLIENT_SECRETS,
    scope="https://www.googleapis.com/auth/plus.me",
    message=MISSING_CLIENT_SECRETS_MESSAGE,
)


class MainHandler(webapp2.RequestHandler):
    @decorator.oauth_aware
    def get(self):
        variables = {
            "url": decorator.authorize_url(),
            "has_credentials": decorator.has_credentials(),
        }
        template = JINJA_ENVIRONMENT.get_template("grant.html")
        self.response.write(template.render(variables))


class AboutHandler(webapp2.RequestHandler):
    @decorator.oauth_required
    def get(self):
        try:
            http = decorator.http()
            user = service.people().get(userId="me").execute(http=http)
            text = "Hello, %s!" % user["displayName"]

            template = JINJA_ENVIRONMENT.get_template("welcome.html")
            self.response.write(template.render({"text": text}))
        except client.AccessTokenRefreshError:
            self.redirect("/")


app = webapp2.WSGIApplication(
    [
        ("/", MainHandler),
        ("/about", AboutHandler),
        (decorator.callback_path, decorator.callback_handler()),
    ],
    debug=True,
)
