var userModel = require("./models/user");
var key = "123456789trytryrtyr";
var encryptor = require("simple-encryptor")(key);
var config = require("./config/auth.config");
var Role = require("./models/role.model");
var jwt = require("jsonwebtoken");

// Operace s databází

// => vytvoření uživatele, předání atribut a zadání rolí
module.exports.createUserDBService = async (userDetails) => {
	try {
		var userModelData = new userModel();

		userModelData.username = userDetails.username;
		userModelData.email = userDetails.email;
		userModelData.password = userDetails.password;
		var encrypted = encryptor.encrypt(userDetails.password);
		userModelData.password = encrypted;
		userModelData.group = "0";
		userModelData.preference_holiday = false;
		userModelData.preference_adjacent = false;

		if (userDetails.roles) {
			const roles = await Role.find({ name: { $in: userDetails.roles } });
			userModelData.roles = roles.map((role) => role._id);
		} else {
			const role = await Role.findOne({ name: "user" });
			userModelData.roles = [role._id];
		}

		await userModelData.save();
		return true;
	} catch (error) {
		return false;
	}
};

// => přihlášení uživatle -> nalezení a porovnání údajů z databáze a ověření role
module.exports.loginUserDBService = async (employeeDetails) => {
	try {
		const user = await userModel
			.findOne({
				username: employeeDetails.username,
			})
			.populate("roles", "-__v");

		if (user) {
			const decrypted = encryptor.decrypt(user.password);
			if (decrypted === employeeDetails.password) {
				const token = jwt.sign({ id: user._id }, config.secret, {
					algorithm: "HS256",
					expiresIn: 86400, // 24 hodin
				});
				return {
					status: true,
					msg: "Uživatel úspěšně ověřen!",
					token: token,
					user: { id: user._id, username: user.username, email: user.email },
				};
			} else {
				return { status: false, msg: "Ověření uživatele selhalo" };
			}
		} else {
			return { status: false, msg: "Uživatel nenalezen" };
		}
	} catch (error) {
		return { status: false, msg: "Neplatné údaje, došlo k chybě" };
	}
};
