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

import { WEBSITE_URL } from "@calcom/lib/constants";
import prisma from "@calcom/prisma";

import type {
  NewCanvas,
  ListComponent,
  ListItem,
  SpacerComponent,
  TextComponent,
  InputComponent,
} from "../lib";
import { isValidCalURL } from "../lib/isValidCalURL";

export default async function handler(req: NextApiRequest, res: NextApiResponse) {
  const { admin, input_values, component_id } = req.body;

  let isValid: boolean | TextComponent = true;
  if (component_id || input_values?.submit_booking_url) {
    const url = component_id === "submit_booking_url" ? input_values?.submit_booking_url : component_id;
    isValid = await isValidCalURL(url);

    if (isValid === true) return res.status(200).json({ results: { submit_booking_url: url } });
  }

  const input: InputComponent = {
    type: "input",
    id: "submit_booking_url",
    label: "Enter your Cal.com link",
    placeholder: "https://cal.com/valentinchmara/30min",
    save_state: "unsaved",
    action: {
      type: "submit",
    },
    aria_label: "Enter your Cal.com link",
  };

  const defaultCanvasData: NewCanvas = {
    canvas: {
      content: {
        components: isValid === true ? [input] : [isValid, input],
      },
    },
  };

  if (!admin?.id) return res.status(200).json(defaultCanvasData);

  const credential = await prisma.credential.findFirst({
    where: {
      appId: "intercom",
      key: {
        string_contains: admin.id,
      },
    },
  });

  if (!credential) return res.status(200).json(defaultCanvasData);

  const team = credential.teamId
    ? await prisma.team.findUnique({
        where: {
          id: credential.teamId,
        },
      })
    : null;

  const userId = credential.userId;

  const user = userId
    ? await prisma.user.findUnique({
        where: {
          id: userId,
        },
      })
    : null;

  const eventTypes = await prisma.eventType.findMany({
    where: {
      userId,
      hidden: false,
    },
  });

  if (!eventTypes) return res.status(200).json(defaultCanvasData);
  if (!user && !team) return res.status(200).json(defaultCanvasData);

  const list: ListItem[] = eventTypes.map((eventType) => {
    let slug;
    if (team && team.slug) {
      slug = `team/${team.slug}`;
    } else if (user && user.username) {
      slug = user.username;
    }

    return {
      id: `${WEBSITE_URL}/${slug}/${eventType.slug}`,
      type: "item",
      title: eventType.title,
      subtitle: `${slug}/${eventType.slug}`,
      rounded_image: false,
      disabled: false,
      action: {
        type: "submit",
      },
    };
  });

  const components: ListComponent = {
    type: "list",
    items: list,
  };

  const spacer: SpacerComponent = {
    type: "spacer",
    size: "m",
  };

  const text: TextComponent = {
    type: "text",
    text: "Or choose another Cal.com link:",
    style: "muted",
    align: "left",
  };

  const canvasData: NewCanvas = {
    canvas: {
      content: {
        components:
          isValid === true ? [components, spacer, text, input] : [components, spacer, text, input, isValid],
      },
    },
  };

  return res.status(200).json(canvasData);
}
