import { z } from "zod/v4";
import type {
	NewPrezziario,
	PrezziarioUpdate,
} from "~/schemas/public/Prezziario";
import TipologiaPosizioneEnum from "~/schemas/public/TipologiaPosizioneEnum";
import {
	adminProcedure,
	createTRPCRouter,
	publicProcedure,
} from "~/server/api/trpc";

import { db } from "~/server/db";
import {
	addPrezziario,
	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({
	addPrezziario: adminProcedure
		.input(
			z.object({
				data: z.custom<NewPrezziario>(),
			}),
		)
		.mutation(async ({ input }) => {
			return await addPrezziario({ db, input: input.data });
		}),
	getPrezziario: publicProcedure.query(async () => {
		return await getPrezziario();
	}),
	getPrezziPerTipologia: publicProcedure
		.input(
			z.object({
				tipologia: z.custom<TipologiaPosizioneEnum>(),
			}),
		)
		.query(async ({ input }) => {
			return await getPrezziarioByTipologia({
				db,
				tipologia: input.tipologia,
			});
		}),

	getPrezziPerTipologiaAll: publicProcedure.query(async () => {
		return {
			consulenza: await getPrezziarioConsulenza({
				db,
			}),
			stabile: await getPrezziarioByTipologia({
				db,
				tipologia: TipologiaPosizioneEnum.Stabile,
			}),
			transitorio: await getPrezziarioByTipologia({
				db,
				tipologia: TipologiaPosizioneEnum.Transitorio,
			}),
		};
	}),

	updatePrezziario: adminProcedure
		.input(
			z.object({
				data: z.custom<PrezziarioUpdate>(),
				idprezziario: zPrezziarioId,
			}),
		)
		.mutation(async ({ input }) => {
			return await updatePrezziario({
				db,
				input: input.data,
				prezziarioId: input.idprezziario,
			});
		}),
});
