import yapi from '../yapi.js'
import  projectModel from '../models/project.js'
import userModel from '../models/user.js'
const jwt = require('jsonwebtoken');


class baseController{
    constructor(ctx){
        this.ctx = ctx;
        //网站上线后,role对象key是不能修改的,value可以修改
        this.roles = {
            admin: 'Admin',
            member: '网站会员'
        }
    }

    async init(ctx){
        this.$user = null;
        let ignoreRouter = [
            '/user/login_by_token',
            '/user/login',
            '/user/reg',
            '/user/status',
            '/user/logout'
        ]
        if(ignoreRouter.indexOf(ctx.path) > -1){
            this.$auth = true;
        }else{
            await this.checkLogin(ctx)
        }
        
    }

    getUid(ctx){
        return this.$uid;
    }

    async checkLogin(ctx){
        let token = ctx.cookies.get('_yapi_token');
        let uid   = ctx.cookies.get('_yapi_uid');
        try{
            if(!token || !uid) return false;
            let userInst = yapi.getInst(userModel); //创建user实体
            let result = await userInst.findById(uid);
            let decoded = jwt.verify(token, result.passsalt)
            if(decoded.uid == uid){
                this.$uid = uid;
                this.$auth = true;
                this.$user = result;             
                return true;
            }
            return false;
        }catch(e){
            return false;
        }

    }

    async getLoginStatus(ctx){
        if(await this.checkLogin(ctx) === true){            
            return ctx.body = yapi.commons.resReturn(yapi.commons.fieldSelect(this.$user,['_id','username','email', 'up_time', 'add_time']));
        }
        return ctx.body = yapi.commons.resReturn(null, 300 , 'Please login.');

    }

    getRole(){
        return this.$user.role;
    }

    async jungeProjectAuth(id){
        let model = yapi.getInst(projectModel);
        if(this.getRole() === 'admin') return true;
        if(!id) return false;
        let result =  await model.get(id);
        if(result.uid === this.getUid()){
            return true;
        }
        return false;
    }

    async jungeMemberAuth(id, member_uid){
        let model = yapi.getInst(projectModel);
        if(this.getRole() === 'admin') return true;
        if(!id || !member_uid) return false;
        let result =  await model.checkMemberRepeat(id, member_uid);
        if(result > 0){
            return true;
        }
        return false;
    }
}

module.exports = baseController