import { z } from "zod";

import { TRPCError } from "@trpc/server";
import { createTRPCRouter, protectedProcedure } from "~/server/api/trpc";
import type { Prisma } from "@prisma/client";

export const productRouter = createTRPCRouter({
  getProducts: protectedProcedure.query(async ({ ctx }) => {
    const products = await ctx.prisma.product.findMany({
      include: {
        category: true,
      },
    });
    return {
      products,
    };
  }),
  addProduct: protectedProcedure
    .input(
      z.object({
        barcode: z.string().nullish(),
        name: z.string(),
        category_id: z.number(),
        cost: z.number(),
        price: z.number(),
      })
    )
    .mutation(async ({ ctx, input }) => {
      const { category_id, ...productWithoutRelations } = input;
      const product: Prisma.ProductCreateInput = {
        ...productWithoutRelations,
        category: { connect: { id: input.category_id } },
        user: { connect: { id: ctx.session.user.id } },
      };

      const createProduct = await ctx.prisma.product.create({
        data: product,
      });
      return createProduct;
    }),
  updateProduct: protectedProcedure
    .input(
      z.object({
        id: z.number(),
        barcode: z.string().nullish(),
        name: z.string(),
        category_id: z.number(),
        cost: z.number(),
        price: z.number(),
      })
    )
    .mutation(async ({ ctx, input }) => {
      const { id, category_id, ...productWithoutId } = input;
      const product: Prisma.ProductUpdateInput = {
        ...productWithoutId,
        category: { connect: { id: category_id } },
        user: { connect: { id: ctx.session.user.id } },
      };

      const updateProduct = await ctx.prisma.product.update({
        data: product,
        where: {
          id,
        },
      });
      return updateProduct;
    }),
  deleteProduct: protectedProcedure
    .input(
      z.object({
        product_id: z.number(),
      })
    )
    .mutation(async ({ ctx, input }) => {
      const anySale = await ctx.prisma.saleItem.findFirst({
        where: {
          product_id: input.product_id,
        },
      });
      if (anySale === null) {
        const deleteProduct = await ctx.prisma.product.delete({
          where: {
            id: input.product_id,
          },
        });
      } else {
        throw new TRPCError({
          code: "BAD_REQUEST",
          message:
            "Existem vendas efetuadas com este produto, não é possível excluí-lo.",
        });
      }
    }),
});
