'use strict';
const Hex = require('crypto-js/enc-hex');
const MD5 = require('crypto-js/md5');
const moment = require('moment');
const uuid = require('uuid');

async function login(ctx, next) {
    const transaction = await ctx.fs.dc.orm.transaction();
    try {
        const models = ctx.fs.dc.models;
        const params = ctx.request.body;
        let password = Hex.stringify(MD5(params.password));

        const userRes = await models.User.findOne({
            where: {
                username: params.username,
                password: password,
                delete: false,
            },
            attributes: { exclude: ['password'] },
            include: [{
                attributes: ["resourceId"],
                model: models.UserResource
            }]
        });

        if (!userRes) {
            ctx.status = 400;
            ctx.body = {
                "message": "账号或密码错误"
            }
        } else if (!userRes.enable) {
            ctx.status = 400;
            ctx.body = { message: "该用户已被禁用" }
        } else {
            const token = uuid.v4();
            const { departmentId } = userRes.dataValues;
            const deptInfo = await models.Department.findOne({
                where: {
                    id: departmentId
                }
            })
            let userRslt = Object.assign(userRes.dataValues, {
                authorized: true,
                token: token,
                userResources: userRes.userResources.map(r => r.resourceId),
                type: deptInfo.type
            });

            await models.UserToken.create({
                token: token,
                userInfo: userRslt,
                expired: moment().add(30, 'days').format()
            });

            ctx.status = 200;
            ctx.body = userRslt;
        }
        await transaction.commit();
    } catch (error) {
        await transaction.rollback();
        ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
        ctx.status = 400;
        ctx.body = {
            "message": "登录失败"
        }
    }
}

/**
 * 微信小程序登录
 * @@requires.body {phone-手机号, password-密码} ctx 
 */
async function wxLogin(ctx, next) {
    const transaction = await ctx.fs.dc.orm.transaction();
    try {
        const models = ctx.fs.dc.models;
        const params = ctx.request.body;
        let password = Hex.stringify(MD5(params.password));
        const userRes = await models.User.findOne({
            where: {
                phone: params.phone,
                password: password,
                delete: false,
            },
            attributes: { exclude: ['password'] }
        });
        if (!userRes) {
            ctx.status = 400;
            ctx.body = { message: "手机号或密码错误" }
        } else if (!userRes.enable) {
            ctx.status = 400;
            ctx.body = { message: "该用户已被禁用" }
        } else {
            const token = uuid.v4();
            //获取用户关注区域信息
            const departmentRes = await models.Department.findOne({ where: { id: userRes.departmentId } });
            let attentionRegion = departmentRes;
            while (attentionRegion.dependence && attentionRegion.type != 1) {
                const departmentParent = await models.Department.findOne({ where: { id: attentionRegion.dependence } });
                attentionRegion = {
                    ...departmentParent.dataValues,
                    nextRegin: attentionRegion
                }
            }
            //获取用户权限信息
            const resourceRes = await models.UserResource.findAll({
                where: {
                    userId: userRes.id
                },
                include: [{
                    model: models.Resource,
                    attributes: ['code', 'name'],
                }],
                attributes: []
            });
            let userRslt = Object.assign({
                authorized: true,
                token: token,
                ...userRes.dataValues
            });
            await models.UserToken.create({
                token: token,
                userInfo: userRslt,
                expired: moment().add(30, 'day').format('YYYY-MM-DD HH:mm:ss')
            }, { transaction: transaction });
            ctx.status = 200;
            ctx.body = Object.assign({
                ...userRslt,
                userRegionType: departmentRes.type,//1-市级,2-区县级,3-乡镇级,4-村级
                attentionRegion: attentionRegion,
                resources: resourceRes.map(r => r.resource)
            });
        }
        await transaction.commit();
    } catch (error) {
        await transaction.rollback();
        ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
        ctx.status = 400;
        ctx.body = {
            "message": "登录失败"
        }
    }
}

async function logout(ctx) {
    try {
        const { token, code } = ctx.request.body;
        const models = ctx.fs.dc.models;

        await models.UserToken.destroy({
            where: {
                token: token,
            },
        });

        ctx.status = 204;
    } catch (error) {
        ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
        ctx.status = 400;
        ctx.body = {
            "message": "登出失败"
        }
    }
}

/**
 * 微信小程序登出
 * @request.body {token-用户登录Token} ctx 
 */
async function wxLogout(ctx) {
    try {
        const { token } = ctx.request.body;
        const models = ctx.fs.dc.models;
        await models.UserToken.destroy({
            where: {
                token: token,
            },
        });
        ctx.status = 204;
    } catch (error) {
        ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
        ctx.status = 400;
        ctx.body = {
            "message": "登出失败"
        }
    }
}

module.exports = {
    login,
    wxLogin,
    logout,
    wxLogout
};