import logging

from flask import abort, send_file, redirect, request, url_for
from flask.ext.login import login_user, UserMixin, login_required, logout_user
from flask.ext.principal import identity_changed, Identity, AnonymousIdentity

from data import model
from app import app, login_manager


logger = logging.getLogger(__name__)


class _LoginWrappedDBUser(UserMixin):
  def __init__(self, db_user):
    self.db_user = db_user

  def is_active(self):
    return self.db_user.verified

  def get_id(self):
    return unicode(self.db_user.username)


@login_manager.user_loader
def load_user(username):
  db_user = model.get_user(username)
  if db_user:
    return _LoginWrappedDBUser(db_user)
  else:
    return None


@app.route('/', methods=['GET'])
def index():
  return send_file('templates/index.html')


def common_login(db_user):
  logger.debug('Successfully signed in as: %s' % db_user.username)
  login_user(_LoginWrappedDBUser(db_user))
  identity_changed.send(app, identity=Identity(db_user.username, 'username'))


@app.route('/signin', methods=['POST'])
def signin():
  username = request.form['username']
  password = request.form['password']

  #TODO Allow email login
  verified = model.verify_user(username, password)
  if verified:
    common_login(verified)

    return redirect(request.args.get('next') or url_for('index'))

  abort(403)


@app.route('/confirm', methods=['GET'])
def confirm_email():
  code = request.values['code']
  user = model.confirm_user_email(code)

  common_login(user)

  return redirect(url_for('index'))


@app.route('/reset', methods=['GET'])
def password_reset():
  pass


@app.route('/signin', methods=['GET'])
def render_signin_page():
  return send_file('templates/signin.html')


@app.route("/signout")
@login_required
def logout():
    logout_user()

    identity_changed.send(app, identity=AnonymousIdentity())

    return redirect(url_for('index'))