import extend from './extend.js';
import request from './request.js';
import result from './result.js';
import user from './user.js';
import url from './url.js';

/**
 * 默认过期时间 8 小时
 */
const defaultExpiresIn = 28800000;

/**
 * token 存储键
 */
const tokenKey = 'token';

/**
 * token 过期时间存储键
 */
const tokenTimeoutKey = 'token_timeout';

/**
 * token 链接地址存储键
 */
const tokenUrlKey = 'token_url';

/**
 * Token
 */
export default {
    /**
     * 判断 Token 是否生效
     * @returns {boolean} 存在标记
     */
    has() {
        let token = extend.readStorage(tokenKey);
        let timeout = extend.readStorage(tokenTimeoutKey) || 0;
        let now = Date.now();

        if (timeout < now || extend.isEmptyString(token)) {
            this.clear();
            return false;
        }
        return true;
    },

    /**
     * 设置 Token
     * @param {Object} param - 参数
     * @param  {string} param.token - 令牌
     * @param {number} param.expires_in - 生效时长，默认 8 小时
     */
    set(param) {
        if (!extend.isObject(param) || extend.isEmptyString(param.token)) {
            return;
        }
        let timeout = 0;
        if (extend.isNumber(param.expires_in)) {
            timeout = Date.now() + param.expires_in;
        } else {
            timeout = Date.now() + defaultExpiresIn;
        }
        extend.addStorage(tokenKey, param.token);
        extend.addStorage(tokenTimeoutKey, timeout);
    },

    /**
     * 获取 Token
     */
    get() {
        this.has();
        return extend.readStorage(tokenKey);
    },

    /**
     * 清除 Token
     */
    clear() {
        extend.removeStorage(tokenKey);
        extend.removeStorage(tokenTimeoutKey);
        user.clear();
    },

    /**
     * 通过服务器获取Token
     */
    async getByServer(opts) {
        if (!extend.isObject(opts)) {
            opts = {};
        }
        if (extend.isEmptyString(opts.url)) {
            opts.url = extend.readStorage(tokenUrlKey);
            if (extend.isEmptyString(opts.url)) {
                opts.url = 'oauth2/token';
            }
        } else {
            extend.addStorage(tokenUrlKey, opts.url);
        }
        if (extend.isNull(opts.data)) {
            opts.data = user.getLoginInfo();
        }
        if (extend.isNull(opts.data)) {
            return {
                success: false,
                message: '请登录！'
            };
        }
        let res = await request.send({
            url: `${url.authUrl}${opts.url}`,
            method: 'post',
            type: 'url',
            data: opts.data
        });
        if (res.success) {
            // 登录成功
            user.setLoginInfo(opts.data);
            user.set(res.data);
            let token = res.data.token_type + ' ' + res.data.access_token;
            this.set({
                token: token,
                expires_in: res.data.expires_in
            });
        }
        return res;
    }
};