//importing the dotenv package (secret file), configuring dotenv for our project
//dotenv, secret file, people cant read
import dotenv from "dotenv";
dotenv.config({ path: `${__dirname}/../.env` });

//Variable declaration

//we named express as a variable name, usually name same as imported package
//express: designed to easily make a web server
import express, { Application, Request, Response } from "express";

//bodyParser: sending form action to my server, wrap the user's data in "body" to my server, and my server is unwrapping it
import bodyParser from "body-parser";
import fs from "fs";
import path from "path";

const filePath: string = "todolist.txt";

//initializing the express web server, everything in express, we want to put in app
const app: Application = express();
const port: Number = parseInt(process.env.PORT as string) || 3000;

// Middleware
//unwrap the words
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

//Actual Express Code
//Routes Definition
//if send text then res.send, send file: res.sendFile

//to make icon files, because icon files are always downloaded
app.use(express.static(`${__dirname}/../public`));

app.get(`/`, (_req: Request, res: Response): void => {
	res.sendFile(path.join(__dirname, "../public/html/index.html"));
});

app.post("/form-action", (req: Request, res: Response): void => {
	const todo = req.body.todo;

	// use fs to add the item to the file

	fs.appendFile(filePath, "\n" + todo, (err) => {
		if (err) {
			console.log(err);
			res.send("Hey there is an error.");
		} else {
			res.redirect("/");
		}
	});
});

app.get("/get-todos", (_req: Request, res: Response): void => {
	//Using the fs module to read the file
	fs.readFile(
		filePath,
		"utf-8",
		(err: NodeJS.ErrnoException | null, data: string) => {
			if (err) {
				console.log(err);
				res.send("An error occured.");
			} else {
				//Return the file contents as a response of each list item data.split
				//Send the response back to the client as a json object res.json
				res.json(data.split("\n").filter((data) => data.trim() !== ""));
			}
		}
	);
});

app.delete("/delete-todo", (req: Request, res: Response): void => {
	const todoToDelete = (req.body.todo || "").trim(); // Ensure input is trimmed

	if (!todoToDelete) {
		res.status(400).json({ error: "No to-do item provided to delete" });
		return;
	}

	// Read the file to get the current list of todos
	fs.readFile(filePath, "utf8", (err, data) => {
		if (err) {
			console.error("Error reading file:", err);
			res.status(500).json({ error: "Internal Server Error" });
			return;
		}

		// Split the content into lines and trim whitespace from each line
		const todos = data
			.split("\n")
			.map((line) => line.trim())
			.filter((line) => line !== ""); // Remove empty lines

		// Filter out the todo item to delete
		const updatedTodos = todos.filter((todo) => todo !== todoToDelete);

		if (todos.length === updatedTodos.length) {
			res.status(404).json({ error: "Todo not found" });
			return;
		}

		// Join the updated list back into a string
		const updatedContent = updatedTodos.join("\n");

		// Write the updated content back to the file
		fs.writeFile(filePath, updatedContent, "utf8", (writeErr) => {
			if (writeErr) {
				console.error("Error writing file:", writeErr);
				res.status(500).json({ error: "Internal Server Error" });
				return;
			}

			console.log(`Deleted todo: ${todoToDelete}`);
			res.status(200).json({ message: "Todo deleted successfully" });
		});
	});
});

// slash'/' is the home page, /about is the about page
//get, post, put, delete

app.listen(port, () => {
	console.log(`Server is running on http://localhost:${port}`);
});
