import { Request, Response, Router } from "express";
import {
    createProject,
    deleteProject,
    getProject,
    listProjects,
    patchProject,
    regenerateKey,
} from "@controller/projects";
import { sendError, validateSchema } from "@utils/error";
import { patchProjectValidation, projectCreationValidation } from "./validations/project";

const app: Router = Router();

app.get("/list", async (req: Request, res: Response) => {
    res.json(await listProjects(String(req.user?._id)));
});

app.get("/:id", async (req: Request, res: Response) => {
    const request = await getProject(req.params.id, String(req.user?._id));
    if ("code" in request) return res.json(request);

    res.json(request);
});

app.put("/", async (req: Request, res: Response) => {
    if (validateSchema(res, projectCreationValidation, req.body)) return;

    const creationError = await createProject(req.body.name, String(req.user?._id));
    if (creationError) return res.json(creationError);

    res.json({ message: "Your project has been successfully created" });
});

app.delete("/:id", async (req: Request, res: Response) => {
    const deletionError = await deleteProject(req.params.id, String(req.user?._id));
    if (deletionError) return res.json(deletionError);

    res.json({ message: "The project has been successfully deleted" });
});

app.patch("/:id", async (req: Request, res: Response) => {
    if (validateSchema(res, patchProjectValidation, req.body)) return;

    if (Object.keys(req.body).length === 0)
        return sendError(res, 400, 4, "You need to provide at least one field to update");

    const patchError = await patchProject(req.params.id, String(req.user?._id), req.body);
    if (patchError) return res.json(patchError);

    res.json({ message: "The project has been successfully updated" });
});

app.post("/:id/regenerate", async (req: Request, res: Response) => {
    const tokenError = await regenerateKey(req.params.id, String(req.user?._id));
    if (tokenError) return res.json(tokenError);

    res.json({ message: "The validation key has been regenerated" });
});

export default app;