import { eq } from "drizzle-orm";
import { type Response, Router } from "express";
import z from "zod";
import { db } from "../db/db.controller.js";
import { notifications } from "../db/schema/notifications.schema.js";
import { requirePermission } from "../middleware/auth.requiredPerms.middleware.js";
import { apiReturn } from "../utils/returnHelper.utils.js";
import { tryCatch } from "../utils/trycatch.utils.js";
import { modifiedNotification } from "./notification.controller.js";

const r = Router();

const updateNote = z.object({
	description: z.string().optional(),
	active: z.boolean().optional(),
	interval: z.string().optional(),
	options: z.array(z.record(z.string(), z.unknown())).optional(),
});

r.patch(
	"/:id",
	requirePermission({ notifications: ["update"] }),
	async (req, res: Response) => {
		const { id } = req.params;
		try {
			const validated = updateNote.parse(req.body);

			const { data: nName, error: nError } = await tryCatch(
				db
					.update(notifications)
					.set(validated)
					.where(eq(notifications.id, id as string))
					.returning(),
			);

			await modifiedNotification(id as string);

			if (nError) {

				return apiReturn(res, {
					success: false,
					level: "error",
					module: "notification",
					subModule: "update",
					message: `There was an error getting the notifications `,
					data: [nError],
					status: 400,
				});
			}

			return apiReturn(res, {
				success: true,
				level: "info",
				module: "notification",
				subModule: "update",
				message: `Notification was updated`,
				data: nName ?? [],
				status: 200,
			});
		} catch (err) {

			if (err instanceof z.ZodError) {
				const flattened = z.flattenError(err);
				// return res.status(400).json({
				// 	error: "Validation failed",
				// 	details: flattened,
				// });

				return apiReturn(res, {
					success: false,
					level: "error", //connect.success ? "info" : "error",
					module: "routes",
					subModule: "notification",
					message: "Validation failed",
					data: [flattened.fieldErrors],
					status: 400, //connect.success ? 200 : 400,
				});
			}
		}
	},
);
export default r;
