# http://flask.pocoo.org/snippets/62/
import base64
from os import urandom
from urllib.parse import urlparse, urljoin
from flask import request
from itsdangerous import URLSafeTimedSerializer, BadSignature
from projects import app
from projects.models import User
from projects import login_manager


def is_safe_url(target):
    ref_url = urlparse(request.host_url)
    test_url = urlparse(urljoin(request.host_url, target))
    return test_url.scheme in ('http', 'https') and \
        ref_url.netloc == test_url.netloc


# LoginManager
@login_manager.user_loader
def load_user(user_id):
    user = User.get(user_id)
    return user


def generate_confirmation_token(email):
    serializer = URLSafeTimedSerializer(app.config['SECRET_KEY'])
    return serializer.dumps(email, salt=app.config['ONETIME_TOKEN_SALT'])


# A token is valid for a day
def confirm_token(token, expiration=86400):
    serializer = URLSafeTimedSerializer(app.config['SECRET_KEY'])
    try:
        email = serializer.loads(token,
                                 salt=app.config['ONETIME_TOKEN_SALT'],
                                 max_age=expiration)
    except BadSignature:
        return False
    return email


def unique_name_encoding(name):
    """
    :param name: raw string name
    :return: the raw string name is padded with a 10 byte urandom string
    extension
    """
    assert type(name) == str
    return name + "_" + str(base64.b64encode(urandom(10)))


def unique_name_decode(name):
    """
    :param name: encoded name
    :return:
    """
    assert type(name) == str
    idx = name.rfind('_')
    return name[:idx]
