import type { NextApiRequest, NextApiResponse } from "next";

import { listOOOEntries } from "@calcom/features/webhooks/lib/scheduleTrigger";
import { defaultHandler, defaultResponder } from "@calcom/lib/server";
import { WebhookTriggerEvents } from "@calcom/prisma/enums";

import { validateAccountOrApiKey } from "../../lib/validateAccountOrApiKey";

export const selectOOOEntries = {
  id: true,
  start: true,
  end: true,
  createdAt: true,
  updatedAt: true,
  notes: true,
  reason: {
    select: {
      reason: true,
      emoji: true,
    },
  },
  reasonId: true,
  user: {
    select: {
      id: true,
      name: true,
      email: true,
      timeZone: true,
    },
  },
  toUser: {
    select: {
      id: true,
      name: true,
      email: true,
      timeZone: true,
    },
  },
  uuid: true,
};

async function handler(req: NextApiRequest, res: NextApiResponse) {
  const { account: authorizedAccount, appApiKey: validKey } = await validateAccountOrApiKey(req, [
    "READ_PROFILE",
  ]);
  if (!authorizedAccount && !validKey) {
    res.status(401).json({ message: "Unauthorized" });
    return;
  }
  const oooEntries = await listOOOEntries(validKey, authorizedAccount);

  if (!oooEntries) {
    res.status(500).json({ message: "Unable to get out of office entries list." });
    return;
  }
  if (oooEntries.length === 0) {
    res.status(200).json([]);
    return;
  }
  // Wrap entries in metadata object
  const response = oooEntries.map((oooEntry) => {
    return {
      createdAt: oooEntry.createdAt,
      triggerEvent: WebhookTriggerEvents.OOO_CREATED,
      payload: {
        oooEntry,
      },
    };
  });
  res.status(200).json(response);
  return;
}

export default defaultHandler({
  GET: Promise.resolve({ default: defaultResponder(handler) }),
});
