import { TRPCError } from "@trpc/server";
import SuperJSON from "superjson";
import { z } from "zod";

import { eq } from "@homarr/db";
import { boards, items } from "@homarr/db/schema";

import { createTRPCRouter, protectedProcedure } from "../../trpc";
import { throwIfActionForbiddenAsync } from "../board/board-access";

export const notebookRouter = createTRPCRouter({
  updateContent: protectedProcedure
    .input(
      z.object({
        itemId: z.string(),
        content: z.string(),
        boardId: z.string(),
      }),
    )
    .mutation(async ({ ctx, input }) => {
      await throwIfActionForbiddenAsync(ctx, eq(boards.id, input.boardId), "modify");

      const item = await ctx.db.query.items.findFirst({
        where: eq(items.id, input.itemId),
      });

      if (!item || item.boardId !== input.boardId) {
        throw new TRPCError({
          code: "NOT_FOUND",
          message: "Specified item was not found",
        });
      }

      const options = SuperJSON.parse<{ content: string }>(item.options);
      options.content = input.content;
      await ctx.db
        .update(items)
        .set({ options: SuperJSON.stringify(options) })
        .where(eq(items.id, input.itemId));
    }),
});
