import { z } from "zod";
import type {
  NewPrezziario,
  PrezziarioUpdate,
} from "~/schemas/public/Prezziario";
import TipologiaPosizioneEnum from "~/schemas/public/TipologiaPosizioneEnum";
import {
  adminProcedure,
  createTRPCRouter,
  publicProcedure,
} from "~/server/api/trpc";
import { getPrezziarioByIdHandler } from "~/server/controllers/prezziario.controller";
import { db } from "~/server/db";
import {
  addPrezziario,
  deletePrezziario,
  getPrezziario,
  getPrezziarioByTipologia,
  getPrezziarioConsulenza,
  updatePrezziario,
} from "~/server/services/prezziario.service";
import { zPrezziarioId } from "~/server/utils/zod_types";
// Create a new ratelimiter, that allows 10 requests per 10 seconds
/*
const ratelimit = new RateLimiterHandler({
  maxRequests: 10,
  windowSize: 60,
  analytics: false,
});
*/
export const prezziarioRouter = createTRPCRouter({
  getPrezziario: publicProcedure.query(async () => {
    return await getPrezziario();
  }),
  addPrezziario: adminProcedure
    .input(
      z.object({
        data: z.custom<NewPrezziario>(),
      }),
    )
    .mutation(async ({ input }) => {
      return await addPrezziario({ db, input: input.data });
    }),
  updatePrezziario: adminProcedure
    .input(
      z.object({
        idprezziario: zPrezziarioId,
        data: z.custom<PrezziarioUpdate>(),
      }),
    )
    .mutation(async ({ input }) => {
      return await updatePrezziario({
        db,
        input: input.data,
        prezziarioId: input.idprezziario,
      });
    }),
  deletePrezziario: adminProcedure
    .input(
      z.object({
        idprezziario: zPrezziarioId,
      }),
    )
    .mutation(async ({ input }) => {
      return await deletePrezziario({
        db,
        prezziarioId: input.idprezziario,
      });
    }),

  getPrezziPerTipologiaAll: publicProcedure.query(async () => {
    return {
      transitorio: await getPrezziarioByTipologia({
        db,
        tipologia: TipologiaPosizioneEnum.Transitorio,
      }),
      stabile: await getPrezziarioByTipologia({
        db,
        tipologia: TipologiaPosizioneEnum.Stabile,
      }),
      consulenza: await getPrezziarioConsulenza({
        db,
      }),
    };
  }),
  getPrezziPerTipologia: publicProcedure
    .input(
      z.object({
        tipologia: z.custom<TipologiaPosizioneEnum>(),
      }),
    )
    .query(async ({ input }) => {
      return await getPrezziarioByTipologia({
        db,
        tipologia: input.tipologia,
      });
    }),
  getPrezzoPerServizio: publicProcedure
    .input(z.object({ idprezziario: zPrezziarioId }))
    .query(async ({ input }) => {
      return await getPrezziarioByIdHandler({ db, input });
    }),
});
