import sys
import time
import json
import base64
from marshmallow import Schema, fields, post_load

from floyd.model.base import BaseModel


def assert_token_not_expired(token):
    payload_base64 = token.split('.')[1] + '==='
    payload = json.loads(base64.decodestring(payload_base64.encode('ascii')).decode('ascii'))
    if payload['exp'] <= time.time():
        sys.exit('ERROR: Auth token expired, please use "floyd login" command to login with a new token.')


class AccessTokenSchema(Schema):

    username = fields.Str()
    token = fields.Str()
    apikey = fields.Str()

    @post_load
    def make_access_token(self, data):
        return AccessToken(**data)


class AccessToken(BaseModel):

    schema = AccessTokenSchema(strict=True)

    def __init__(self,
                 username,
                 token=None,
                 apikey=None):
        if token:
            assert_token_not_expired(token)
        self.username = username
        self.token = token or apikey