import type { NextApiRequest, NextApiResponse } from 'next';
import { getSession } from 'next-auth/client';
import prisma from '../../../lib/prisma';
import {IntegrationCalendar, listCalendars} from "../../../lib/calendarClient";

export default async function handler(req: NextApiRequest, res: NextApiResponse) {
    const session = await getSession({req: req});

    if (!session) {
        res.status(401).json({message: "Not authenticated"});
        return;
    }

    const currentUser = await prisma.user.findFirst({
        where: {
            id: session.user.id,
        },
        select: {
            credentials: true,
            timeZone: true,
            id: true
        }
    });

    if (req.method == "POST") {
        await prisma.selectedCalendar.create({
            data: {
                user: {
                    connect: {
                        id: currentUser.id
                    }
                },
                integration: req.body.integration,
                externalId: req.body.externalId
            }
        });
        res.status(200).json({message: "Calendar Selection Saved"});

    }

    if (req.method == "DELETE") {
        await prisma.selectedCalendar.delete({
            where: {
                userId_integration_externalId: {
                    userId: currentUser.id,
                    externalId: req.body.externalId,
                    integration: req.body.integration
                }
            }
        });

        res.status(200).json({message: "Calendar Selection Saved"});
    }

    if (req.method == "GET") {
        const selectedCalendarIds = await prisma.selectedCalendar.findMany({
            where: {
                userId: currentUser.id
            },
            select: {
                externalId: true
            }
        });

        const calendars: IntegrationCalendar[] = await listCalendars(currentUser.credentials);
        const selectableCalendars = calendars.map(cal => {return {selected: selectedCalendarIds.findIndex(s => s.externalId === cal.externalId) > -1, ...cal}});
        res.status(200).json(selectableCalendars);
    }
}