import { resolver } from "blitz";
import { z } from "zod";

import db from "../../../db";
import appLogger from "../../../integrations/logger";
import { enforceSuperAdminIfNotCurrentOrganization, setDefaultOrganizationId } from "../utils";

const logger = appLogger.child({ mutation: "set-notification-subscription" });

const Body = z.object({
	organizationId: z.string().optional(),
	phoneNumberId: z.string(),
	subscription: z.object({
		endpoint: z.string(),
		expirationTime: z.number().nullable(),
		keys: z.object({
			p256dh: z.string(),
			auth: z.string(),
		}),
	}),
});

export default resolver.pipe(
	resolver.zod(Body),
	resolver.authorize(),
	setDefaultOrganizationId,
	enforceSuperAdminIfNotCurrentOrganization,
	async ({ organizationId, phoneNumberId, subscription }) => {
		const phoneNumber = await db.phoneNumber.findFirst({
			where: { id: phoneNumberId, organizationId },
			include: { organization: true },
		});
		if (!phoneNumber) {
			return;
		}

		try {
			await db.notificationSubscription.create({
				data: {
					organizationId,
					phoneNumberId,
					endpoint: subscription.endpoint,
					expirationTime: subscription.expirationTime,
					keys_p256dh: subscription.keys.p256dh,
					keys_auth: subscription.keys.auth,
				},
			});
		} catch (error: any) {
			if (error.code !== "P2002") {
				logger.error(error);
				// we might want to `throw error`;
			}
		}
	},
);
