const express = require("express");
const mongoose = require("mongoose");
const cors = require("cors");
const bodyParser = require("body-parser");
var routes = require("./app/routes/routes");
const dbs = require("./app/models");
const Role = dbs.role;
const userModel = require("./app/models/user");
const key = "123456789trytryrtyr";
const encryptor = require("simple-encryptor")(key);

const app = express();
const PORT = 3001;

const uri =
	"mongodb+srv://user:heslo12345@cluster0.0lisj.mongodb.net/?retryWrites=true&w=majority&appName=Cluster0";

var corsOptions = {
	origin: "http://localhost:3000",
};

app.use(cors(corsOptions));
// parse requests of content-type - application/json
app.use(bodyParser.json());
// parse requests of content-type - application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: true }));

//Připojení mongo databáze skrze MongoDB Atlas cloud
mongoose
	.connect(uri)
	.then(() => {
		console.log("MongoDB Atlas byl úspěšně připojen");
	})
	.catch((error) => {
		console.error("MongoDB error", error);
	});

const db = mongoose.connection;
db.on("error", console.error.bind(console, "DB connection error"));
db.once("open", () => {
	console.log("Database connected");
	initial();
});

// Přidání rolí a uživatelů do databáze při prvním spuštění
async function initial() {
	try {
		const count = await Role.estimatedDocumentCount();

		if (count === 0) {
			try {
				await new Role({ name: "user" }).save();
				console.log("Byl přidán 'user' do kolekce rolí");
			} catch (err) {
				console.log("error", err);
			}

			try {
				const adminRole = await new Role({ name: "admin" }).save();
				console.log("Byl přidán 'admin' do kolekce rolí");
				// Přidání admina do databáze
				const adminRoleId = adminRole._id;
				const hashedPassword = encryptor.encrypt("admin");
				const newUser = new userModel({
					username: "admin",
					email: "admin@gmail.com",
					password: hashedPassword,
					roles: adminRoleId,
					group: "-1",
					preference_holiday: false,
					preference_adjacent: false,
				});
				try {
					await newUser.save();
					console.log("Admin uživatel úspěšně vytvořen");
				} catch (err) {
					console.log("Error při vytváření admina", err);
				}
			} catch (err) {
				console.log("error", err);
			}
		}
	} catch (err) {
		console.log("error", err);
	}
}

app.use(routes);

app.listen(PORT, function check(err) {
	if (err) {
		console.log("error");
	} else {
		console.log(`Server is started and listening at port ${PORT}`);
	}
});
