/* eslint-disable @typescript-eslint/no-explicit-any */
"use server";
import { prisma, PrismaClient } from "@repo/db";

export async function getData(
	model: keyof PrismaClient,
	limit: number,
	offset: number,
	searchTerm: string,
	searchFields: string[],
	filter?: Record<string, any>,
	include?: Record<string, boolean>,
	orderBy?: Record<string, "asc" | "desc">,
) {
	if (!model || !prisma[model]) {
		return { data: [], total: 0 };
	}

	const formattedId = searchTerm.match(/^VAR(\d+)$/)?.[1];

	const where = searchTerm
		? {
				OR: [
					formattedId ? { id: formattedId } : undefined,
					...searchFields.map((field) => ({
						[field]: { contains: searchTerm },
					})),
				].filter(Boolean),
				...filter,
			}
		: { ...filter };

	if (!prisma[model]) {
		return { data: [], total: 0 };
	}

	const data = await (prisma[model] as any).findMany({
		where,
		orderBy,
		take: limit,
		skip: offset,
		include,
	});

	const total = await (prisma[model] as any).count({ where });

	return { data, total };
}
