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

import type { TextComponent } from "../lib";

/**
 * Check if the url is a valid cal.com url
 * @param url
 * @returns boolean
 */
export async function isValidCalURL(url: string) {
  const regex = new RegExp(`^${WEBSITE_URL}/`, `i`);

  const error: TextComponent = {
    type: "text",
    text: `This is not a valid ${WEBSITE_URL.replace("https://", "")} link`,
    style: "error",
    align: "left",
  };

  if (!regex.test(url)) return error;

  const urlWithoutCal = url.replace(regex, "");

  const urlParts = urlWithoutCal.split("/");
  const usernameOrTeamSlug = urlParts[0];
  const eventTypeSlug = urlParts[1];

  if (!usernameOrTeamSlug || !eventTypeSlug) return error;

  // Find all potential users with the given username
  const potentialUsers = await prisma.user.findMany({
    where: {
      username: usernameOrTeamSlug,
    },
    include: {
      eventTypes: {
        where: {
          slug: eventTypeSlug,
          hidden: false,
        },
      },
    },
  });

  // Find all potential teams with the given slug
  const potentialTeams = await prisma.team.findMany({
    where: {
      slug: usernameOrTeamSlug,
    },
    include: {
      eventTypes: {
        where: {
          slug: eventTypeSlug,
          hidden: false,
        },
      },
    },
  });

  // Check if any user has the matching eventTypeSlug
  const matchingUser = potentialUsers.find((user) => user.eventTypes.length > 0);

  // Check if any team has the matching eventTypeSlug
  const matchingTeam = potentialTeams.find((team) => team.eventTypes.length > 0);

  if (!matchingUser && !matchingTeam) return error;

  const userOrTeam = matchingUser || matchingTeam;

  if (!userOrTeam) return error;

  // Retrieve the correct user or team
  const userOrTeamId = userOrTeam.id;

  const eventType = await prisma.eventType.findFirst({
    where: {
      userId: userOrTeamId,
      slug: eventTypeSlug,
      hidden: false,
    },
  });

  if (!eventType) return error;

  return true;
}
