import logging
from openid.consumer.consumer import Consumer
from openid.extensions.sreg import SRegRequest, SRegResponse
from openid.store.filestore import FileOpenIDStore
from sqlalchemy.orm.exc import NoResultFound

from pylons import config, request, response, session, tmpl_context as c
from pylons.controllers.util import abort, redirect_to
from routes import url_for, request_config

from spline import model
from spline.model import meta
from spline.lib.base import BaseController, render

log = logging.getLogger(__name__)

class AccountsController(BaseController):

    openid_store = FileOpenIDStore('/var/tmp')

    def index(self):
        # Return a rendered template
        #   return render('/template.mako')
        # or, Return a response
        return str(request.headers) + request.environ.get('scheme', '')

    def login_begin(self):
        """Step one of logging in with OpenID; we redirect to the provider"""

        cons = Consumer(session=session, store=self.openid_store)
        auth_request = cons.begin(request.params['openid'])
        sreg_req = SRegRequest(optional=['nickname', 'email', 'dob', 'gender',
                                         'country', 'language', 'timezone'])
        auth_request.addExtension(sreg_req)

        host = request.headers['host']
        protocol = request_config().protocol
        return_url = url_for(host=host, controller='accounts', action='login_finish')
        new_url = auth_request.redirectURL(return_to=return_url,
                                           realm=protocol + '://' + host)
        redirect_to(new_url)

    def login_finish(self):
        """Step two of logging in; the OpenID provider redirects back here."""

        cons = Consumer(session=session, store=self.openid_store)
        host = request.headers['host']
        return_url = url_for(host=host, controller='accounts', action='login_finish')
        res = cons.complete(request.params, return_url)

        if res.status != 'success':
            return 'Error!  %s' % res.message

        try:
            # Grab an existing user record, if one exists
            q = meta.Session.query(model.User) \
                    .filter(model.User.openids.any(openid=res.identity_url))
            user = q.one()
        except NoResultFound:
            # Try to pull a name out of the SReg response
            sreg_res = SRegResponse.fromSuccessResponse(res)
            try:
                username = sreg_res['nickname']
            except KeyError:
                username = 'Anonymous'

            # Create db records
            user = model.User(name=username)
            meta.Session.add(user)
            openid = model.OpenID(openid=res.identity_url)
            user.openids.append(openid)
            meta.Session.commit()

        # Remember who's logged in, and we're good to go
        session['user_id'] = user.id
        session.save()

        return "Hello, %s" % user.name
