/*
	Introduction to Express.js
*/

// import express module
const express = require('express');

// Create an application using express
const app = express();

// Port
const port = 4000;

// Middlewares
/*
	- Middleware is a software that provides common services and capabilities to application outside of what is offered by the system/
	- API management is one of the common application of middlewares
*/
// Allows our app to read JSON data
app.use(express.json());
// Allows our app to read data from forms and extend the data types that our app will support
app.use(express.urlencoded({extended: true}));


// [Section] Routes

/*
	- Express has methods corresponding to each HTTP method
	- This route expects to receive a GET request at the base URI "/"
*/
app.get("/", (req, res) => {

	// Once the route is accessed, it will send a string response containing "Hello world"
	// we use the res.send() method to send a response back to the client
	res.send("Hello world");
});

// route for accessing the "/hello" with a GET method
app.get("/hello", (req, res) => {
	res.send("Hello from the /hello endpoint!");
});

// This route expects to receive a POST request at the URI "/hello"
app.post("/hello", (req, res) => {

	// req.body contains the contents/data of the request body
	// All properties defined in our Postman request will be accessible here as properties with the same name
	res.send(`Hello there ${req.body.firstName} ${req.body.lastName}`);
});

// This will serve as our mock database
let users = [];

// This route expects to receive a POST request at the URI "/signup"
app.post("/signup", (req, res) => {
	console.log(req.body);

	// if the contents of the request body with the property "username" and "password" is not empty (empty string)
	if(req.body.username !== '' && req.body.password !== ''){

		// This will store the user object sent via Postman to the users array created above
		users.push(req.body);

		console.log(users);

		// This will send a response back to the cliet/Postman
		res.send(`User ${req.body.username} successfully registered`);

	// If the username and password are not complete, an error message will be sent back to the client/Postman
	} else {

		res.send("Please input BOTH username and password");
	}
});

// This route expects to receive a PUT request at the URI "/change-password"
// This will update the password of the user
app.put("/change-password", (req, res) => {
	
	let message;

	// Creates a for loop that will loop through the elements of the "users" array
	for(let i = 0; i < users.length; i++){

		// If the username provided by the client/Post and the username of the current user is the same
		if(req.body.username == users[i].username){

			// Change the password by reassignment
			users[i].password = req.body.password

			// reassign the value of the message to be sent back to the client/Postman
			message = `User ${req.body.username}'s password has been updated.`;

			console.log(users);

			// stop the loop
			break

		// If no user was found
		} else {
			message = "User does not exist.";
		}
	}

	res.send(message);
});

app.get('/home', (req,res) => {

	res.send('Welcome to the homepage');
});

app.get('/users',(req,res) => {

	res.send([{username:'john',password:'1234' }]);
});

app.delete("/delete-user", (req, res) => {
	
	let message;

	// Creates a for loop that will loop through the elements of the "users" array
	for(let i = 0; i < users.length; i++){

		// If the username provided by the client/Post and the username of the current user is the same
		if(req.body.username == users[i].username){
			usernames.splice(users[i].username, 1);

			message = `User ${req.body.username} has been deleted.`;

			console.log(users);

			// stop the loop
			break
	}

	res.send(message);
};


// An if statement is added here to be able to export the following app/server for checking
if(require.main === module){
	app.listen(port, () => console.log(`Server running at port ${port}`));
}

module.exports = app;