import short from "short-uuid";
import { v5 } from "uuid";
import { z } from "zod";
import { g as getAppKeysFromSlug } from "./getAppKeysFromSlug-UZbl5tW2.js";
import { o as getUid, D as DailyLocationType } from "./CalEventParser-yX6oM9Dn.js";
import { l as logger, a as safeStringify, p as prisma } from "./i18n-VAwx2uzJ.js";
import { b as getPiiFreeCredential, g as getPiiFreeCalendarEvent } from "./piiFreeData-j9VT_8Gj.js";
import { a3 as sendBrokenIntegrationEmail } from "./email-manager-em79awUz.js";
const dailyAppKeysSchema = z.object({
  api_key: z.string(),
  scale_plan: z.string().default("false")
});
const getDailyAppKeys = async () => {
  const appKeys = await getAppKeysFromSlug("daily-video");
  return dailyAppKeysSchema.parse(appKeys);
};
const VideoApiAdapterMap = process.env.NEXT_PUBLIC_IS_E2E ? {} : {
  dailyvideo: import("./VideoApiAdapter-j6RXNyEO.js"),
  huddle01video: import("./VideoApiAdapter--I5-mcL-.js"),
  jelly: import("./VideoApiAdapter-wmWFlfCw.js"),
  jitsivideo: import("./VideoApiAdapter-HUT3_uv8.js"),
  nextcloudtalk: import("./VideoApiAdapter-mPv2VAXw.js"),
  office365video: import("./VideoApiAdapter-XPPnbLVZ.js"),
  shimmervideo: import("./VideoApiAdapter-Yy9-ZXuP.js"),
  sylapsvideo: import("./VideoApiAdapter-F_MUGiW4.js"),
  tandemvideo: import("./VideoApiAdapter-5VCrpPmv.js"),
  webex: import("./VideoApiAdapter-UPiillft.js"),
  zoomvideo: import("./VideoApiAdapter-MS8O_0Ru.js")
};
const log = logger.getSubLogger({ prefix: ["[lib] videoClient"] });
const translator = short();
const getVideoAdapters = async (withCredentials) => {
  const videoAdapters = [];
  for (const cred of withCredentials) {
    const appName = cred.type.split("_").join("");
    log.silly("Getting video adapter for", safeStringify({ appName, cred: getPiiFreeCredential(cred) }));
    const videoAdapterImport = VideoApiAdapterMap[appName];
    if (!videoAdapterImport) {
      log.error(`Couldn't get adapter for ${appName}`);
      continue;
    }
    const videoAdapterModule = await videoAdapterImport;
    const makeVideoApiAdapter = videoAdapterModule.default;
    if (makeVideoApiAdapter) {
      const videoAdapter = makeVideoApiAdapter(cred);
      videoAdapters.push(videoAdapter);
    } else {
      log.error(`App ${appName} doesn't have a default VideoApiAdapter export`);
    }
  }
  return videoAdapters;
};
const createMeeting = async (credential, calEvent) => {
  const uid = getUid(calEvent);
  log.debug(
    "createMeeting",
    safeStringify({
      credential: getPiiFreeCredential(credential),
      uid,
      calEvent: getPiiFreeCalendarEvent(calEvent)
    })
  );
  if (!credential || !credential.appId) {
    throw new Error(
      "Credentials must be set! Video platforms are optional, so this method shouldn't even be called when no video credentials are set."
    );
  }
  const videoAdapters = await getVideoAdapters([credential]);
  const [firstVideoAdapter] = videoAdapters;
  let createdMeeting;
  let returnObject = {
    appName: credential.appId || "",
    type: credential.type,
    uid,
    originalEvent: calEvent,
    success: false,
    createdEvent: void 0,
    credentialId: credential.id
  };
  try {
    const enabledApp = await prisma.app.findUnique({
      where: {
        slug: credential.appId
      },
      select: {
        enabled: true
      }
    });
    if (!enabledApp?.enabled)
      throw `Location app ${credential.appId} is either disabled or not seeded at all`;
    createdMeeting = await firstVideoAdapter?.createMeeting(calEvent);
    returnObject = { ...returnObject, createdEvent: createdMeeting, success: true };
    log.debug("created Meeting", safeStringify(returnObject));
  } catch (err) {
    await sendBrokenIntegrationEmail(calEvent, "video");
    log.error(
      "createMeeting failed",
      safeStringify(err),
      safeStringify({ calEvent: getPiiFreeCalendarEvent(calEvent) })
    );
    const defaultMeeting = await createMeetingWithCalVideo(calEvent);
    if (defaultMeeting) {
      calEvent.location = DailyLocationType;
    }
    returnObject = { ...returnObject, originalEvent: calEvent, createdEvent: defaultMeeting };
  }
  return returnObject;
};
const updateMeeting = async (credential, calEvent, bookingRef) => {
  const uid = translator.fromUUID(v5(JSON.stringify(calEvent), v5.URL));
  let success = true;
  const [firstVideoAdapter] = await getVideoAdapters([credential]);
  const canCallUpdateMeeting = !!(credential && bookingRef);
  const updatedMeeting = canCallUpdateMeeting ? await firstVideoAdapter?.updateMeeting(bookingRef, calEvent).catch(async (e) => {
    await sendBrokenIntegrationEmail(calEvent, "video");
    log.error("updateMeeting failed", e, calEvent);
    success = false;
    return void 0;
  }) : void 0;
  if (!updatedMeeting) {
    log.error(
      "updateMeeting failed",
      safeStringify({ bookingRef, canCallUpdateMeeting, calEvent, credential })
    );
    return {
      appName: credential.appId || "",
      type: credential.type,
      success,
      uid,
      originalEvent: calEvent
    };
  }
  return {
    appName: credential.appId || "",
    type: credential.type,
    success,
    uid,
    updatedEvent: updatedMeeting,
    originalEvent: calEvent
  };
};
const deleteMeeting = async (credential, uid) => {
  if (credential) {
    const videoAdapter = (await getVideoAdapters([credential]))[0];
    log.debug(
      "Calling deleteMeeting for",
      safeStringify({ credential: getPiiFreeCredential(credential), uid })
    );
    if (videoAdapter) {
      return videoAdapter.deleteMeeting(uid);
    }
  }
  return Promise.resolve({});
};
const createMeetingWithCalVideo = async (calEvent) => {
  let dailyAppKeys;
  try {
    dailyAppKeys = await getDailyAppKeys();
  } catch (e) {
    return;
  }
  const [videoAdapter] = await getVideoAdapters([
    {
      id: 0,
      appId: "daily-video",
      type: "daily_video",
      userId: null,
      user: { email: "" },
      teamId: null,
      key: dailyAppKeys,
      invalid: false,
      delegationCredentialId: null
    }
  ]);
  return videoAdapter?.createMeeting(calEvent);
};
const createInstantMeetingWithCalVideo = async (endTime) => {
  let dailyAppKeys;
  try {
    dailyAppKeys = await getDailyAppKeys();
  } catch (e) {
    return;
  }
  const [videoAdapter] = await getVideoAdapters([
    {
      id: 0,
      appId: "daily-video",
      type: "daily_video",
      userId: null,
      user: { email: "" },
      teamId: null,
      key: dailyAppKeys,
      invalid: false,
      delegationCredentialId: null
    }
  ]);
  return videoAdapter?.createInstantCalVideoRoom?.(endTime);
};
const getRecordingsOfCalVideoByRoomName = async (roomName) => {
  let dailyAppKeys;
  try {
    dailyAppKeys = await getDailyAppKeys();
  } catch (e) {
    console.error("Error: Cal video provider is not installed.");
    return;
  }
  const [videoAdapter] = await getVideoAdapters([
    {
      id: 0,
      appId: "daily-video",
      type: "daily_video",
      userId: null,
      user: { email: "" },
      teamId: null,
      key: dailyAppKeys,
      invalid: false,
      delegationCredentialId: null
    }
  ]);
  return videoAdapter?.getRecordings?.(roomName);
};
const getDownloadLinkOfCalVideoByRecordingId = async (recordingId) => {
  let dailyAppKeys;
  try {
    dailyAppKeys = await getDailyAppKeys();
  } catch (e) {
    console.error("Error: Cal video provider is not installed.");
    return;
  }
  const [videoAdapter] = await getVideoAdapters([
    {
      id: 0,
      appId: "daily-video",
      type: "daily_video",
      userId: null,
      user: { email: "" },
      teamId: null,
      key: dailyAppKeys,
      invalid: false,
      delegationCredentialId: null
    }
  ]);
  return videoAdapter?.getRecordingDownloadLink?.(recordingId);
};
const getAllTranscriptsAccessLinkFromRoomName = async (roomName) => {
  let dailyAppKeys;
  try {
    dailyAppKeys = await getDailyAppKeys();
  } catch (e) {
    console.error("Error: Cal video provider is not installed.");
    return;
  }
  const [videoAdapter] = await getVideoAdapters([
    {
      id: 0,
      appId: "daily-video",
      type: "daily_video",
      userId: null,
      user: { email: "" },
      teamId: null,
      key: dailyAppKeys,
      invalid: false,
      delegationCredentialId: null
    }
  ]);
  return videoAdapter?.getAllTranscriptsAccessLinkFromRoomName?.(roomName);
};
export {
  createInstantMeetingWithCalVideo as a,
  createMeeting as c,
  deleteMeeting as d,
  getDailyAppKeys as g,
  getAllTranscriptsAccessLinkFromRoomName,
  getDownloadLinkOfCalVideoByRecordingId,
  getRecordingsOfCalVideoByRoomName,
  updateMeeting as u
};
