import { TRPCError } from "@trpc/server";
import type { ChatsChatid } from "~/schemas/public/Chats";
import type { EtichetteIdEtichetta } from "~/schemas/public/Etichette";
import type { Querier } from "~/server/db";

export const getAllEtichette = async ({ db }: { db: Querier }) => {
	try {
		return await db.selectFrom("etichette").selectAll().execute();
	} catch (e) {
		throw new TRPCError({
			code: "INTERNAL_SERVER_ERROR",
			message: `Errore recupero etichette: ${(e as Error).message}`,
		});
	}
};
export const addEtichetta = async ({
	db,
	title,

	color_hex,
}: {
	db: Querier;
	title: string;
	color_hex: string;
}) => {
	try {
		return await db
			.insertInto("etichette")
			.returning("id_etichetta")
			.values({ color_hex, title })
			.execute();
	} catch (e) {
		throw new TRPCError({
			code: "INTERNAL_SERVER_ERROR",
			message: `Errore aggiunta etichetta: ${(e as Error).message}`,
		});
	}
};

export const updateEtichetta = async ({
	db,
	etichettaid,
	title,
	color_hex,
}: {
	db: Querier;
	etichettaid: EtichetteIdEtichetta;
	title: string;
	color_hex: string;
}) => {
	try {
		return await db
			.updateTable("etichette")
			.returning("id_etichetta")
			.set({ color_hex, title })
			.where("id_etichetta", "=", etichettaid)
			.execute();
	} catch (e) {
		throw new TRPCError({
			code: "INTERNAL_SERVER_ERROR",
			message: `Errore aggiornamento etichetta: ${(e as Error).message}`,
		});
	}
};

export const removeEtichetta = async ({
	db,
	etichettaid,
}: {
	db: Querier;
	etichettaid: EtichetteIdEtichetta;
}) => {
	try {
		await db
			.deleteFrom("etichette")
			.where("id_etichetta", "=", etichettaid)
			.execute();
		return "ok";
	} catch (e) {
		throw new TRPCError({
			code: "INTERNAL_SERVER_ERROR",
			message: `Errore rimozione etichetta: ${(e as Error).message}`,
		});
	}
};

export const getChatEtichette = async ({
	db,
	chatid,
}: {
	db: Querier;
	chatid: ChatsChatid;
}) => {
	try {
		return await db
			.selectFrom("etichette")
			.innerJoin(
				"chats_etichette",
				"etichette.id_etichetta",
				"chats_etichette.etichettaid",
			)
			.where("chats_etichette.chatid", "=", chatid)
			.select([
				"etichette.id_etichetta",
				"etichette.title",
				"etichette.color_hex",
			])
			.execute();
	} catch (e) {
		throw new TRPCError({
			code: "INTERNAL_SERVER_ERROR",
			message: `Errore recupero etichette: ${(e as Error).message}`,
		});
	}
};

export const addChatEtichette = async ({
	db,
	chatid,
	etichettaid,
}: {
	db: Querier;
	chatid: ChatsChatid;
	etichettaid: EtichetteIdEtichetta;
}) => {
	try {
		return await db
			.insertInto("chats_etichette")
			.returning("chatid")
			.values({ chatid, etichettaid })
			.onConflict((oc) => oc.columns(["chatid", "etichettaid"]).doNothing())
			.execute();
	} catch (e) {
		throw new TRPCError({
			code: "INTERNAL_SERVER_ERROR",
			message: `Errore aggiunta etichetta: ${(e as Error).message}`,
		});
	}
};

export const removeChatEtichette = async ({
	db,
	chatid,
	etichettaid,
}: {
	db: Querier;
	chatid: ChatsChatid;
	etichettaid: EtichetteIdEtichetta;
}) => {
	try {
		await db
			.deleteFrom("chats_etichette")
			.where("chatid", "=", chatid)
			.where("etichettaid", "=", etichettaid)
			.execute();
		return "ok";
	} catch (e) {
		throw new TRPCError({
			code: "INTERNAL_SERVER_ERROR",
			message: `Errore rimozione etichetta: ${(e as Error).message}`,
		});
	}
};
