const {Application} = require("../core/server");
const Joi = require("joi");
const { PostDataProcess } = require("../core/postdata");
const User = require("../database/user");


Application.get("/", LoginPage);
Application.get("/login", LoginPage);
Application.get("/register", RegisterPage);


Application.post("/login", PostDataProcess(), Login);
Application.post("/register", PostDataProcess(), Register);

/**
 * @param {import("express").Request} request
 * @param {import("express").Response} response
 */
async function LoginPage(request, response)
{
    if(typeof request.session.authendicated == "boolean" && request.session.authendicated == true)
    {
        response.redirect(307,"/panel");
    }else{
        response.render("login");
    }
}


/**
 * @param {import("express").Request} request
 * @param {import("express").Response} response
 */
async function RegisterPage(request, response)
{
    response.render("register");
}


/**
 * @param {import("express").Request} request
 * @param {import("express").Response} response
 */
async function Register(request, response)
{
    const error = registerValidation(request.body);

    if(error)
    {
        return response.status(400).json({
            status: "fail",
            message: error.message
        });
    }

    if(await User.hasUser(request.body.email))
    {
        return response.status(400).json({
            status: "fail",
            message: "E-Mail adresi zaten kullanılıyor."
        });
    }

    let userid;
    try{
        userid = await User.createUser(
            request.body.name,
            request.body.surname,
            request.body.email,
            request.body.password
        );
    }catch{
        return response.status(500).json({
            status: "fail",
            message: "Bir hata oluştu"
        });
    }

    await loginUser(request,userid);

    return response.status(200).json({
        status: "success",
        message: "Kayıt işlemi başarılı, hesabınıza giriş yapabilirsiniz"
    });
}
/**
 * @param {import("express").Request} request
 * @param {import("express").Response} response
 */
async function Login(request, response)
{
    const error = loginValidation(request.body);

    if(error)
    {
        return response.status(400).json({
            status: "fail",
            message: error.message
        });
    }

    let findedUser = await User.checkUser(
        request.body.email,
        request.body.password
    );

    if(findedUser == null)
    {
        return response.status(400).json({
            status: "fail",
            message: "E-posta adresiniz veya şifreniz hatalı. Lütfen bilgilerinizi kontrol edip tekrar deneyiniz."
        });
    }

    await loginUser(request,findedUser.id);

    return response.status(200).json({
        status: "success",
        message: "Kayıt işlemi başarılı, hesabınıza giriş yapabilirsiniz"
    });
}

function registerValidation(body)
{
    const schema = Joi.object({
        name: Joi.string()
            .min(2).max(30).required()
            .error(new Error('Ad zorunludur ve 2 ile 30 karakter arasında olmalıdır.')),
        surname: Joi.string()
            .min(2).max(30).required()
            .error(new Error('Soyad zorunludur ve 2 ile 30 karakter arasında olmalıdır.')),
        email: Joi.string()
            .email()
            .required()
            .error(new Error('Geçerli bir e-posta adresi giriniz.')),
        password: Joi.string()
            .min(6).max(20).required()
            .error(new Error('Şifre zorunludur ve en az 6 karakter olmalıdır.')),
        passwordverif: Joi.any()
            .equal(Joi.ref("password")).required()
            .error(new Error('Şifreler eşleşmiyor'))
    });

    const {error} = schema.validate(body);
    return error;
}

function loginValidation(body)
{
    const schema = Joi.object({
        email: Joi.string()
            .email()
            .required()
            .error(new Error('Geçerli bir e-posta adresi giriniz.')),
        password: Joi.string()
            .min(6).max(20).required()
            .error(new Error('Şifre zorunludur ve en az 6 karakter olmalıdır.'))
    });
    const {error} = schema.validate(body);
    return error;
}
/**
 * @param {import("express").Request} request
 */
async function loginUser(request,userId)
{
    request.session.authendicated = true;
    request.session.user_id = userId;
    request.session.user = await User.getUser(userId);
    request.session.save();
}

/**
 * @param {import("express").Request} request
 * @param {import("express").Response} response
 */
function MiddlewareAuth(request, response, next)
{
    if(typeof request.session.authendicated == "boolean" && request.session.authendicated == true)
    {
        next()
    }else{
        response.redirect(307,"/login");
    }
}

exports.MiddlewareAuth = MiddlewareAuth;