import { Req, Res, ReturnValue } from "#/global"
import { LoginUserSchema, RegisterUserSchema, UserSchema } from "@/schema"
import { gFail, gSuccess } from "@/util"
import { auth, config, method, route, route_path, validate } from "@noderun/hapi-router"
import { sequelize } from "@sequelize"
import * as bcrypt from "bcrypt"

/**
 * 登录界面
 */
export default class {
    @route_path("/register")
    @auth("try")
    @method("GET")
    async register_GET(request: Req, h: Res): ReturnValue {
        if (request.auth.isAuthenticated) {
            request.yar.flash("warning", "您已经登陆")
            return h.redirect("/")
        } else {
            logger.debug("未登录")
        }
        return h.view("views/register.pug")
    }

    @validate({
        payload: RegisterUserSchema,
        $errto: "/register",
        failAction: "function",
        failReason: "注册账户不符合规范",
    })
    @method("POST")
    @route_path("/register")
    async register_POST(request: Req, h: Res): ReturnValue {
        let { username, password } = request.payload as any
        const User = request.getModel("user")
        const UserInfoModel = request.getModel("user_info")
        logger.trace("当前注册用户:" + username)
        try {
            const result = await User.findOne({ where: { username: username } })
            if (result != null) {
                request.yar.flash("error", "已存在该用户")
                return h.redirect("/register")
            }
            let salt = bcrypt.genSaltSync(10)
            let pwdLock = bcrypt.hashSync(password, salt)
            // 使用事务插入
            await sequelize.transaction(async t => {
                const user = await User.create({ username, password: pwdLock }, { transaction: t })
                await UserInfoModel.create({ nickname: username, user_id: user.id }, { transaction: t })
                return user
            })
            request.yar.flash("success", "用户注册成功")
            return h.redirect("/login")
        } catch (e) {
            loggerSite.error(`注册用户失败`, e.message)
            request.yar.flash("error", "注册用户失败")
            return h.redirect("/register")
        }
    }
}